kakepro’s blog

プログラムとかPC周りのことを書いていきます

【ROS入門】亀で遊ぶ

はじめに

・環境
Windows 10 Home 21H2

WSL2

Intel(R) Core(TM) i5-4200U CPU @ 1.60GHz

・ROS melodicのインストール
下記記事を参照のこと
kakepro.hatenablog.com

・ここでやること
亀で遊びながら以下のやり取りについて雰囲気を理解する
Node:ROSで動かすプロセス
Topic:Node間で送受信するデータ
Publish:Topicの送信
Subscribe:Topicの受信

亀で遊んでみる

まず、roscoreを実行する
roscore

f:id:kakepro:20220327130728p:plain
roscore

このコマンドによりマスターが起動され、ノード間での通信が可能となる
ROSノードを使用する際は必ず実行する

続いて、別のターミナルで下記コマンドを実行する
rosrun turtlesim turtlesim_node
下記の通り亀が表示される*1*2
これはROSでロボット(亀)を動かすシミュレーターである

また新たなターミナルで下記コマンドを実行する
rosrun turtlesim turtle_teleop_key
このコマンドを実行したターミナル上で矢印キーを押すと亀が動く

f:id:kakepro:20220327132501p:plain
turtle_teleop

これは
・turtlesim_teleop_keyノードがキーボード入力をPublish
・turtlesimノードがそのデータをSubscribe
することで亀を動かしている

ノード、トピックの可視化ツール(rqt_graph)でそれを確認するため、新たなターミナルで下記コマンドを実行する
rqt_graph

f:id:kakepro:20220327132720p:plain
rqt_graph

teleop_turtleノードとturtlesimノードの間がcmd_velトピックで結ばれていることが確認できる*3
cmd_velは亀の速度に関するデータ(command_velocityの略)である

ここでrostopicコマンドを使用してcmd_velの中身を確認してみる
下記コマンドを実行してから先ほどのturtle_teleop_keyで亀を動かしてみよう
rostopic echo /turtle1/cmd_vel

f:id:kakepro:20220327133127p:plain
cmd_vel

linear(直線運動に関するデータ)とangular(回転速度に関するデータ)がそれぞれ3成分ずつ格納されていることが分かる
なお、ここで先ほどのrgt_graphの更新ボタンを押すとrostopicが追加されていることを確認できる

f:id:kakepro:20220327133344p:plain
rqt_graph_2

ここまでteleop_turtleノードで亀を動かしていたが、rostopicを利用して直接値をPublishすることもできるので試してみる
まずcmd_velトピックの型を調べるため、先ほどのrostopic echoをCtrl-cで終了し、下記コマンドを実行する
rostopic type /turtle1/cmd_vel

f:id:kakepro:20220327134306p:plain
rostopic_type

geometry_msgs/Twist型であることが分かったので下記コマンドで亀を動かしてみる
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0,0.0,0.0]' '[0.0,0.0,3.6]'

f:id:kakepro:20220327134445p:plain
turtlesim_pub

2.0がX方向の速度[m/s]、3.6がZ軸周りの回転速度[rad/s]である

なお亀の動きはすぐに止まってしまうので、動かし続けたい場合にはトピックを送り続ける必要がある
オプション -r 1を付けると1Hzの周期でトピックを送り続けることが可能である
rostopic pub -r 1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0,0.0,0.0]' '[0.0,0.0,3.6]'

*1:WSL2の場合は予めVcXsev等を立ち上げておく

*2:なお、rosrunコマンドは rosrun [package name] [node name] のように、パッケージ(プログラム群)とその中のノードを指定して実行する。 この場合はturtlesimパッケージからturtlesim_nodeを指定して実行している。

*3:楕円がノード、矢印がトピックを表す