diff --git a/images/2024/20241201_1.jpg b/images/2024/20241201_1.jpg new file mode 100644 index 0000000..d31b1f2 Binary files /dev/null and b/images/2024/20241201_1.jpg differ diff --git a/images/2024/20241201_1.jpg.jpg b/images/2024/20241201_1.jpg.jpg new file mode 100644 index 0000000..aee4ba9 Binary files /dev/null and b/images/2024/20241201_1.jpg.jpg differ diff --git a/images/2024/20241201_2.gif b/images/2024/20241201_2.gif new file mode 100644 index 0000000..1294bc4 Binary files /dev/null and b/images/2024/20241201_2.gif differ diff --git a/images/2024/20241201_2.gif.gif b/images/2024/20241201_2.gif.gif new file mode 100644 index 0000000..f0040fa Binary files /dev/null and b/images/2024/20241201_2.gif.gif differ diff --git a/images/2024/20241201_3.gif b/images/2024/20241201_3.gif new file mode 100644 index 0000000..bfb2437 Binary files /dev/null and b/images/2024/20241201_3.gif differ diff --git a/images/2024/20241201_3.gif.gif b/images/2024/20241201_3.gif.gif new file mode 100644 index 0000000..2c7b0a4 Binary files /dev/null and b/images/2024/20241201_3.gif.gif differ diff --git a/images/2024/20241201_4.jpg b/images/2024/20241201_4.jpg new file mode 100644 index 0000000..edb2b8e Binary files /dev/null and b/images/2024/20241201_4.jpg differ diff --git a/images/2024/20241201_4.jpg.jpg b/images/2024/20241201_4.jpg.jpg new file mode 100644 index 0000000..ab107d0 Binary files /dev/null and b/images/2024/20241201_4.jpg.jpg differ diff --git a/images/2024/20241201_5.gif b/images/2024/20241201_5.gif new file mode 100644 index 0000000..44f1121 Binary files /dev/null and b/images/2024/20241201_5.gif differ diff --git a/images/2024/20241201_5.gif.gif b/images/2024/20241201_5.gif.gif new file mode 100644 index 0000000..ac24222 Binary files /dev/null and b/images/2024/20241201_5.gif.gif differ diff --git a/markdown/2024/1201.md b/markdown/2024/1201.md new file mode 100644 index 0000000..0922610 --- /dev/null +++ b/markdown/2024/1201.md @@ -0,0 +1,225 @@ +# メタデータ +- title=ROS 2シェル芸:URDF置換 +- description=QiitaのROS 2 Advent Calendar 2024の18日目の記事として、URDFを置換するシェル芸を紹介します。 +- date=2024年12月01日(日) +- update=2024年12月06日(金) +- math=false +- tag=ros2 + +## はじめに +### 記事の概要 +この記事はQiitaのROS 2 Advent Calendar 2024の18日目の記事です。 +12月1日から12月25日まで毎日ROS 2に関係した記事が投稿されるはずなので、そのほかの記事については下記のリンクからカレンダーをご確認ください。 + +https://qiita.com/advent-calendar/2024/ros2 + +ROS 2 Advent Calendar 2024 + +この記事ではURDFを置換してRVizで表示して遊ぶシェル芸を紹介します。 +やはりROS 2においてURDFは必要不可欠な要素ではありますが、 +イマイチどうやっていじっていいのかよく分からないことも多々あります。 +また、無理やりでもいいからURDFを書き換えたいというケースもあるかもしれません。 +そこで今回はとりあえずURDFを書き換えてみて、後のことはそれから考えようというコンセプトでやっていきます。 +ぜひお付き合いいただけると嬉しいです。 + +とはいえ本題に入る前に、まずはあらゆる読者を想定してそれぞれのキーワードを簡単に説明しておきます。 + +### ROS 2とは何か +ROSはRobot Operating Systemの略称で、ロボットを動かすためのミドルウェアです。 +豊富なライブラリやツール、コミュニティなどが備わっていてとても便利だと思います。 +詳しくは下記の公式ドキュメントをご覧ください。 + +https://docs.ros.org/en/jazzy/ + +ROS 2 Documentation + +### シェル芸とは何か +シェルのワンライナーで様々なタスクをこなすことを指します。 +詳しい定義や情報については下記のページをご覧ください。 + +https://b.ueda.tech/?page=01434 + +シェル芸のトップページ + +### URDFとは何か +URDFはUnified Robot Description Formatの略称で、ロボットの情報を記述するためのXML形式のフォーマットのことです。主にROSで使われています。 + +https://wiki.ros.org/urdf + +URDFのwikiページ + +### 参考資料 +下記が参考資料です。 + +https://qiita.com/yami_buta/items/2b514dc469f364be36ba + +Qiita - ROS コマンドラインツール シェル芸 + +https://qiita.com/ykpages/items/07efa0d0d81e6d261747 + +Qiita - turtlesimの亀をなるべく簡単にたくさん出したい + +https://qiita.com/ykpages/items/fd99751f176f3e3b5c27 + +Qiita - シェル芸で遊ぶROS 2 + +## URDFを置換してRVizで表示する +それではさっそく始めていこうと思います。 + +### 最低限のURDFを作成 +まずは下記の内容をコピペしてcube.urdfを作成します。 +不完全なURDFかもしれませんが、とりあえずはこれで遊べます。 +```xml + + + + + + + + + +``` + +### RVizでURDFを表示 +作成したcube.urdfをRVizで表示してみます。 +robot_state_publisherにcube.urdfを渡すことで、robot_descriptionトピックとtfトピックを配信してくれます。 + +端末1で実行 +```sh +ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:="$(cat cube.urdf)" +``` + +端末2で実行 +```sh +rviz2 +``` + +RVizが起動したら`Add`ボタンをクリックして`By display type`から`RobotModel`を追加します。その後、追加された`RobotModel`の`Description Topic`で`robot_description`を選択します。 + +下記の画像のように白い立方体が表示されたら成功です(tf関連でエラーが出ているかと思いますが無視します)。 + +![](../../images/2024/20241201_1.jpg) + +RVizの様子 + +### 立方体をちょっと伸ばす +それでは本題のシェル芸によるURDFの置換です。 +ここでは下記のコマンドを実行して立方体のX軸方向のサイズを1から2に置換します。 + +端末3で実行 +```sh +ros2 topic echo --once /robot_description | sed 's/"/\\"/g' | awk 'NR==1' | sed "s/1/2/" | xargs -I@ ros2 topic pub --once /robot_description std_msgs/msg/String "@" --qos-durability transient_local +``` + +下記がコマンドの簡単な解説です。 +- ros2 topic echo --once /robot_description: robot_descriptionトピックを一度だけ出力 +- sed 's/"/\\"/g': URDFを正しくパースできるように、ダブルクウォートをエスケープして消えないようにする +- awk 'NR==1': 一行目だけを出力 +- sed "s/1/2/": 最初の1(x軸方向のsize)を2に置換 +- xargs -I@ ros2 topic pub --once /robot_description std_msgs/msg/String "@": 置換したURDFをrobot_descriptionトピックとして配信 +- --qos-durability transient_local: QoSのオプション。パブリッシャ側で一時的にデータを保存してサブスクライバ側が受け取るタイミングを調整できるらしい(これをつけないとうまく動かなかった) + +下記のGIF画像のように立方体が少し伸びたら成功です。 + +![](../../images/2024/20241201_2.gif) + +ちょっと伸びる様子 + +### 立方体をもっと伸ばす +次に応用として立方体をもっと伸ばしてみます。 +先ほどの置換の処理を少し書き換えた下記のコマンドを実行します。 + +端末3で実行 +```sh +ros2 topic echo --once /robot_description | sed 's/"/\\"/g' | awk 'NR==1' | awk '{for(i=1;i<=9;i++){sub(1,i);print $0;sub(i,1)}}' | xargs -I@ ros2 topic pub --once /robot_description std_msgs/msg/String "@" --qos-durability transient_local +``` + +置換の処理を下記のように書き換えました。 +ここではawkのfor文でX軸方向のsizeを1から9まで順番に置換しています。 + +```sh +awk '{for(i=1;i<=9;i++){sub(1,i);print $0;sub(i,1)}}' +``` + +下記のGIF画像のように立方体がもっと伸びたら成功です。 + +![](../../images/2024/20241201_3.gif) + +RVizでもっと伸ばした様子 + +## 色の置換にも挑戦 +最後に、立方体の色を置換することにも挑戦してみます。 +しかしros2 topic pubだとうまくいかなかったので、 +ros2 param setを使用します。 + +### URDFを作成 +まずは下記のようなcube2.urdfを作成します。 +```xml + + + + + + + + + + + + + + + + + + +``` + +### RVizでURDFを表示 +作成したcube2.urdfをRVizで表示します。 +方法は先ほどの立方体を伸ばした時と同じです。 + +端末1で実行 +```sh +ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:="$(cat cube2.urdf)" +``` + +端末2で実行 +```sh +rviz2 +``` + +立方体を伸ばした時と同じようにRViz上で設定を行って下記のように赤い立方体を表示できたら成功です。 +ただし、`Fixed Frame`は`base_link`を指定します(エラーも消えるかと思います)。 + +![](../../images/2024/20241201_4.jpg) + +RVizの様子 + +## 色を置換 +ros2 param setの使い方は下記の通りです。 +```sh +ros2 param set /robot_state_publisher robot_description "$(cat cube2.urdf)" +``` + +下記のコマンドを実行すると色の値が置換されます(シェル芸ではないかもです)。 +```sh +for i in {9..0};do sed -i "s/rgba=\"[0-9]*.[0-9]*/rgba=\"0.$i/" cube2.urdf;ros2 param set /robot_state_publisher robot_description "$(cat cube2.urdf)";done +``` + +ここではcube2.urdfを直接置換しています。 + +下記のGIF画像のように立方体の色が変われば成功です。 + +![](../../images/2024/20241201_5.gif) + +色置換の様子 + +## おわりに +以上、URDFを置換してRVizで表示するシェル芸の紹介でした。 +正しい行いかはさておき、URDFを書き換えたい際には何かしら参考になると嬉しい限りです。 +まだまだURDFに限らずROS 2は分からないことだらけではありますが、 +遊びながら学んでいけたらと思います。 +ここまで読んでいただき誠にありがとうございました。 +それでは、また。