ROSの便利機能

Updated on: 2018-06-15

トップに戻る

ROSの便利機能

ROSには多くの便利な機能が用意されています。ここでは、そのうちのよく利用するコマンドなどの一部を紹介します。

roslaunch

ROSを用いた点群取得では、 端末を4つ起動して、それぞれroscoreとrosrunコマンドでノードを起動していました。 複雑なロボットシステムではこれが、100個以上のノードになる場合もあり、手作業ではやっていられません。

そこでROSには、launchファイルに、起動するノードやそのパラメータを書いておき、 roslaunchコマンドで一括起動する方法が用意されています。 下記の操作を行い、launchファイルを追加してみましょう。

  1. rsj_robot_testパッケージに、launchディレクトリを作成
    1
    
    $ mkdir ~/catkin_ws/src/rsj_robot_test/launch
    
  2. robot_test.launchファイルを作成して開く
    1
    
    $ gedit ~/catkin_ws/src/rsj_robot_test/launch/robot_test.launch
    
  3. 下記内容を記入
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    <launch>
      <node pkg="ypspur_ros" type="ypspur_ros" name="ypspur_ros">
        <param name="port" value="/dev/serial/by-id/usb-T-frog_project_T-frog_Driver-if00" />
        <param name="param_file" 
            value="/home/$(env USER)/params/rsj-seminar20??.param該当するものに置き換えること" />
        <param name="compatible" value="1" />
      </node>
      <node pkg="urg_node" type="urg_node" name="urg_node">
        <param name="serial_port" 
            value="/dev/serial/by-id/usb-Hokuyo_Data_Flex_for_USB_URG-Series_USB_Driver-if00" />
      </node>
      <node pkg="rsj_robot_test" type="rsj_robot_test_node" name="robot_test" output="screen">
      </node>
    </launch>
    

作成したlaunchファイルは下記のコマンドで実行できます。

1
$ roslaunch rsj_robot_test robot_test.launch

これは、rsj_robot_testパッケージ中の、robot_test.launchを実行する、という指示を表しています。 下記に代表的なタグの説明を示します。

nodeタグ

動するノードを指定します。nodeタグの各属性の意味は下記の通りです。

name
ノードインスタンスの名
pkg
ノードを定義するパッケージ名
type
ノードの実行ファイル名(バイナリーやPythonスクリプト)
output
ノードのstdoutの先:定義しないとstdoutROS_INFOstd::coutへの出力等)は端末で表示されず、 ~/.ros/log/に保存されるログファイルだけに出力される。端末で表示したい場合はscreenにします。

paramタグ

パラメータサーバーにパラメータを設定します。起動されるノードはこのパラメータが利用できます。

param<launch></launch>の間に入れるとグローバルパラメータに、<node></node>の間に入れるとプライベートパラメータになります。

グローバルとプライベートでは最終的に展開される名前が異なってきます。 例えば、同じbarというパラメータでも次のような違いがあります。

各属性は下記の通りです。

name
パラメータ名
value
パラメータの値
type
double, int, string, bool など (一意に決まるときは省略可能)

remapタグ

ノードとトピックをつなぎ変えます。

remapタグの各属性の意味は下記の通りです。

from
変更前のトピック名
to
変更後のトピック名

これを使うことで、ノードとトピックをつなぎ変えることができます。たとえば、下記のような、動作計画のノードと、ロボットのドライバノードがつながっている状態から、 新たに衝突回避のノードを加えたいとします。

Before remapping

remapを用いることで、各ノードのソースコードを変更することなく、ノードとトピックの接続だけ切り替えて、動作計画とロボットドライバの間に、衝突回避を追加することができます。

After remapping

rqt_graph

トピックとノードの接続状態を可視化することができます。 ロボットとURGをPCに接続して、roslaunchの項で説明したようにrobot_test.launchを実行し、その状態で下記コマンドを実行してみましょう。

1
$ rqt_graph

以下の画像のように、ノードとトピックの接続グラフが表示されます。

rqt_graph showing CRANE+ system

rostopic

デバッグなどのため、ROSのトピックに流れているメッセージを確認したいときや、 試しにメッセージを送信したいときに、コマンドラインのツールでこれらの処理を行うことができます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ rostopic list
/ad/ad0
/ad/ad1
/ad/ad2
/ad/ad3
/ad/ad4
/ad/ad5
/ad/ad6
/ad/ad7
/cmd_vel
/control_mode
/diagnostics
/laser_status
/odom
/rosout
/rosout_agg
/scan
/tf
/tf_static
/urg_node/parameter_descriptions
/urg_node/parameter_updates
/wrench
1
$ rostopic echo /odom

Tab でトピック名、データ型及びメッセージのテンプレートが出せます。

1
2
3
4
5
6
7
8
$ rostopic pub -1 /cmd_vel geometry_msgs/Twist [Tab補完で表示]"linear
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0"

-1を利用すると一回のみ送信します。 -1を削除するとrostopicはこのメッセージを1度送信し、 Ctrl+c を入力するまで待機して、あとから起動したノードがメッセージを受け取れる状態を維持します。

rosbag

ROSで提供されているrosbagツールを用いると、ROS上で送信、受信されているデータ(メッセージ)を記録・再生することができます。

1
$ rosbag record /scan /odom

記録の終了は、Ctrl+c で行います。記録されたデータは、「日付時刻.bag」のファイル名で保存されています。

1
$ rosbag play ファイル名.bag

RViz

ROSでは、rvizという、データ可視化ツール(ビューワ)が提供されています。 今回のセミナーの環境にも、インストールされており、URGのデータやオドメトリを表示することができます。 ロボットとURGをPCに接続して、roslaunchの項で説明したようにrobot_test.launchを実行し、その状態で下記コマンドを実行してみましょう。

1
$ rosrun rviz rviz

rviz画面中の、「add」ボタンをクリックし、開いた選択ウインドウ内で、 「By topic」タブから、「/scan」中の「LaserScan」を選択します。 また、「Global Option」の「Fixed Frame」欄に「laser」と入力します。

センサデータが取得できていれば、図のように、距離データがプロットされます。

3Dセンサからのデータ取得に関する実習

配布された3次元距離センサのデータについて、roslounchを利用して2次元データに変換し、RVizで結果を確認してみましょう。 お手持ちのセンサに応じて、以下を実施してください。