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にあるスクリプトが正常実行できれば成功!!

anacondaを使ってubuntu16.04にchainer, openCVを導入する

導入のきっかけ

これまでpyenv,python2.7を使って開発を行っていたが、python3系が必須のライブラリを使用する必要があり、anacondaに乗り換え。
使ってみると、複数のpython環境を乗り換えることができ、pyenvよりも便利かも。
他でもいろいろ書かれているが、メモがてら作業内容を残しておく。
(ネットで見たコマンドをそのまま打つと、opencvのインストールあたりでこける)

導入方法

anacondaのダウンロード

以下からanacondaをダウンロードし、chmod 775 → bash ***でインストール。
今回はpython3系64bit版を導入した。
Download Anaconda Now! | Continuum

仮想環境の作成

python3.5ではopencvがうまく導入できなかったので、python3.4系で仮想環境を作る。

conda create -n py34 python=3.4 anaconda

# このコマンドで仮想環境に入る
source activate py34

# 仮想環境から出たいときはこれ
source deactivate

opencv,chainerの導入

仮想環境に入った状態で、chainer,opencvを入れる

# chainerの導入
pip install chainer

# opencvの導入
conda install -c https://conda.binstar.org/jjhelmus opencv

動作確認

ターミナルで以下の通り打ってエラーが出なければ成功。

$ python
import chainer
import cupy# cudaを使用する場合
import cv2
import numpy

nvidiaドライバを入れたubuntuにVNC接続する際に一部のプログラムが起動しない(segmentation fault)場合の解決策

概要

タイトルのとおり、nvidiaドライバを入れたubuntuサーバーに対して、VNC接続をすると、一部のプログラムが起動しない問題が発生したので、原因とその解決方法を記載する。

環境

Ubuntu16.04(サーバー側)
vncにてmateのdesktop環境を使用しログイン
chainerを実行するため、nvidiaドライバ、cuda等をインストール済み

t-nkb.hatenablog.com

状況

vncリモートログイン環境において、firefoxは起動しないけれど、chromeは起動する。
iBusも起動しないため、日本語入力もできない・・・・という変な状況。

解決方法

このサイトの解決方法が役に立った。
VNC Segmentation Fault on Ubuntu 16.04/Linux Mint 18 - Imaging and a little bit of OSS

私の場合は以下の通りのコマンドを打つことで解決した。
上記サイトにも記載があるが、/usr/lib/直下のnvidia***フォルダを見て、nvidia-375..以降を適宜変更する必要がある模様。

sudo ln -s /usr/lib/nvidia-375/libGLX_nvidia.so.375.39 /usr/lib/x86_64-linux-gnu/libGLX_indirect.so.0

ubuntu16.04でkubuntuをインストールしようとするとエラーが出る→その後の対処法

kubuntuの導入失敗

unityから脱却しようかと思い、ubuntu16.04にkubuntuを入れようとしてみた。
ネットで調べると、

$ sudo apt-get install kubuntu-desktop

とすれば一発でインストールできるとの事だったので実行してみると途中までうまく行き・・・・
configureing gdmという画面でデフォルトのgdmを選べと言われるので、gdm3を選択。
その後再びインストール画面が続き、うまく行くかと思いきや、途中で致命的なエラーが出てインストールが終了!!!
おいおいこれ大丈夫か??と再起動してみると案の定、デスクトップ画面に行く前にフリーズしてしまい、GUIは全く使えない状態に・・・・。

まずはkubuntuを消す

まずはkubuntuを消そうと思い、外部からSSHでログインし、aptコマンドを実行すると、これすら

The following packages have unmet dependencies:
 kde-telepathy-minimal : Depends: kde-config-telepathy-accounts (>= 15.04.0) but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

とエラーが出てしまい実行できず。
言われたとおりに、

$ sudo apt-get dist-upgrade -f

を実行してみても解決されず、
おいおいマジかよ・・・。

落ち着いて海外のフォーラムで事例を探すと、同様の事例で困っている人がいたので、これを頼りにdebファイルを上書きしてから、再度dist-upgradeすることで、とりあえずエラーは解決。

#解決した対処方法
$ sudo dpkg -i --force-overwrite  /var/cache/apt/archives/kde-config-telepathy-accounts_4%3a15.12.3-0ubuntu1_amd64.deb
$ sudo apt-get dist-upgrade -f

(参考)
askubuntu.com

次にデフォルトで起動するデスクトップをunityに戻す

kubuntuは諦めて、とりあえず現状復帰を目指します・・・・。
念の為、

$ service --status-all

として、gdm3のサービスが[+](起動中)となっていて、lightdmのサービスが[-](停止中)となっていることを確認する。
なるほど、これを逆にすればいいわけね・・・。ということで、以下のコマンドで元に戻す。

sudo dpkg-reconfigure lightdm #gdmの切り替え
sudo reboot #再起動

あとは再起動後、serviceを確認し、gdm3のサービスが[-](停止中)となっていて、lightdmのサービスが[+](起動中)となっていればOK、無事GUIログインできるはず!


・・・あぁ、ちょっと試してみようと思ったら思わぬ時間の浪費をしてしまった。

cv2で動画読み込み時にerror: (-215) size.width>0 && size.height>0というエラーが出る場合の対処法(Windows)

概要

ネット上でよく見るWindowsへのcv2導入方法に従ってcv2を導入すると、動画読み込み時(cv2.videoCapture()使用時)に"error: (-215) size.width>0 && size.height>0"というエラーが出てくる。
これはffmpegのDLLがないため、動画が開けずに出てくるエラーだが、一見すると何を言っているのかわからない点が厄介。
このエラーにしばらく苦しんだので、解決方法を記しておく。

解決方法

よくあるWindowsへのcv2導入方法を見ると、

1.OpenCV2.4.1等をダウンロード
2.C:/opencv/build/python/2.7/x64の cv2.pydをC:/Python27/lib/site-packegesにコピー
(anacondaで導入している場合はC:/anaconda/lib/python27/site-packages等)

と、ここまでしか手順が書いていない場合がある。

確かにこれでもcv2がインポートできて使用できるのだが、掲題のエラーが出て動画読み込み時にエラーになってしまう。
これでは片手落ちだ・・・ということで、以下の通りffmpegのdllをコピーしてあげる。

3.opencv/build内にあるopencv_ffmpeg310.dllも一緒に2のフォルダにコピー

これで正常にファイルが読み込めるようになるはず。
opencv_ffmpeg310.dllが見つからない場合は、適当にドライブ内を検索してやればOK。

sshfs中に通信が切れた場合の対処法

sshfsの問題点

機械学習を行う際、基本的に自宅サーバーのフォルダをsshfsでマウントして、作業を行っている。

t-nkb.hatenablog.com


しかし、アンマウントを忘れて通信を切断、スリープしてしまうとマウントポイントが残ったままとなり、以降このディレクトリにアクセスできなくなる。
当然、この状態になると、再度sshfsでマウントしようとしても以下のエラーが出て、マウントできない。

例えばmacだとこんな感じでエラーが出る。

mount_osxfuse: mount point (マウント先リンク) is itself on a OSXFUSE volume
fuse: failed to mount file system: Invalid argument

解決策(接続時に自動で強制アンマウントさせる)

そこで、エラーが出たマウント先を強制的にアンマウントし、再度接続してあげる。

umount -f (マウント先ディレクトリ)

以下のようにエイリアス作っちゃうと便利。

alias sshfs2="umount -f (マウント先ディレックトリ);(マウント元アドレス):(マウント元ディレクトリ) (マウント先ディレクトリ)"

linux screen中にマウスホイールでスクロールする方法

sshが切れても学習が継続できるよう、最近はscreenを使って学習をすすめることが多い。
携帯からでも気軽に途中経過見えるし。
しかし、screenの画面はスクロール等が実行できず、過去のログを閲覧することができない。

t-nkb.hatenablog.com

困って検索したところ、以下のように設定を変更することで、マウスホイールで過去ログが見られるようになった。
これは便利!

$ sudo emacs ~/.screenrc

以下を追記(最初は新規作成)
ついでにスクロールバッファ行も増やしておく。

termcapinfo xterm* ti@:te@
defscrollback 100000

screenを再起動
screenが初期化されるので、作業中の場合注意。

$ reset

再開時は画面に表示されている分しか履歴が表示されず、スクロールしても過去ログの部分は空白になってしまうため、都度以下を行う必要がある。
これで読み込んでしまえば、読み込んだ部分は編集モードに遷移しなくとも参照可能。

・一旦、ctrl + a,escとして編集画面に遷移
・⬆️ボタン長押しで過去のログを読み込み
・escキーを押して元のモードに遷移