LoginSignup
2
3

More than 3 years have passed since last update.

iRobot Create 2でROSを勉強する(2)roslaunch

Last updated at Posted at 2019-10-30

記事の概要

「(1)準備」の続きです。

iRobot Create 2は掃除ロボット「ルンバ600シリーズ」から掃除機能を取り除き、趣味や研究用の改造を可能にしたロボットです。
このiRobot Create 2を使って、ロボット用のソフトウェアプラットフォームROSの使い方を勉強したいと思います。

本記事では、rouslaunchについて調べます。

IMG_1793.jpg

roslaunch

roslaunchを用いれば、複数のROSノードを同時に実行できます。
前回は以下のroslaunchファイルを実行しました。このファイルの中身を少し詳しく調べてみます。

roslaunchについては、srsさん作成のROS講座もご参照ください。
ROS講座04 roslaunch1
ROS講座19 roslaunch2

create_autonomy/ca_driver/launch/create_2.launch
<?xml version="1.0"?>
<launch>
  <arg name="config" default="$(find ca_driver)/config/default.yaml" />
  <arg name="desc" default="true" />

  <node name="ca_driver" pkg="ca_driver" type="ca_driver" output="screen">
    <rosparam command="load" file="$(arg config)" />
    <param name="robot_model" value="CREATE_2" />
  </node>

  <!-- Robot description -->
  <include if="$(arg desc)" file="$(find ca_description)/launch/create_2.launch" />
</launch>

最後にcreate_autonomy/ca_description/launch/create_2.launchである以下も呼び出されています。

<launch>
  <param name="robot_description" command="$(find xacro)/xacro.py '$(find ca_description)/urdf/create_2.urdf.xacro'" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen" />
</launch>

roslaunchで実行するのに必要な記述は全てlaunchタグで囲われています。

argタグは変数の定義に使用するタグです。

<arg name="config" default="$(find ca_driver)/config/default.yaml" />
  • name

    • ROS上に登録される変数の名称
  • default

    • 初期値を設定する。値を指定していない変数には、ターミナルからの実行時に、この初期値が適用される

これでconfigという名前でdefault.yamlに記述された初期化済みの変数が使用できます。
実際にconfigを使用している個所を見てみます。

rosparamタグはパラメータ情報の確認と修正に使用するタグです。詳細は「rosparamの使い方メモ」をご参照ください。

<rosparam command="load" file="$(arg config)" />
  • command
    load、dump、deleteのいずれかを指定します。何も指定しない場合はloadになります。ここではloadを使用し、fileで指定した変数を呼び出しています

  • file
    commandに対象となる変数を指定します。ここで先ほど作成した変数configを呼び出しています。

前回のroslaunchの実行結果を見ると、abc順に変数config(default.yamlに記述した6つの変数)が表示されているのが分かります。

 * /ca_driver/base_frame: base_footprint
 * /ca_driver/dev: /dev/ttyUSB0
 * /ca_driver/latch_cmd_duration: 0.2
 * /ca_driver/loop_hz: 10.0
 * /ca_driver/odom_frame: odom
 * /ca_driver/publish_tf: True

nodeタグはroslaunchコマンドで実行するノードを記述します。

  <node name="ca_driver" pkg="ca_driver" type="ca_driver" output="screen">
    <rosparam command="load" file="$(arg config)" />
    <param name="robot_model" value="CREATE_2" />
  </node>
  • name

    • ROS上に登録されるノードの名称
  • pkg

    • 実行するノードが属しているパッケージの名称
  • type

    • 実行するノードの名称

ここではca_driverパッケージのca_driverノードの実行が指定されています。(ca_driver/ca_driver)

また、create_autonomy/ca_description/launch/create_2.launchにおいては、robot_state_publisherパッケージのrobot_state_publisherノードの実行も指定されています。(robot_state_publisher/robot_state_publisher)

前回のroslaunchの実行結果を見ると、この2つの-nameで付けた名称が実行ノードにあるのが分かります

NODES
  /
    ca_driver (ca_driver/ca_driver)
    robot_state_publisher (robot_state_publisher/robot_state_publisher)

タグ内では先述したrosparamタグとparamタグも実行されています。
paramタグもROSノードに値を渡すために使います。
rosparamはリストの設定やyamlファイルの読み込みができる点が、paramと異なります。
ROSノードがどのようにして、ここで設定した値を受け取っているかは後述します。

rosparamとparamについて詳細は以下の解説をご参照ください。
ROS講座78 rosparamを使う

ROSノード

ca_driverパッケージのca_driverノードで何をしているか調べてみます。
本記事では主にクラスCreateDriverのコンストラクタを扱います。

create_driver.cpp
create_driver.h

パラメータの設定

クラスCreateDriverのプライベート変数 ros::NodeHandle priv_nh_ (create_driver.hの121行目)を、launchファイルで設定した変数の値を受け取るのに使います。

priv_nh_はpriv_nh_("~")で初期化されています。(create_driver.cppの36行目)。

ros::NodeHandle::paramでパラメータの登録を行っています。詳細は「roscpp_tutorials/Tutorials/Parameters」の1.1.2 param()をご参照ください。

create_driver.cpp_43行目
  priv_nh_.param<std::string>("dev", dev_, "/dev/ttyUSB0");
  priv_nh_.param<std::string>("robot_model", robot_model_name, "CREATE_2");
  priv_nh_.param<std::string>("base_frame", base_frame_, "base_footprint");
  priv_nh_.param<std::string>("odom_frame", odom_frame_, "odom");
  priv_nh_.param<double>("latch_cmd_duration", latch_duration_, 0.2);
  priv_nh_.param<double>("loop_hz", loop_hz_, 10.0);
  priv_nh_.param<bool>("publish_tf", publish_tf_, true);

<>で変数の型を指定しています。
launchファイルから第1引数の名称の変数を探し、その値を第2引数に代入します。もし第1引数の名称がなかった場合は、代わりに第3引数の値を第2引数に代入します。

例えば最初の行は、launchファイルから"dev"という名前の変数を探します。configにはdevがあり、"/dev/ttyUSB0"で初期化されているので、その値をdev_に代入します。
もしlaunchファイルのdefault.yamlからdevを削除すれば、devは見つからないので、第3引数の"/dev/ttyUSB0"がdev_に代入されます。

他のパラメータも同様に設定されています。

ROS logger

前回にバッテリーの残量を表示していたのは、ROS Loggerの機能でした。

create_driver.cpp_87行目
  // Show robot's battery level
  ROS_INFO("[CREATE] Battery level %.2f %%", (robot_->getBatteryCharge() / robot_->getBatteryCapacity()) * 100.0);

ROS loggerはデバッグ情報を表示する仕組みです。幾つかの種類があり、デバッグ情報の種類別に使い分けます。詳細は以下をご参照ください。

ROS講座06 ROS Logger

次にすること

前回において、roslaunchの実行により確認したパラメータやバッテリー残量は、以上の仕組みにより表示されたものでした。

次回は引き続きca_driverノードのコードを読み、PublisherとSubscriberの使い方を調べたいと思います。

関連する記事

(1)準備
(3)rostopic

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3