*ROSノードの利用 [#i319ab36] #contents **はじめに [#v503c171] ここでは既存のROSノードをSIGVerseで利用する方法を紹介します。ROSのサンプルプログラムTurtleSimで使用されている亀アバターの制御ノードをそのまま用いて、SIGVerse内のロボットを操作することを目的とします。 ※このチュートリアルはUbuntu12.04LTS上のSIGVerse v2.2.0以降に対応しています。また、少なくとも、http://wiki.ros.orgのチュートリアル:http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29 (catkin) まで実施済みの環境を想定しています。 **SIGVerse内ロボット制御のためのコントローラの作成 [#v9933e1a] まず、制御ノードからのメッセージを浮け、SIGVerse内のロボットを動かすためのコントローラとなるノードを作成します。ここでは、catkin_make を行うディレクトリは、例えば、ユーザ名を UserNameとし、ROS用ワークスペースを catkin_ws とすると、 /home/UserName/catkin_ws にて行われるものとします(以降<catkin_ws>と表記)。&br;本チュートリアル実施に必要なファイルは &ref(ros_if.tar.gz); からダウンロードできます。これをROSワークスペース <catkin_ws>/src へ展開します。 $ tar xvfz ros_if.tar.gz -C <catkin_ws>/src <catkin_ws>/src/ros_if/CMakeLists.txt の102, 103行目にSIGVerseのヘッダファイルパスの指定があります。 #highlight(cpp:firstline[100]){{ include_directories(include ${catkin_INCLUDE_DIRS} <SIGVerse_path>/include/sigverse <SIGVerse_path>/include/sigverse/comm/controller ) }} これを、例えば次のように環境に応じて変更します。 #highlight(cpp:firstline[100]){{ include_directories(include ${catkin_INCLUDE_DIRS} /home/UserName/sigverse/include/sigverse /home/UserName/sigverse/include/sigverse/comm/controller ) }} コントローラをビルドします。 $ cd <catkin_ws> $ mkdir devel/lib/libros_if $ catkin_make 次のコマンドでファイルが作成されたことを確認してください。 $ ll devel/lib/libros_if/sig_if_ctrl.so ファイルが存在しない旨のメッセージが表示される場合は、catkin_make時に何らかのエラーが生じているはずです。それらをチェックし、適宜修正してください。ビルドが確認できたら、SIGVerseの世界ファイルをコピーします。 $ cp src/ros_if/ros_world.xml devel/lib/libros_if/ ** turtlesim制御ノードの作成 [#nae7b700] ROS公式サイトのチュートリアル用ソースコードを取得します。 git clone https://github.com/ros/ros_tutorials.git ** SIGVerseの起動 [#y0140483] まず、これまでに作業を行っていた端末(terminal)とは別に新しく端末を立ち上げ、そこでROSを立ち上げます。 $ roscore 起動が確認できたら、別のウィンドウあるいはタブで新しく端末を立ち上げます。その端末で、次のコマンドによりSIGVerseを起動します。 $ cd ~/<catkin_ws> $ source devel/setup.bash $ cd devel/lib/libros_if $ sigverse.sh -w ./ros_world.xml ** SIGViewerの起動とシミュレーションの開始 [#ad807c4c] - 各自のSIGViewerを立ち上げます。これまでのチュートリアル各課題と同様に、ホスト名およびポート名の指定があるので注意してください。 - ホストとの接続が正常にできていることが確認されたら、シミュレーションを開始(start)してください。ロボットが単体で配置されている世界が表示されます。 - ※このチュートリアルではビューアはSIGVerse世界をモニタすることのみに用いており、いかなるサービスも前提にしていません。。 ** 制御ノードの起動 [#c2e4683e] - 次に制御ノードを起動します。このノードを呼び出すには、また新たな端末を立ち上げ、次のコマンドを入力します。 $ source ~/<catkin_ws>/devel/setup.bash $ rosrun turtlesim turtle_teleop_key すると、http://wiki.ros.org/ROS/Tutorials/UnderstandingTopics のときと同様に、 Reading from keyboard --------------------------- Use arrow keys to move the turtle. と表示され、同端末はユーザからのキー入力待ち状態になります。この端末はロボットの操作をするとき、キー入力時にアクティブにしてある必要がありますので注意してください。 - ここで、必要なノードが起動されているか確認してください。本操作は、新しく端末を立ち上げ、 $ cd ~/<catkin_ws> $ source devel/setup.bash $ rosnode list によって行えます。これにより、同端末に /ros_sig_node /rosout /teleop_turtle と表示されることを確認してください - ros_sig_node はSIGVerse内のオブジェクトを操作するためのインターフェイスの機能を持つノードです。これは、コントローラとしてSIGServerによってロードされ、teleop_turtleが発するメッセージを受信するためのノードとして起動します。sig_if.cppから生成されます。 - rosout は roscoreを起動すると必ず生成されるノードです。 - teleop_turtle は「rosrun turtlesim turtle_teleop_key」によって起動されたノードであり、制御のためのメッセージを発信する機能を持ちます。今回は、本ノードを用いてSIGVerse内のロボットを操作します。 ** 制御ノードの動作確認 [#zf77a354] - 次に、teleop_turtleノードを起動した端末をアクティブにして、矢印キーを操作します。すると、Upキーで前に、Downキーで後ろに、leftおよびrightキーで左および右周りにロボットが回転する様子が、SIGViewerにおいて確認できます。 ** メッセージ送受信の様子の図示 [#oaf8cdd9] - ros_sig_node は teleop_turtleが発するメッセージをsubscribeしていますが、その様子をグラフで見てみましょう。これは、別の端末を立ち上げ、 $ cd ~/<catkin_ws> $ source devel/setup.bash $ rosrun rqt_graph rqt_graph によって確認でき、次のような図をみることができます。 #br #br #ref(rosgraph_turtle.png) #br #br これは、teleop_turtle ノードが turtle1/cmd_vel というトピックにメッセージを投げ、同トピックに投げられたメッセージをros_sig_nodeが聴取していることを示しています。 #highlight(end)