2020/10/21

ROS初級Tutorialを実施しました[Vol.1]

rosubuntu

はじめに

ROSの入門編です。

DroneのROSを使ったSimulationを実施したかったのですが、ROS自体ほとんど触ったことがなかったため、概要を把握する必要があるなと強く感じたため、ROSのチュートリアルをやることに決めました。

※ 本記事はDronecodeとは全くと言っていいほど関係ないです🙇‍♂️

動作環境

key value
OS Ubuntu 20.04(Desktop)
CPU Intel Core i7-4600U

ROS環境のインストールとセットアップ

ROSのインストール

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
$ sudo apt update
$ sudo apt install ros-noetic-desktop-full
$ echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

Workspaceの作成

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
$ cd ..
$ catkin_make
# これはdirenv使うと良いかも
$ source ~/catkin_ws/devel/setup.bash
$ echo $ROS_PACKAGE_PATH
# make sure your workspace is in the ROS_PACKAGE_PATH env var.
/home/yourname/catkin_ws/src:/opt/ros/noetic/share

Packageの作成

$ cd ~/catkin_ws/src
# std_msgs, roscpp, rospyに依存した新しいパッケージを'beginner_tutorials'という名前で作ります
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
  • ~/catkin_ws/src/beginner_tutorials/package.xmlを以下のように編集します
<?xml version="1.0"?>
<package format="2">
  <name>beginner_tutorials</name>
  <version>0.0.0</version>
  <description>The beginner_tutorials package</description>
  <maintainer email="[email protected]">Hiroki Tanaka</maintainer>
  <license>MIT</license>
  <author email="[email protected]">Hiroki Tanaka</author>
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>
</package>

再度ビルドしてみます

$ cd ~/catkin_ws/
$ catkin_make
# buildの途中で以下のようにbeginner_tutorialsのものが利用されているのがわかります
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- ~~  traversing 1 packages in topological order:
-- ~~  - beginner_tutorials
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- +++ processing catkin package: 'beginner_tutorials'
-- ==> add_subdirectory(beginner_tutorials)

ROS NodeとTopic

  • ros-noetic-ros-tutorials をインストールします
$ sudo apt-get install -y ros-noetic-ros-tutorials
  • roscore を起動します
$ roscore
  • rosnode の確認
$ rosnode list
/rosout

$ rosnode info /rosout
Node [/rosout]
Publications:
 * /rosout_agg [rosgraph_msgs/Log]

Subscriptions:
 * /rosout [unknown type]

Services:
 * /rosout/get_loggers
 * /rosout/set_logger_level

contacting node http://your-hostname:54614/ ...
Pid: 18715
  • turtlesim を起動して rosnodeに対してpingしてみます
$ rosrun turtlesim turtlesim_node
$ rosnode list
/rosout
/turtlesim
$ rosnode ping turtlesim
pinging /turtlesim with a timeout of 3.0s
xmlrpc reply from http://your-hostname:35733/     time=0.510931ms
xmlrpc reply from http://your-hostname:35733/     time=1.281738ms
....
  • turtleの操作

以下のコマンドを叩いて、矢印キーでsimulatorに表示されている亀が動くことを確認しました

$ rosrun turtlesim turtle_teleop_key
Reading from keyboard
---------------------------
Use arrow keys to move the turtle. 'q' to quit.
  • turtleに使用されていたTopicを見る
# rqt_graphをインストール
$ sudo apt-get install -y ros-noetic-rqt ros-noetic-rqt-common-plugins

# rqt_graphを起動
$ rosrun rqt_graph rqt_graph
# /turtle1/cmd_velというトピックを確認

$ rostopic echo /turtle1/cmd_vel
# turtle_teleop_keyを動作させているターミナルで矢印キーを入力すると以下のようなデータが確認できました
linear:
  x: 0.0
  y: 0.0
  z: 0.0
(以下略)
  • ROS messageの確認
$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z
  • 手動でROSトピックにメッセージを送信
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
# 亀が動くことを確認
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
# 亀が円運動を続けることを確認
  • rqt_plot を表示して更新感覚を表示
$ rosrun rqt_plot rqt_plot
# /turtle1/pose を追加すると /turtle1/pose/x /turtle1/pose/y /turtle1/pose/thetaなどが一括で表示されました

ROSサービス

“サービスはノードが他のノードとお互いに通信するための1つの手段です.サービスはノードがリクエストを送り,レスポンスを受け取れるようにします.”

  • ROSトピックは一方的だったのに対して、レスポンスが帰ってくる感じ?でしょうか。
  • RPCアプリみたいなものかなと想像しつつ、作業を進めていきます。
# serviceの一覧を表示します
$ rosservice list
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level

# serviceの型を表示します
$ rosservice type clear
std_srvs/Empty  # リクエストパラメータ不要&レスポンスデータなしを意味する

# clearサービスを実行
$ rosservice call clear  # カメの軌跡がクリアされることを確認

# spawnサービスのインターフェースを確認
$ rosservice type spawn
turtlesim/Spawn
$ rossrv show turtlesim/Spawn
float32 x
float32 y
float32 theta
string name
---
string name

# spawnサービスを実行
$ rosservice call spawn
# 引数がないとエラーになります
Usage: rosservice call /service [args...]
rosservice: error: Please specify service arguments
# 改めて実行
$ rosservice call spawn 2 2 0.2 ""
name: turtle2  # もう一匹カメが出現しました。(turtle2という名前で追加されたようです)

# rosparamを使ってみます
$ rosparam list
/rosdistro
/roslaunch/uris/your_host_name__38713
/rosversion
/run_id
/turtlesim/background_b
/turtlesim/background_g
/turtlesim/background_r

# ros parameterを取得してみます
$ rosparam get /turtlesim/background_r
69
# ros parameterを設定してみます
$ rosparam set /turtlesim/background_r 150
$ rosservice call clear  # 背景色が変わったことを確認しました
# 全パラメーターを取得してみます
$ rosparam get /

参考

要点

  • ROSサービスはROS上でのいわゆるServerプログラムみたいな感じで、呼び出すと処理をして結果を返すような感じのようです
  • ROSパラメータはROS上で共有されている設定ファイルを読み書きできる(キーバリューストア)サーバーみたいなもののようです

roslaunch

$ roscd beginner_tutorials
$ mkdir launch && cd launch
# launchファイルを作成します
$ cat <<EOF > turtlemimic.launch
<launch>
  <group ns="turtlesim1">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>
  <group ns="turtlesim2">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>
  <node pkg="turtlesim" name="mimic" type="mimic">
    <remap from="input" to="turtlesim1/turtle1"/>
    <remap from="output" to="turtlesim2/turtle1"/>
  </node>
</launch>
EOF
# launchファイルを使って起動します
$ roslaunch beginner_tutorials turtlemimic.launch

# turtlesim1に対してのみtopicを送信してみます
$ rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'  # turtlesim1だけにコマンドを送っているのにも関わらず, 2つのturtlesimが動き出すのが確認できました

# rqtで確認します
$ rqt
# Plugins > Introspection > Node Graphで確認できます
  • 複数のnodeやその関係をまとめて起動するのに便利そうでした。

もう不要みたいなので、このタイミングで、turtlesimを起動しているターミナルのタブを全てCtrl+Cで終了しておきました。

長くなりそうなので、いったん本記事ではここで終了して、「ROSでrosedを使ってファイルを編集する」から続きをやってみようと思います。

以上です。