はじめに
シェル芸とROS 2を組み合わせておもしろいことができないか挑戦してみようと思います。今回はシェル芸でturtlesim
を動かして遊んでみます。
シェル芸のトップページ
シェル芸の情報はこちらです。
ROS 2 Humbleの公式ドキュメント
ROS 2 Humbleの情報はこちらです。
参考記事 : ROS コマンドラインツール シェル芸
ROS 1のコマンドでシェル芸を行っている方の記事があります。
やりたいこと
シェル芸でturtlesim
を綺麗に動かしたいです。
ROS 2のインストール
Tiryohさんのros2_setup_scripts_ubuntu
を使えばROS 2を簡単にインストールができます(ありがとうございます!)。
1. 螺旋を描く
それではさっそくシェル芸でturtlesim
を遊んでみます。
端末1で次のコマンドを実行して、turtlesim
ノードを起動します。
ros2 run turtlesim turtlesim_node
端末2で次のコマンドを実行して、螺旋を描くように亀を動かします。
awk 'BEGIN{for(i=1.0;i<10.0;i+=0.1){print i}}' | xargs -I@ ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: @, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 2.0}}"
実行結果は以下の画像の通りです。
綺麗なグルグルが描けました。
2. 複数の亀の出し方
turtlesim
の/spawn
サービスをcall
すれば複数の亀を出すことができます。下記のコマンドを実行すると、中央に亀が出現します。x
とy
が亀の位置、theta
が亀の姿勢です。
ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.5, y: 5.5, theta: 0.0}"
3. 複数の亀を出して動かす
それでは複数の亀を出して、いい感じに動かしてみます。
端末1で次のコマンドを実行して、turtlesim
ノードを起動します。
ros2 run turtlesim turtlesim_node
端末2で次のコマンドを実行して、14匹の亀を角度をずらして出現させます。
awk 'BEGIN{for(i=0.0; i<6.28; i+=0.5){print i}}' | xargs -I@ ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.5, y: 5.5, theta: @}"
端末3で次のコマンドを実行して、それぞれの亀が螺旋を描くように動かします。
awk 'BEGIN{for(j=1;j<=14;j++){for(i=0;i<=10;i++){print j,i}}}' | xargs -n2 bash -c 'ros2 topic pub --once /turtle$0/cmd_vel geometry_msgs/msg/Twist "{linear: {x: $1, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.0}}"'
実行結果は以下の画像の通りです。
あまり綺麗ではないですが、螺旋は描けました。
4. ジグザグに動かす
螺旋以外の動きもやってみます。
端末1で次のコマンドを実行して、turtlesim
ノードを起動します。
ros2 run turtlesim turtlesim_node
端末2で次のコマンドを実行して、14匹の亀を角度をずらして出現させます。
awk 'BEGIN{for(i=0.0; i<6.28; i+=0.5){print i}}' | xargs -I@ ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.5, y: 5.5, theta: @}"
端末3で次のコマンドを実行して、亀をジグザグに動かします。
awk 'BEGIN{for(j=1;j<=14;j++){for(i=0;i<20;i++){if(i%2==0){print j,0.0,1.0}else{print j,0.0,-1.0}print j,1.0,0.0}}}' | xargs -n3 bash -c 'ros2 topic pub --once /turtle$0/cmd_vel geometry_msgs/msg/Twist "{linear: {x: $1, y: $2, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"'
実行結果は以下の画像の通りです。
またしてもあまり綺麗ではありませんが、ジグザグを描くことができました。
おわりに
シェル芸でROS 2のturtlesim
を遊びました。もっと綺麗な模様を描きたかったのですが、意外と難しいようです。またいつか挑戦したいですね。
参考記事
xargsで引数を二つ以上取る方法はこちらの記事を参考にさせていただきました。