======使い方====== - まずssm-coodinatorを起動する。 - 次にセンサ用のドライバプログラムを起動する。 - それらのデータを利用するプログラムを起動する。 - 気になったらlsssm等で登録されているセンサを確認する。 - 詳細は「ユーティリティプログラム」の項を参照。 [[http://www.roboken.iit.tsukuba.ac.jp/platform/man/ssm/|Doxygenにより生成されたマニュアル]] =====動作テスト===== サンプルプログラムを使って、動作テストします。 まず、ターミナルを起動し、ssm情報を管理するssm-coordinatorを立ち上げます。 $ ssm-coordinator 別ターミナルでSSMサンプルを実行し、共有メモリにデータを書き込みます。 $ cd ssm-【ダウンロードされたssmのバージョン】/samples/Cpp_Samle/ $ ./ssmWriteSample 別ターミナルでSSMサンプルを実効し、共有メモリからデータを読み込みます。 $ cd ssm-【ダウンロードされたssmのバージョン】/samples/Cpp_Samle/ $ ./ssmReadSample このプログラムを参考にプログラミングして下さい。 ===== ユーティリティプログラム ====== ==== ssm-coordinator ==== SSMのメインプログラム $ ssm-coordinator これを起動してから他のプログラムを立ち上げる。 ==== lsssm ==== SSMに登録されているセンサの情報を表示。 SSMに正しく登録できているかこれで確認。 $ lsssm No. | stream name | suid | size[B] | num | cycle[s] | property[B] | ---|----------------|------|---------|-------|----------|-------------| 000 | spur_adjust | 0 | 40.00 | 239 | 0.005 | 0.00 001 | spur_global | 0 | 40.00 | 1199 | 0.005 | 0.00 002 | spur_odometry | 0 | 40.00 | 1199 | 0.005 | 0.00 003 | pws_motor | 0 | 16.00 | 239 | 0.005 | 0.00 004 | scan_data2d | 2 | 19.73k | 239 | 0.025 | 740.00 005 | scan_data2d | 1 | 26.27k | 239 | 0.025 | 740.00 006 | sokuiki_fs | 1 | 56.27k | 48 | 0.025 | 740.00 007 | sokuiki_fs | 2 | 42.26k | 48 | 0.025 | 740.00 008 | sokuiki_bs | 2 | 42.26k | 240 | 0.025 | 740.00 ----|----------------|------|---------|-------|----------|-------------| * No. - SSMに登録された順番 * stream name - ストリームの名前 * suid - 同一ストリーム名を区別するための番号 * size - ストリームデータのサイズ * num - リングバッファ個数 * cycle - ストリームのサイクル * property - プロパティのサイズ ==== ssm-monitor ==== SSMに登録されているセンサの書き込み状況を表示。 handlerを作成したときこれをviewerを作成しなくても書き込まれているかどうかを調べることができる。(もちろん書き込まれたデータが正しいかどうかは別の話) 読み込みについては確認することができないので注意! Ctrl-Cで終了する。 $ ssm-monitor No. | stream name | id | count | tid | data[B/s] ----+----------------------------------+----+-------+-------------+----------| 0 | spur_adjust | 0 | 200 | 3954 | 7.812k 1 | spur_global | 0 | 0 | 3984 | 0.000 2 | spur_odometry | 0 | 200 | 5822 | 7.812k 3 | pws_motor | 0 | 0 | 3984 | 0.000 4 | scan_data2d | 2 | 40 | 1165 | 789.219k 5 | scan_data2d | 1 | 40 | 1162 | 1.026M 6 | sokuiki_fs | 1 | 40 | 826 | 2.198M 7 | sokuiki_fs | 2 | 40 | 829 | 1.651M 8 | sokuiki_bs | 2 | 40 | 829 | 1.651M ----+----------------------------------+----+-------+-------------+----------| ssm total wrote size : 11.435 MB/s * No. - SSMに登録された順番 * stream name - ストリームの名前 * id - 同一ストリーム名を区別するための番号 * count - データ書き込み回数/s * tid - 累計書き込み回数 * data - 書き込み量 ==== ssm-logger ==== SSMに登録されているセンサのデータを記録。 $ ssm-logger -n センサ名 -i センサのID -l 記録ファイル名 $ ssm-logger -l hoge.log -n hogehoge -i 0 複数記録したいときは複数起動する。 終了するときはCtrl-C 基本的にシェルスクリプトを使う。 ストリームに書き込まれたデータを全て保存します。 保存形式は順番は、 1行目にストリームのテキスト情報 その後バイナリでプロパティデータ タイムスタンプ、ストリームデータのセット の順です。 === スクリプトの例(logger.sh) === ==起動== ./logger.sh ログディレクトリ ==ファイル例== #!/bin/bash NOW=`date +"%Y.%m.%d-%H%M"` LOGDIR=$1${NOW} if [ -e ${LOGDIR} ]; then echo "ERROR: ${LOGDIR} already exists." else mkdir ${LOGDIR} cd ${LOGDIR} echo SSM-logger log $NOW > logger.err ssm-logger -n scan_data2d -i 1 -l urg_scip2_top_front.log 2>&1 | tee -a logger.err & ssm-logger -n scan_data2d -i 2 -l urg_scip2_top_down.log 2>&1 | tee -a logger.err & ssm-logger -n scan_data2d -i 3 -l urg_scip2_left.log 2>&1 | tee -a logger.err & ssm-logger -n scan_data2d -i 4 -l urg_scip2_right.log 2>&1 | tee -a logger.err & ssm-logger -n spur_global -i 0 -l gl.log 2>&1 | tee -a logger.err & ssm-logger -n pws_motor -i 0 -l pws.log 2>&1 | tee -a logger.err & ssm-logger -n spur_odometry -i 0 -l odm.log 2>&1 | tee -a logger.err fi 最後の行に&をつけると悲惨なことになるので注意。 ==== ssm-player ==== 複数のセンサデータを同時に再生。 途中での速度変更や、ポーズ、逆再生もできる。 $ ssm-player 記録ファイル名1 記録ファイル名2 記録ファイル名3 ... 基本的には $ ssm-player ログディレクトリ/*.log 注意: ssm-playerで再生する場合、 タイムスタンプを参照してSSMに書き出すため、 URG等に見られるセンサの計測→通信等による取得の時間遅れが0の状態になります。 そのため、URGのデータの時刻がオドメトリより先に来る場合もあり、 実際の動作と異なる場合があります。 === オプション === 引数 -x | --speed : 再生速度変更。負のときは逆再生される -s | --start-time : ログファイルの途中から再生 -e | --end-time : 再生の終了時間を決定 -l | --loop : 繰り返し再生する -S | --start-ssmtime : SSM時間で再生開始時間を設定 -E | --end-ssmtime : SSM時間で再生終了時間を設定 -v | --verbose : 詳細表示モード -q | --quiet : 表示無しモード -h | --help : ヘルプ表示 ex) ログの10秒から20秒の間を2倍速で繰り替えし再生する $ ssm-player -x 2 -s 10 -e 20 -l *.log === コマンド === 再生中に変更するときのコマンド。 そのうち追加するかも。 再生中にキーを押してエンターを押すと反映される。 p | pause : ポーズ s | start : 再生 r | reverse : リバース x | speed SPEED : 再生速度をSPEEDに設定 | skip TIME : 時間をTIME秒進める q | quit : 終了 + : 再生速度を1.1倍 - : 再生速度を0.9倍 > : コマ送り(0.1秒) "+->"のコマンドについては1文字毎に解析しているので、"+++++\n"のように連続して入力することも可能。 ==== ssm-date ==== SSM時間を取得・書き込みするソフト。 時間の一時停止・速度などをコントロールできる。 ssm-playerと併用して使用する(というかssm-playerを外部からコントロールするために作ったプログラムです)。 $ ssm-date -g === オプション === 代表的なオプションだけを示す。 詳しくはhelpを参照 引数 -s | --increase-speed : 少し速度を上げる -S | --decrease-speed : 少し速度を下げる。 -g | --toggle-pause : 再生・一時停止の切り替え -G | --toggle-reverse : 逆再生の切り替え -I | --init : SSM時間を初期化(playerが正常終了しなかったときに使用) -h | --help : ヘルプを表示 -H | --long-help : 詳細なヘルプを表示 === パネルへの登録 === gnomeパネルなどに登録してくと、パネルをクリックするだけでssm-playerをコントロールできるようになるので便利。 登録方法は、 #Ubuntu画面上部のパネルを右クリック #パネルへ追加を選択 #カスタムアプリケーションのランチャを選択 #コマンドに「ssm-date -g」と入力し、OKを押す これだけで、追加したアイコンをクリックするだけで ログの再生・一時停止を切り替えることができます。 ==== ssm-transporter ==== 複数PC間でセンサデータを共有するためのソフトウェア。 別のPCに接続されているセンサを使えるようになります。 PCの接続は現在は1対1の通信のみ対応。 センサは複数転送可能(なはず)です。 互いにファイルsend_sensors.server(send_sensor.client)に送りたいセンサの名前とIDを書いて、 サーバ側は $ ssm-transporter クライアント側は $ ssm-transporter <サーバのIP> で起動する。 両方に同じセンサ名が書いてあると大変なことになるかも。 なお、PC間ではNTP等で時刻同期をとることを推奨します。 ==== killssm ==== ssmを使っているプログラム全てに対してシグナルを送る デフォルトはSIGINT(Ctrl-Cと同じ入力)。 $ killssm ==== psssm ==== ssmを使用しているプログラムを全て表示 psコマンドのssm版です $ psssm ==== topssm ==== ssmを使用しているプログラムの負荷を表示 topコマンドのssm版です ==== ssm-graph ==== SSMのプロセスのつながり方をDOT言語で出力するプログラムです。 Graphviz等と組み合わせて使用してください。 ex) $ ssm-graph > sample1.dot $ dot -Tpng sample1.dot -o sample1.png ex) $ ssm-graph | dot -Tpng -o sample2.png -Txlibとか指定すると、ウィンドウに描画されます。 DOT のubuntuでのインストールは、以下のコマンドでできます。 $ sudo apt-get install graphviz