2023年3月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

カテゴリー

ブログパーツ

無料ブログはココログ

« 2013年3月 | トップページ | 2013年5月 »

2013年4月

2013年4月29日 (月)

ゲームパッドを使えるようにする

ROSさんお手やわらかに:ROS入門編

ゲームパッドが使えるといろいろと便利なのでインストールした。

ゲームパッドは写真のもの。アキバで探そうかと思ったが、アマゾンでなんと660円だったのでそっちで購入。

Dscn2562

まずはubuntuでゲームパッドを使えるように、ドライバjoystickと設定&テストツールjstest-gtkをインストール。
$ sudo apt-get install joystick jstest-gtk

ゲームパッドを使うにはアクセス権限が必要なようだ。シリアルポートと同じアクセス権なので、まだ取得していない場合は、下記のコマンドで、自分をアクセス権のあるdialoutグループに追加しておく。
$ sudo addgroup <ログイン名> dialout

ここでゲームパッドを接続し、jstest-gtkを起動。動作を確認しておく。このゲームパッドは問題なく動いた。

次はROSで使えるようにするわけだが、これがちょっとてこずった。
まずはこのページのgithubのリンクからダウンロードする。一発では入らないのでどこにダウンロードしても良い。僕はとりあえずホームに落とした。

$ svn co https://github.com/ros-drivers/joystick_drivers.git

これでjoystick_drivers.gitというのができる。この中のtrunkに入っているのはgroovy用でfuerteには使えないようだ。
この中のtagsフォルダの中にあるfuerteフォルダがfuerte用のjoystick_driversのようなので
・ROSのパスが通っているstd_stacksにコピー(このディレクトリを作った顛末はこちら
・名前をjoystick_driversに変更
・端末でこのディレクトリに移動し
 $ rosdep install joystick_drivers
 $ rosmake
これでいいようだ。

インストールがすんだらROSで使えるかどうかをテストする。ゲームパッドはつないだまま。
端末を開いて初期化後、roscoreを起動。
$ roscore

新しい端末を開いて初期化後
$ rosrun joy joy_node
こんな感じのメッセージが出ればOK
[ INFO] [1367232625.685893362]: Opened joystick: /dev/input/js0. deadzone_: 0.050000.
赤字のエラーメッセージが出る場合は、ゲームパッドがつながっていないか、アクセス権がない。

新しい端末を開いて初期化後
$ rostopic echo joy
レバーを動かしたり、ボタンを押したりするとこんな感じのメッセージが出る。

---
header:
seq: 96
stamp:
secs: 1367233082
nsecs: 149515382
frame_id: ''
axes: [0.0, 0.06674397736787796, -0.0, -0.0, 0.0, 0.0]
buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
---

どのレバーがaxes配列のどれで、どのボタンがbuttons配列のどれかをメモしておくと、プログラムの時便利。

2013年4月28日 (日)

モヤモヤを解消

ROSさんお手やわらかに:ROS入門編

GWを利用して、いままでモヤモヤしていたことを明らかにしていこう。

■端末を開いたときにすること
いままで僕の環境では、端末を開いたときにmyrosというファイルをソースして、環境の初期化を行っていた。このファイルの内容は下記。

source ~/fuerte_workspace/setup.bash
export ROS_HOSTNAME=localhost
export ROS_MASTER_URI=http://localhost:11311
echo "OK"

本来は最初のsource ~/fuerte_workspace/setup.bashだけでいいはず。その次の2行は、以前roscoreがうまく働かないときに有効だったので入れてある。
改めていろいろ試してみると、最初のコマンドだけで問題なく使える。たまたまうまくいかないときがあっただけのようだ。羹にこりて膾を吹くということか。

■複数のワークスペースを使う
ワークスペースmytestを新たに作成してみると

$ rosws init ~/mytest /opt/ros/fuerte

問題なく作成できる。ワークスペースは、端末を開いたときにsource ~/fuerte_workspace/setup.bashをするか、source ~/mytest/setup.bashを実行するかで切り替えることができる。

■他のマシンにpythonのパッケージを持ってくる
メインマシンで動いているパッケージを、サブマシン(まったく同じROS環境が構築されている)にUSBメモリで持ってくる。ワークスペース名なども同じ。

まず、パッケージディレクトリをそのままコサブマシンの同一ディレクトリにコピーし、pyファイルを実行可能に設定。
当該ディレクトリに移動して、下記でインストール。
$ rosdep install <ディレクトリ名>
次に
$ rosmake
で大丈夫なようだ。

注意:fuerteをインストールしたサブマシンへはこれでよかったが、どうしたわけかgroovyを入れてfuerteに切り替えたデスクトップ機へ持っていったらinstallでエラーが出た。だが、rosdep checkで依存関係を調べたところ問題無しだったので、そのままrosmakeしたら正常にmakeできた。起動はもちろんroscdなどのパッケージを扱うコマンドも今のところ問題ない。なぜかはわからない。

■groovyへのアップデート
groovyのリリースから四半期がすぎ、すでに次のバージョンのSIGが立ち始めたのようなので、そろそろ移行の準備をしたい。
まずは最近使っていないデスクトップ機のubuntu(fuerteインストール済み)に、groovyをインストールしてみた。
端末を起動すると毎回「以前fuerteが入ってたので、パスが混乱しないよう環境を確認しろ」という意味のメッセージが表示され、groovyが使えるようになる。その後、コマンドでfuerteに戻すこともできるので、共生も可能??(確認中)
ファイルシステムがまったく変わり、マニフェストもなくなった。古いパッケージを簡単に持ってくるわけにはいかないみたいだ。当面、この環境でいろいろテストしていこう。

2013年4月26日 (金)

tfあれこれ

ROSさんお手やわらかに:ROS入門編

色々やってきたtfだが、この辺で一区切りにしよう。
tfあれこれと題して簡単にまとめる。

■tfの「時間感覚」
デモではtfの最新情報だけを扱ったが、tfは過去のデータもバッファリングしているので、たとえば5秒前の座標などのアクセスできるらしい。これをどう使うのか? 今のところ、空港で荷物を運んでいる連結キャリアカーのように、先頭のロボットとまったく同じ軌道を描いて後を追う、群れロボットくらいしか思いつかない。あとはデバッグに役立つのかな。

ただ、最新の情報に更新されるのを待つwaitForTransformは覚えておいて損はなさそうだ。
ただ、ちょっとrospy.Time()の扱いがややこしそう。

「あれこれ」としたのに一項目しか思いつかない。では感想でも書こうか。

この程度でもROSが解るようなると、ROSを始めたころ参考にさせてもらおうとした、こちらのサイトの内容がやっと解るようになった。ROSの日本語のリソースとしては実践的で、しかも大変丁寧なサイトではあるのだが、なんせ最初のころは、ROSどころかunixコマンドもあやふやだったので、正直なところちんぷんかんぷんだったのだ。
この先、ナビゲーションなどの実験には、おおいに参考にさせていただきたい。ヨロシクお願いします。

2013年4月25日 (木)

tfのデモを試す(座標系の追加)

ROSさんお手やわらかに:ROS入門編

今回はタートルにもう一つの座標系を追加する。チュートリアルのこのページだ。

下図の左が座標系を追加したタートル1。右がその時の座標系ツリーだ。
Carrot_3
キーボードで動かすタートル1の左側から2mの見えない棒を突き出し、仮想のにんじん(carrot)をくくりつけたというイメージだ。にんじんは亀の好物なので、タートル2がにんじんを追跡するようにプログラムする。

いままでのデモを改造するが、とても簡単だ。まず、にんじん用のブロードキャスターを追加し、親座標にタートル1の座標系を指定、親座標とのオフセット(左に2mずれている)を送信するよう定数をセットする。次にタートル2のリスナーが追跡する座標系を、タートル1からにんじんに変更したら完成だ。

にんじんのブロードキャスターfixed_tf_broadcaster.pyはこれ
「fixed_tf_broadcaster.py」を見る


修正したタートル2のリスナーturtle_tf_listener.pyはこれ
「turtle_tf_listener.py」を見る
もとのリスナーの listener.lookupTransformのturtle1をcarrot1に直しただけ。


起動するためのstart_demo.launchはこれ
「start_demo.launch」を見る
これもfixed_tf_broadcaster.pyを起動する項目を追加しただけ。

実行すると、タートル2(丸い甲羅の亀)は、このようにタートル1の左側の見えないにんじんに食いつく。

Screenshot_from_20130425_220138

もちろん、プログラムを組めば、にんじんを移動させたり旋回させることもできる。
つまり、tfの仕組みを使うと、移動ロボットにパンチルトカメラやロボットアームを搭載したモデルを、極めて簡単に構築し、操作できる。移動しながらカメラで室内のあるポイントを撮影し続けたり、床の上の物体をロボットアームで掴み上げたりする作業が実現しやすくなるだろう。

作業ロボットを作るにはとても便利な仕組みだ。

2013年4月24日 (水)

tfのデモを試す(追いかけっこの補足)

ROSさんお手やわらかに:ROS入門編

まだ先があるが、とりあえずここまでのまとめ。前回までの補足と言った方が良いか。

■座標系の変換のイメージ
ワールド座標系にいる2匹のタートルが左、これをtfでタートル1をタートル2の座標系に変換すると右。

Frame

三角のタートルの黄色い丸がアタマ、つまりそっちが前。タートル2の座標系ではタートル2は原点に居てX軸方向を向いている(たぶん)。ワールド座標系のタートル1をこっちに持ってくると右の図のようになる。これなら、タートル2にどういう移動命令を与えればタートル1に近づけるかは一目瞭然。もちろん数学的にもすっきり。なるほどtfは便利だ。


■angularを4倍するのはなぜ
前回の投稿でどうも解せなかったところだが、簡単に言えば僕の勘違い。angularは旋回角度ではなく、旋回角速度の指定。単位はラジアン/secだ。つまり前回のコード

angular = 4 * math.atan2(trans[1], trans[0])

これは、タートル1の方向(角度)へ1/4秒で旋回する角速度を計算している。つまり自動車のハンドルを早く切ると言う意味合いだ。4を1にすると、ハンドルをゆっくり切るので、タートル1にゆるゆる近づいてくる形になる。

シェーキーではロボットの移動コマンドを、移動距離と旋回角で与えて居たので、勘違いした。ROSの移動ロボット制御では移動速度と旋回速度で与えるのが常識のようだ。roombaもそうだ。

2013年4月22日 (月)

tfのデモを試す(リスナー解析編)

ROSさんお手やわらかに:ROS入門編

今回はリスナーの解析。デモのリスナーはtfを使って(という言い方でいいのか?)タートル2を制御、タートル1を追跡させる。

下記がリスナーtutle_if_listenet.pyの主要部分。

Listener

これには__main__しかないので上から順に実行。

11行のinit_nodeは何かおかしい。以前確認したとおり、このノードの名前はlistenerのはず、tf_turtleではない。デモのサンプルコードではこうなっている。これでもエラーにもならず動くようだ。そういうものらしい。

13行目は重要。リスナーオブジェクトlistenerを生成する。生成されるとすぐにデータ受信を開始する。

15行から17行は、turtlesimのspawnサービスを使って、少しはなれた場所に2匹目のタートルを生成。

19行目、この2匹目のタートルへ制御情報をパブリッシュするためのオブジェクトturtle_valを生成。
21行目、ループの周期を制御するオブジェクトrateに10Hzを設定。

22行目からが制御ループ。
24行目が、tfの仕組みをつかって情報を取得する、このプログラムのキモ。リスナーオブジェクトlistenerからでtransとrotというコンテナに必要な変換をした結果を格納する。仕組みは例によってよく解らないが、どうもこう書くらしい。カッコの中は次のようになっている。
 ・タートル2の座標系から見た、
 ・タートル1の座標系の原点(タートル1のいる場所)の、
 ・最新情報(rospy.time(0))を取得。
このへんは別投稿で詳しく書いておいた方がよさそうだ。

27行目からはタートル2の制御情報を作っている。
どうも、transというのは配列で[0][1]にタートル1のx,y座標(タートル2の座標系で)が入っているようだ。つまりこれがタートル2から見たタートル1の方向と距離になる。
ということで旋回角angularはatan2で計算している。4倍しているのはなぜかは不明。実験してみる必要がある。
移動速度linearは、単純に距離を計算し、そこを2秒で移動するよう係数0.5をかけて算出している。
これも図をつかって再度投稿したほうがよさそう。

で、31行目でループの実行周期が10Hzになるようオブジェクトrateを使って調整している。

とりあえずこんなもの。スクリプトは下記に。
「turtle_tf_listener.py」をダウンロード

2013年4月21日 (日)

tfのデモを試す(ブロードキャスター解析編)

ROSさんお手やわらかに:ROS入門編

デモのブロードキャスターのコードを見てみる。
ブロードキャスターは二つのプロセスとして起動され、各々turtle1,turtle2のposeをサブスクライブしてtfメッセージを送信する。

下記がブロードキャスターturtle_tf_broadcaster.pyの主要部分。

Broadcaster

最初に17行からの実行部分を見る。
18行で変数turtlenameにパラメータturtle(~turtle)からタートルの名前を取得。名前は前回投稿したroslaunchで設定している。
20行からがタートルのpose情報をサブスクライブするための設定。下記の順番で指定している。
 ・パラメータからサブスクライブするトピックを指定(/turtle1/poseなど)
 ・サブスクライブするメッセージの型を指定(turtlesim.msg.pose)これがハンドラに渡す第一引数
 ・ハンドラ関数を指定(handle_turtle_pose)
 ・第二引数として渡すタートル名(turtle1など)
これでおしまい。あとはアイドルループで待機する。

次は9行からのサブスクライブハンドラ関数。(と呼ぶのだろうか?)この間数は、タートルから取得した情報をそのまま送信する。

関数の最初の引数msgは目的のタートルからサブスクライブされた、位置と方向の情報(pose型)。二番目turtlenameがタートルの名前。
10行目はtf型のオブジェクトbrを生成。
11行目から実際のtf情報の送信。下記の順にセットして送信する。
 ・座標情報(msg.x, msg.y, 0)、z座標はないので0
 ・各軸のオイラー角からクオータニオンに変換した姿勢情報。msg.thetaでz軸まわりの旋回角を取得し変換。
 ・現在の時刻
 ・現座標系の名前(タートルの名前を使う)
 ・親座標系の名前(親座標系はワールド座標)
ややこしいがあらかたtfがやってくれるので、定型的に使えばいいのかも。それから、クオータニオンなんてコトバ、初めて書いた。

送る方はこれだけ。次回はリスナーだ。

今回のpythonスクリプトは下記。
「turtle_tf_broadcaster.py」をダウンロード

2013年4月20日 (土)

その前にroslaunch XMLを見ておく

ROSさんお手やわらかに:ROS入門編

tfのサンプルコードを見ていく前に、今回のチュートリアルで初めて使ったroslaunchについてまとめる。
これはroscoreと必要なノードを自動的に起動し、初期設定などを行うもの。また終了時にはノードとroscoreをきちんと終了してくれる。実験を要領良く行うには必須だ。

設定項目はXX.launchというファイルにXMLで記述し、パッケージのlaunchフォルダに置く。デモで作成したstart_demo.launchは下記。

Screenshot_from_20130420_112540

nodeタグは起動するノードとその起動方法を定義、paramタグはパラメータの初期値を決める。
3行目は基本的な書き方。turtlesimパッケージのturtlesim_nodeノードをsimという名前で起動するよう定義している。
4行目にあるoutput=はstdoutとstderrをスクリーンに表示するかログに残すかの指定。デフォルトはlogだがstderrは画面にも表示される。

8行目からはブロードキャスターの定義。turtle1とturtle2のブロードキャスターを別々のプロセスとして起動している。ノードの名前とturtleパラメータが違っているだけで、その他はまったく同じ。なお、respawnは何らかの理由でノードが落ちたときに再起動するかどうか。ここでは再起動しないようにしている。初期値が必要だからか?

ブロードキャスターは二つのプロセスとして起動されるので、前回rqt_graphでみたとおり別々のノードとして扱われる。一方2匹のタートルはturtlesim_nodeの二つのインスタンスであり、「タートル2を作る」作業はリスナーの初期化部でturtlesim_nodeにspawnサービスを要求して行っている。

2013年4月17日 (水)

tfのデモを試す(作成編)

ROSさんお手やわらかに:ROS入門編

前回の投稿に「リストナー」ではなく「リスナー」と言うコメントをいただいた。確かにその通り、よく見りゃlistin + erだ。適当に英文を読む傾向があるので気をつけないと。なんといっても僕は、中学生のころ、listenを「リステン」と心の中で唱えていたくらいだから。

今回はタートルが追いかけっこするデモの作成だ。

まずは座標系を確認しておく。
Zahyoukei
親のワールド座標はロボットが置かれている空間の座標系。二つのタートルはそれぞれ独立の座標系を持つ。デモではタートル2から見たタートル1の位置を、tfの仕組みを使って取得し、タートル2を自動制御することになる。

次はノードとトピックの確認だ。デモを「作った後」にrqt_graphで確認したもの。本格ミステリならアンフェアな手法だが、最初に構造を確認しておくとデモコードが理解しやすくなるのでね。

Nodes_3

丸がノード、矢印がトピック、矢印の上の文字はそこを流れるメッセージ、吹き出しは後から追加した解説だ。ポイントは次のとおり。

・ノード/simがturtle_simノード。ここでは/simと言う名前をつけて起動している。
・/simではturtle1,turtle2という二つのインスタンスを生成し、2匹の亀(タートル)を出現させている。
・このうち、turtle1はキー操作を受け入れる/teleopノードから操縦される。
・それぞれのタートルのpose(位置と向き)はタートルごとにturtleX_tf_broadcasterというノードからtfというメッセージに変換して送信されている。
・listenerノードは二つのブロードキャスターからのtfメッセージを利用して、turtle2がturtle1を追いかけるように制御。

まずはブロードキャスターを作る。チュートリアルではtutorialsというディレクトリにパッケージを作るようになっているが、僕の環境(ROSのチュートリアルを素直になぞったもの)ではROSのパスが通っているのはsandboxというディレクトリなので、ここをsandboxと読み替えて作業した。
次にリスナーを作る。これはそのまま作れば良い。

これでデモは完成。
次回はコードの中身を見てみる。


2013年4月15日 (月)

コーヒーブレイク(2回目)

ROSさんお手やわらかに:ROS入門編

ROSのサーバのトラブルか、まる1日wikiが使えなかったので、tfの実験は取りやめ。
roombaに載せるつもりで用意していた、ちょっと小型のラップトップにROSを導入した。

Dscn2552

左がメイン機のThinkPad T61、右側が今回ヤフオクで入手したThinkPad X61。12inch LCD、Core2Duo 2.0GHzなのでまあまあの性能。OSなしで7K円、他にDVDドライブのついたUrtra Baseが3K円。いずれも送料込み。なかなかの美品で動作に問題なし。実使用時間3時間以上とバッテリーもOK。またまたいい買い物をしたようだ。

roombaに載せるとこんな感じに。レーザーレンジファインダURG-04ものっけてみた。
Dscn2557  Dscn2558

ラップトップのバッテリーが大きいのでかなりはみ出す。スモールバッテリーならもっと収まりがいいだろう。サブシャーシをきちんと作ってセンサーを立体的に配置すれば、現状でもなんとかなりそうだ。ラップトップのふたを閉めてもスリープしないようにするのは「システム設定」の「電源」で設定する。

2013年4月14日 (日)

tfの仕組みを確認する

ROSさんお手やわらかに:ROS入門編

ROSにはいろいろなパッケージがある。今回は座標変換を提供するtfパッケージを試す。

チュートリアルがあるので、まずはpythonでのデモを試す。最初はこれこれをやってみる。これでタートル1をタートル2が追いかけるデモを作ることになる。このデモはここにあるサンプルと同じもの。

■tfとは何か(現在分かっていること)
座標変換を行うパッケージ。今回のデモでは、タートル2から見たタートル1の位置を、2次元のベクトルの形で取得している。独立した座標系のことをフレームと呼ぶらしい。

■tfの仕組み(現在分かっていること)
仕組みはこんな感じ
・座標系(例えばタートル1が発行したオドメトリ)をパブリッシュする「ブロードキャスター」がある。
・ブロードキャスターではその座標系の「親座標系」を指定することで、アーム付きロボットのような複雑な機構をツリー構造として定義することができる。
・特定の座標系を受信する「リストナー」があり、tfを利用したいノードにはリストナーの仕組みを組み込む。
・リストナーは、たとえば「タートル2から見たタートル1の位置」などをツリーから計算して取得することができる。

■tfを使う理由
「シェーキーのような移動台車に乗ったパン・チルトカメラで、ワールド座標のある場所を撮影したい。」「ロボットをワールド座標のある位置に移動させたい」などの場合は座標変換が必要。自前で書くのは大変。

次はデモを試してみる。

2013年4月 9日 (火)

roombaテストプログラムのまとめ

ROSさんお手やわらかに:ROS入門編

前回からの続き。プログラムrb_demo.pyの要点を解説
雛形にしたのはこのページのプログラム。これにオドメトリのサブスクライブを追加したもの。下記に関数ごとに解説。

stop_and_report()
roombaに停止コマンドを送り、完全に停止するまで1秒待ってからオドメトリのX、Y座標とヘッディング情報Zをタイプアウトする。

mover()
roombaを前進、後退、左旋回、右旋回させるシーケンサー。動作時間はそれぞれ1秒。シーケンスの最初にrospy.init_node('rb_demo')で初期化するが、この後に少し時間をおいてコマンドをパブリッシュしないと最初のコマンドが受け取れない。ここでは1秒待ってからコマンドを送る。

rb_callback(new_odom)
roomba500_light_nodeがオドメトリ情報をパブリッシュするごとに呼ばれるコールバック関数。オドメトリ情報を外部参照できるようグローバル変数g_odomに入れるだけ。

main()
最初にg_odom = 0とやってグローバルを初期化しているが、これではint型として初期化される。そのため、初期化後オドメトリ情報を入れるまでは、g_odom.pose.pose.position.xなどと読み出すとエラーになってしまう。pythonの特性から一度Odometory型を格納するとその型になるので、その後は読み出せる。正しくはg_odom = Odometry()として初期化するべき。

以下はこのテストで気がついたこと

・依存関係は本来パッケージのマニフェストに記述することになっているが、今回はbeginner_tutorialsのマニフェストにはgeometry_msgs.msgとかを追加していない。一応これでも動くようだ。自動的に追加するにはどうするのかはわからない。

・オドメトリは座標値がm、ヘディング情報がRadianで読み取れる。かなりの精度があり、わずかに動かしただけでもそれらしい値が読める。

・オドメトリはroomba500_light_nodeをスタートした時にゼロにリセットされる。ノードが動作中はリセットできないようだ。

・roombaがFullモード(ランプが消えている)の時は充電ステーションに載せても充電できない。ボタンを押してランプを点灯してから充電しないとダメ。

・オブジェクトg_odomの内容を確認するには、print g_odomをプログラムに入れて実行する。詳細な内容を表示するのでいろいろと便利。

・やっぱりコメントは英語で書こう。

2013年4月 7日 (日)

roombaをpythonで動かしてみる

ROSさんお手やわらかに:ROS入門編

前回からの続き。roombaをpythonで作ったノードで動かしてみる。
roombaを前→後→左旋回→右旋回と動かし、それぞれでのx、y座標と旋回角をタイプさせる。
ノードrb_demoはチュートリアルで作ったbeginner_tutorialsパッケージに追加する。

■テスト用ノードの作成
・下記のファイルを~/fuerte_workspace/sandbox/beginner_tutorials/scriptsに保存
rb_demo.py
・端末を開きROSを初期化してから~/fuerte_workspace/sandbox/beginner_tutorialsに移動
・chmod +x scripts/rb_demo.pyで実行可能に
・makeする(よくわからないが最初に1回はこれが必要?)

■ノードのテスト
・前回同様roombaとroomba500_light_nodeをセットアップする。roombaは10センチほど前後進しその場で左右に方向転換するので、そのくらいのスペースがとれる場所に置く
・端末を開きROSを初期化してrosrun beginner_tutorials rb_demo.pyで実行
・ロボットは前に1秒、後ろに1秒、右旋回1秒、左旋回1秒したあと停止、ノードも終了する
・下記のようなメッセージが表示される
Moving the robot forward.
Stopped
POS X:0.135 POS Y:0.001 DIR:0.011
Moving the robot backward.
Stopped
POS X:0.010 POS Y:-0.003 DIR:0.026
Turning the robot left.
Stopped
POS X:0.012 POS Y:-0.002 DIR:0.345
Turning the robot right.
Stopped
POS X:0.012 POS Y:-0.002 DIR:0.030
Node exiting.

プログラムはロボットへのコマンドをパブリッシュし、ドライバからのオドメトリ情報をサブスクライブする。解説は次回。

2013年4月 6日 (土)

roombaをROSのコマンドで動かしてみる

ROSさんお手やわらかに:ROS入門編

前回の続き。インストールしたパッケージをテストする。

■接続テスト
roomba_500_seriesパッケージのノード・roomba500_light_nodeを起動しroombaとの接続をテストする。
まず、roombaをいつものシリアルレベルコンバータとUSBシリアル変換ケーブルを使ってパソコンに接続する。
Dscn2548  Dscn2549


ポートは/dev/ttyUSB0になる。テスト前にこのデバイスへのアクセス権を取得しておく。

テスト手順は下記のとおり
・roombaを接続。電源ボタンを押しランプ点灯を確認。(レベルコンバータの電源ONを忘れずに)
・端末を開きROSを初期化した後でroscoreを実行。
・もう一つ端末を開きROSを初期化した後で rosrun roomba_500_series roomba500_light_node でドライバノードを起動。下記のようなメッセージが出れば接続成功。
[ INFO] [1365212678.543347802]: Roomba for ROS 2.01
[ INFO] [1365212678.822329509]: Connected to Roomba.
・roombaの電源ランプが消えている(Fullモード)ことを確認。
・テストが終わったらCTRL+Cで終了。(終了後ボタンを押してroombaのランプ点灯。これをしないとroombaをノーマルモードに戻せない)

以上で接続テスト終了。もしrosrunで赤字のエラーメッセージが出たら、こういう意味。
Could not connect to Roomba. →USBシリアル変換が認識できてないかポートが違う。
Could not retrieve sensor packets.が連続して出る →roombaと接続できていない。ケーブルの不備。

■rostopicで動かしてみる
roomba500_light_nodeがサブスクライブするメッセージはcmd_vel、タイプはgeometry_msgs/Twist。これは移動速度linearと旋回速度angularで構成され、いずれもxyz3軸のベクトルで表される。このノードではlinear(m/sec)はx、angular(radian/sec?)はz成分に値を入れる。

上の手順でroomba500_light_nodeを起動した後、新たな端末を開いて下記のコマンドでテストする。

このコマンドで前に0.1m/secで3秒走行し停止
rostopic pub -1 cmd_vel geometry_msgs/Twist '[0.1, 0, 0]' '[0, 0, 0]' && rostopic pub -1 cmd_vel geometry_msgs/Twist '[0, 0, 0]' '[0, 0, 0]'
3秒はrostopic pubでメッセージの掲示期間のデフォルト値。

これは3秒左に0.1radian/secで旋回
rostopic pub -1 cmd_vel geometry_msgs/Twist '[0, 0, 0]' '[0, 0, 0.1]' && rostopic pub -1 cmd_vel geometry_msgs/Twist '[0, 0, 0]' '[0, 0, 0]'

一度メッセージを送るとずっとそれを実行する。今回のテストではメッセージを二つ送り順番に実行させている。一つ目が動かすメッセージで二つ目が停止のメッセージ。

今回お世話になったのはこのページ

2013年4月 3日 (水)

roombaのドライバをインストールする

ROSさんおてやわらかに:ROS入門編

昨年末にリリースされた新しいバージョンGroovyは見てみないふりをして、あいかわらずFuerteで作業する。今回はroombaのドライバスタックをインストールする。まず、roomba_500_seriesをインストールしてみる。
この方法ではなくサブバージョンから持ってくる方法の練習だ。最近はこっちが主流のようだ。

このページがお手本。有難うございます。

出来合いのスタックやパッケージをインストールするわけだから、本来なら/opt/ros/fuerte/stacksに置きたいが、ここはroot権限が必要。sudoでやってみるとrosmakeがなぜか実行できないのでビルドできない。rootでログインする方法もあるようだが、アカウントを切り替えながら作業するのは煩わしい。現在のアカウントで作業するために、ワークスペースにディレクトリstd_stacksを作り、ここにROSのパスを通して置くことにする。ここに必要なスタックやパッケージをダウンロードしてビルドすればいいわけだ。

■導入するスタック用のディレクトリを作る
・ワークスペース fuerte_workspace 直下にディレクトリstd_stacksをGUIで作る
・端末を開きsouce myrosで初期化。
・roscdでワークスペースへ移動
・rosws set std_stacksでディレクトリにROSのパスを通す
・~にもどってsource myrosで初期化(パスを有効にするため)
・念のためroswsでパスを表示させて確認

■シリアルポートドライバをインストール
・fuerte_workspace/std_stacksへ移動
・svn co http://isr-uc-ros-pkg.googlecode.com/svn/stacks/serial_communication/trunk/cereal_portでサブバージョンから取り込み
・cd cereal_port
・rosdep install cereal_portで依存関係を設定
・rosmakeでビルド

■roomba_500_seriesのインストール
・fuerte_workspace/std_stacksへ移動
・svn co http://isr-uc-ros-pkg.googlecode.com/svn/stacks/roomba_robot/trunk roomba_robot パッケージをroomba_robotと言う名前で持ってくる
・cd roomba_robot
・rosdep install roomba_robotで依存関係を設定
・rosmakeでビルド

これでインストール完了。


« 2013年3月 | トップページ | 2013年5月 »