YusukeKatoブログ

ROS 2シェル芸:URDFを置換してRVizで表示する

記事投稿日: 2024年12月01日(日)

最終更新日: 2024年12月06日(金)

目次

はじめに

アドベントカレンダーについて

この記事はQiitaのROS 2 Advent Calendar 2024の18日目の記事です。 12月1日から12月25日まで毎日ROS 2に関係した記事が投稿されるはずなので、そのほかの記事については下記のリンクからカレンダーをご確認ください。

ROS 2 Advent Calendar 2024

記事の概要

この記事ではURDFを置換してRVizで表示して遊ぶシェル芸を紹介します。 やはりROS 2においてURDFは必要不可欠な要素ではありますが、 イマイチどうやっていじっていいのかよく分からないことも多々あります。 また、無理やりでもいいからURDFを書き換えたいというケースもあるかもしれません。 そこで今回はとりあえずURDFを書き換えてみて、後のことはそれから考えようというコンセプトでやっていきます。 ぜひお付き合いいただけると嬉しいです。

とはいえ本題に入る前に、まずはあらゆる読者を想定してそれぞれのキーワードを簡単に説明しておきます。

ROS 2とは何か

ROSはRobot Operating Systemの略称で、ロボットを動かすためのミドルウェアです。 豊富なライブラリやツール、コミュニティなどが備わっていてとても便利だと思います。 詳しくは下記の公式ドキュメントをご覧ください。

ROS 2 Documentation

シェル芸とは何か

シェルのワンライナーで様々なタスクをこなすことを指します。 詳しい定義や情報については下記のページをご覧ください。

シェル芸のトップページ

URDFとは何か

URDFはUnified Robot Description Formatの略称で、ロボットの情報を記述するためのXML形式のフォーマットのことです。主にROSで使われています。

URDFのwikiページ

参考資料

下記が参考資料です。

Qiita - ROS コマンドラインツール シェル芸 Qiita - turtlesimの亀をなるべく簡単にたくさん出したい Qiita - シェル芸で遊ぶROS 2

URDFを置換してRVizで表示する

それではさっそく始めていこうと思います。

最低限のURDFを作成

まずは下記の内容をコピペしてcube.urdfを作成します。 不完全なURDFかもしれませんが、とりあえずはこれで遊べます。

<robot name="cube">
  <link name="cube_link">
    <visual>
      <geometry>
        <box size="1 1 1"/>
      </geometry>
    </visual>
  </link>
</robot>

RVizでURDFを表示

作成したcube.urdfをRVizで表示してみます。 robot_state_publisherにcube.urdfを渡すことで、robot_descriptionトピックとtfトピックを配信してくれます。

端末1で実行

ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:="$(cat cube.urdf)"

端末2で実行

rviz2

RVizが起動したらAddボタンをクリックしてBy display typeからRobotModelを追加します。その後、追加されたRobotModelDescription Topicrobot_descriptionを選択します。

下記の画像のように白い立方体が表示されたら成功です(tf関連でエラーが出ているかと思いますが無視します)。

RVizの様子

立方体をちょっと伸ばす

それでは本題のシェル芸によるURDFの置換です。 ここでは下記のコマンドを実行して立方体のX軸方向のサイズを1から2に置換します。

端末3で実行

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

下記がコマンドの簡単な解説です。

下記のGIF画像のように立方体が少し伸びたら成功です。

ちょっと伸びる様子

立方体をもっと伸ばす

次に応用として立方体をもっと伸ばしてみます。 先ほどの置換の処理を少し書き換えた下記のコマンドを実行します。

端末3で実行

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まで順番に置換しています。

awk '{for(i=1;i<=9;i++){sub(1,i);print $0;sub(i,1)}}'

下記のGIF画像のように立方体がもっと伸びたら成功です。

RVizでもっと伸ばした様子

色の置換にも挑戦

最後に、立方体の色を置換することにも挑戦してみます。 しかしros2 topic pubだとうまくいかなかったので、 ros2 param setを使用します。

URDFを作成

まずは下記のようなcube2.urdfを作成します。

<robot name="cube">
  <link name="base_link"/>
  <link name="cube_link">
    <visual>
      <geometry>
        <box size="1.0 1.0 1.0"/>
      </geometry>
      <material name="color">
        <color rgba="1.0 0.0 0.0 1.0"/>
      </material>
      <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
    </visual>
  </link>
  <joint name="cube_joint" type="fixed">
    <parent link="base_link"/>
    <child  link="cube_link"/>
  </joint>
</robot>

RVizでURDFを表示

作成したcube2.urdfをRVizで表示します。 方法は先ほどの立方体を伸ばした時と同じです。

端末1で実行

ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:="$(cat cube2.urdf)"

端末2で実行

rviz2

立方体を伸ばした時と同じようにRViz上で設定を行って下記のように赤い立方体を表示できたら成功です。 ただし、Fixed Framebase_linkを指定します(エラーも消えるかと思います)。

RVizの様子

色を置換

ros2 param setの使い方は下記の通りです。

ros2 param set /robot_state_publisher robot_description "$(cat cube2.urdf)"

下記のコマンドを実行すると色の値が置換されます(シェル芸ではないかもです)。

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画像のように立方体の色が変われば成功です。

色置換の様子

おわりに

以上、URDFを置換してRVizで表示するシェル芸の紹介でした。 正しい行いかはさておき、URDFを書き換えたい際には何かしら参考になると嬉しい限りです。 まだまだURDFに限らずROS 2は分からないことだらけではありますが、 遊びながら学んでいけたらと思います。 ここまで読んでいただき誠にありがとうございました。 それでは、また。

お知らせ

過去のお知らせ

シリーズ記事一覧

各シリーズの記事を下記にまとめてあります。

我が家のインコ「れもん&ぽぽ&ぐぐ&さん」の日記 我が家のインコ「れもん&ぽぽ&ぐぐ&さん」の日記24 : 2026年もよろしくお願いします 我が家のインコ「れもん&ぽぽ&ぐぐ&さん」の日記23 : 2025年の我が家のインコ 我が家のインコ「れもん&ぽぽ&ぐぐ&さん」の日記22 : 我が家にさんちゃんがやってきた 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記21 : 2ヶ月ぶりのインコ日記 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記20 : 久しぶりのインコ日記 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記19 : 鳥フェス浅草2025に行ってきました! 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記18 : 2024年に感謝&2025年もよろしくお願いします 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記17 : れもんもぐぐも平和な日々を送っています 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記16 : れもんが本に掲載されたり、愛鳥祭に行ったりなど 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記15 : 落花生、新聞紙、れもんとぐぐの邂逅 インコの飼い方と注意点(2024年版) 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記14 : 大人に近づくれもんと遊ぶ余裕が出てきたぐぐ 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記13 : 生後4ヶ月を迎えたれもんと我が家に慣れてきたぐぐ 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記12 : ぽぽが亡くなりました、そしてぐぐがやってきました インコ仲間「れもん&ぽぽ」の日記11 : ズグロシロハラインコのぽぽ、我が家へ セキセイインコ「れもん」の日記10 : 生後100日のれもん、ついに喋る セキセイインコ「れもん」の日記9 : 換羽期のれもん セキセイインコ「れもん」の日記8 : 病院へ挑戦! セキセイインコ「れもん」の日記7 : 外出用ゲージにチャレンジ! セキセイインコ「れもん」の日記6 : 新宿ことり博に行ってきました! セキセイインコ「れもん」の日記5 : 3週間経って順調に成長している模様 セキセイインコ「れもん」の日記4 : 鳥フェス千葉2024に行ってきました! セキセイインコ「れもん」の日記3 : 2週間経って我が家にも慣れてきた模様 セキセイインコ「れもん」の日記:第2回 セキセイインコの「れもん」が我が家にやってきました!
AlpacaHackで始めるCTF入門 AlpacaHackで始めるCTF入門7:AlpacaHack Round 5 - XorshiftStreamに挑戦 AlpacaHackで始めるCTF入門6:AlpacaHack Round 4 - Simple Flag Checkerに挑戦 AlpacaHackで始めるCTF入門5:AlpacaHack Round 3 - qrimeに挑戦 AlpacaHackで始めるCTF入門4:AlpacaHack Round 2 - Simple Loginに挑戦 AlpacaHackで始めるCTF入門3:初めてのCTFに参加 AlpacaHackで始めるCTF入門2:DreamhackでCTF入門 AlpacaHackで始めるCTF入門1:初めてのCTF
シェル芸 シェル芸オンラインジャッジ:シェル芸実行用コンテナを常に待機させておく シェル芸オンラインジャッジ:システム全体をDockerコンテナ内で動かす Dockerコンテナのリソースの制限を設定【シェル芸オンラインジャッジ】 Google AI Studioで自作のウェブサイトの改善点を教えてもらった シェル芸オンラインジャッジの紹介 第66回シェル芸勉強会メモ 第64回シェル芸勉強会メモ ChatGPTでシェル芸勉強会の問題が解きたい シェル芸botで遊びたい(Bash)
シェル芸オンラインジャッジ シェル芸オンラインジャッジ:シェル芸実行用コンテナを常に待機させておく シェル芸オンラインジャッジ:システム全体をDockerコンテナ内で動かす Dockerコンテナのリソースの制限を設定【シェル芸オンラインジャッジ】 Google AI Studioで自作のウェブサイトの改善点を教えてもらった シェル芸オンラインジャッジの紹介
ROS 2 ROS 2シェル芸:URDFを置換してRVizで表示する 改訂新版『ROS 2ではじめよう』を読了&メモ書き ROS 2 Jazzy公式チュートリアル02: ROS 2のノードとトピックについて ROS 2 Jazzy公式チュートリアル01: ROS 2 Jazzyのインストールから動作確認まで ROS 2 Humble 公式チュートリアル 02: ROS 2 のノード関係のコマンド ROS 2 Humble 公式チュートリアル 01: 環境構築から turtlesim まで
VRChat Meta Quest 2でVRChatをプレイしてみる 【VRChat】UnityとBlenderでアバターのパーツを作る VRChatのワールド「森の中のログハウス」をUnityで作成してアップロードするまで VRChatでワールドをパブリック(コミュニティーラボ)へアップロードする VRChatのアバターにGoGo Locoを導入して座ったり寝っ転がったりする VRChatのワールドでオブジェクトと変数の同期を行う VRChatのスマホアプリ(Android)用にアバターをアップロードする Modular Avatarを使ってVRChatのアバターのオブジェクトをワールドに固定する VRChatのアバターのオブジェクトにアニメーションを設定する 【VRChat】Modular Avatarを使ってアバターのオブジェクトの表示と非表示を切り替える 公開されているVRMモデルをVRChatで動かす
技術ネタ WSL2で開いたVisual Studio Codeで日本語入力が不安定になる問題の解決 TouchDesignerを使って曲の音声に合わせた動画を作成してみる Sonic Piで作曲してみる Visual Studio CodeでGitHub Copilot使用時にGitHubにサインインできない問題を解決 Unityでブラウザゲーム(Webアプリ)を作成してレンタルサーバで動かす方法 echoコマンドで"-n"をそのまま出力したい Ubuntu 24.04 LTSにおいてノートPCを電源に接続していない状態だと画面が暗くなる問題の解決方法 HTMLのvideoタグで貼った動画のサムネイルがSafariで表示されない問題を解決 WSL2上のUbuntuのVimで矩形選択するための設定 HTMLとCSSで画像のスライドショーを作成 GitHub Actionsでサーバ上のブログを自動更新 Windows と Ubuntu のデュアルブート
ELDEN RING BLOG ELDEN RING BLOG 10: DLCをクリアしました! ELDEN RING BLOG 9: DLCに挑戦した ELDEN RING BLOG 8: 最後のボスを倒した ELDEN RING BLOG 7: ラニのストーリーを進めた ELDEN RING BLOG 6: 四体目と五体目の大ボスを倒した ELDEN RING BLOG 5: 三体目の大ボスを倒した ELDEN RING BLOG 4: 二体目の大ボスを倒した ELDEN RING BLOG 3: 一体目の大ボスを倒した ELDEN RING BLOG 2: レベル上げと武器強化の旅 ELDEN RING BLOG 1: 今更ながら始める初見ELDEN RING冒険日記
ELDEN RING NIGHTREIGN BLOG ELDEN RING NIGHTREIGN BLOG 3: 喰らいつく顎を倒した ELDEN RING NIGHTREIGN BLOG 2: 最初の標的を倒した ELDEN RING NIGHTREIGN BLOG 1: マルチプレイ初戦
ポケポケブログ ポケポケブログ4:「超克の光」環境でもベトベトンデッキはまだ強い ポケポケブログ3:「時空の激闘」環境でもベトベトンデッキを使いたい ポケポケブログ2:「幻のいる島」環境でもベトベトンデッキが強いです ポケポケブログ1:ベトベトン+マタドガスデッキをおすすめする
読書日記 読書日記:山崎ナオコーラ『人のセックスを笑うな』(河出文庫) 読書日記:プジェ日記を読みました! 読書日記『本を読んだことがない32歳がはじめて本を読む』【ネタバレあり】 読書日記:近畿地方のある場所について【ネタバレあり】 改訂新版『ROS 2ではじめよう』を読了&メモ書き
映画日記 映画日記『ラストマイル』感想【ネタバレあり】
料理日記 料理日記:オムライス 料理日記:豆腐春巻き 料理日記:鶏肉とナスのほりにし炒め 料理日記:卵焼き 料理日記:鶏肉の照り焼き&小松菜のおひたし 料理日記:納豆蕎麦 料理日記:ローストビーフ 料理日記:バターガーリックチキン
その他 JR東日本公式のお忘れ物チャットにお世話になった話 『Omega Crafter』プレイ日記: チュートリアル編 自作ブログ大改造計画 HTML数式表示テスト 自作ブログ開始

YusukeKatoブログの著作物はCC BY-NC-ND 4.0で公開されています。
YusukeKatoブログのソフトウェアはApache License 2.0で公開されています。
About License: GitHub - YusukeKatoBlog/LICENSE
© 2023 YusukeKato All Rights Reserved.