2020/10/21
ROS初級Tutorialを実施しました[Vol.1]
はじめに
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を使ってファイルを編集する」から続きをやってみようと思います。
以上です。
関連する記事
ROS2とPX4の連携環境準備
PX4とROS2の連携を試せる環境をUbuntu20.04で整えました
Ubuntu20.04のサーバーにkubeadmを使って開発用のk8sクラスターを作る
シングルサーバー(Ubuntu20.04)構成でオフィスLAN内に開発用のk8sクラスターを立ててみました
機械学習もできるデスクトップパソコンを自作しました
30万円するGPU(RTX3090)で自作PCを組立て、tensorflowのベンチマークを測ってみました。
[Ubuntu20.04]Gazebo simulator上のDroneをMAVROSを使って動かす
MAVROSを使ったTutorialを実際に動かしてみました