pythonを使って、ether(LAN)経由で測域センサURGのデータを取得する方法(ROS不使用)

概要

シンプルなプログラムを動かしたいとき一々ROSに頼るのは面倒。よって、ROSを使わなくともURGデータを読み込めるようにした。
ネットを探してもシリアル通信を使ったデータ取得ライブラリばかりでetherを使ったライブラリが殆ど無い。
ようやく見つけても、バグがあって動作しない・・・・という現状なので、作業記録を以下に残す。

pythonでURGデータ取得したい人は多そうなのに、ネットに情報がないなんて不思議。
 みんなROS使うから、こんなことやらないのかなぁ・・・・?

pythonを使ったURG読み込みライブラリ

いろいろ探した結果、これが一番使えそうなライブラリだった。
北陽電機製UST-10LX, UST-20LX, UST-30LXに対応しており、ether経由でデータ取得できるようになっている。

GitHub - SkRobo/hokuyolx: A Python module for Hokuyo laser scanners (UST-10LX, UST-20LX, UST-30LX)

が、使ってみるとエラーで動かない!!
おいおい・・・ということで、以下修正箇所(2箇所)を記載する。

URGステータスの追加

URGは、正常時に"00"のステータスが返って来るようになっている。
しかし、このライブラリでは"00"ステータスが登録されておらず、正常動作しているにもかかわらず、「"00"という変なメッセージを見つけました!!」と言ってプログラムが停止する。
なんでや・・・・。ということで、ステータスに正常モードを追加してやる。

hokuyolx/statuses.pyの13行目から

(was)
laser_states = {
    '000': 'Standby state',
    '100': 'From standby to unstable state',
    '001': 'Booting state',
    '002': 'Time adjustment state',
    '102': 'From time adjustment to unstable state',
    '003': 'Single scan state',
    '103': 'From single scan to unstable state',
    '004': 'Multi scan state',
    '104': 'From multi scan to unstable state',
    '005': 'Sleep state',
    '006': 'Waking-up state (Recovering from sleep state)',
    '900': 'Error detected state',
}

(IS)
laser_states = {
    '000': 'Standby state',
    '100': 'From standby to unstable state',
    '001': 'Booting state',
    '002': 'Time adjustment state',
    '102': 'From time adjustment to unstable state',
    '003': 'Single scan state',
    '103': 'From single scan to unstable state',
    '004': 'Multi scan state',
    '104': 'From multi scan to unstable state',
    '005': 'Sleep state',
    '006': 'Waking-up state (Recovering from sleep state)',
    '900': 'Error detected state',
    '00': 'Normal' #追加!
}

IPアドレス指定時のチェックサムのバグ回避

デフォルトでは、addr = ('192.168.0.10', 10940)が設定されており、IPを変更しなければこのまま使用可能。
しかし、IPアドレスを変更するとライブラリのチェックサムに引っかかってしまってプログラムが終了する。
チェックサムなんて必要ないんや!!ということで、チェックサムを検出している部分をコメントアウト

hokuyolx/hokuyo.pyの91行から

(WAS)
if calc_sum != conv_sum:
    raise HokuyoChecksumMismatch(
        'For message %s sum mismatch: %s vs %s' %
(decode(conv_msg, 'ascii'), calc_sum, cc))


(IS)
#if calc_sum != conv_sum:
#    raise HokuyoChecksumMismatch(
#        'For message %s sum mismatch: %s vs %s' %
#(decode(conv_msg, 'ascii'), calc_sum, cc))

ライブラリ導入方法

ソースをいじってしまっているので、pipではもちろん導入できない。
上記ライブラリをGitCloneして、ソースを修正し、

python ./setup.py install

とすることで、ライブラリを導入できる。
あとは、examplesにあるスクリプトが正常実行できれば成功!!