🛖

ROS2の準備2: RASPBERRYにROS2をいれる。

に公開

前回の記事では単純にラズベリーパイにUBUNTUをインストールする方法を紹介しました。
https://zenn.dev/takeofuture/articles/e58703a74dd6ad
すでに手元では古いラップトップにUNUNTU24.04とRASPBERRY PI5にUbunu24.04がインストール済です。ここから、これらにROS2というロボットを操作するためにOS(OSというよりフレームワークのようにみえますが)をインストールする方法を紹介します。基本的にUbuntu24.04上にROS2をインストールするだけなので、ラップトップのUbuntu上でも、RaspberryのUbuntu上でも全く同じです。
前回はただラズベリーパイにUBUNTUをインストールする自分自身の奮闘を写真で解説しただけdすが、今回はPCとラズベリーパイにROS2をインストールしていきます。前回は説明していなかったですが、まずROS2とはなんなのか概要をまとめましたので記載します。

ROS2(Robot Operating System 2)ですが、これはロボットソフトウェアを作るためのミドルウェア/開発基盤です。
センサー、制御、認識、ナビゲーションなどを「部品(ノード)」として分割し、それらをメッセージ通信でつないで、複雑なロボットシステムを組み上げやすくします。
ROS2はROS(1)の後継で、産業用途・実運用をより意識して、通信・リアルタイム性・セキュリティ・マルチロボットなどを強化しています。

ROS2のまえにはROSといういわゆるROS1がありましたが、研究用途を中心に広がり、ロボット開発の“共通基盤”として普及しました。ただし、当初の設計は研究向け色が強く、リアルタイム・セキュリティ・産業利用・大規模分散などで課題があったそうです。そこで後継としてROS2が登場。通信基盤をROS独自からDDSベースに移し、QoSやセキュリティなどを取り込んで、実運用の要求に耐える土台を目指す流れになりました。

●ROS2の主要コンポーネント

*ノード(Node)

1つの機能単位(例:カメラドライバ、物体検出、経路計画、モータ制御)。

*トピック(Topic)

多対多の配信型通信(publish/subscribe)。センサ値や推定位置など「流れてくるデータ」に向く。

*サービス(Service)

要求→応答(request/response)。設定取得や単発の処理呼び出しに向く。

*アクション(Action)

時間のかかる処理(移動、把持など)を「途中経過・キャンセル可能」で扱う仕組み。

*メッセージ型(msg / srv / action)

通信のデータ構造定義。型が決まっているのでチーム開発が楽。

*DDS(通信基盤)

ROS2は内部でDDS(Data Distribution Service)を使い、ネットワーク越しの通信、QoS、発見(discovery)などを支える。

*QoS(Quality of Service)

「確実に届けるか」「最新だけで良いか」「遅延と信頼性のバランス」などを指定できる。ロボットでは超重要。

*tf2(座標変換)

センサー座標系・ロボット座標系・地図座標系などの変換を管理する仕組み。

*launch(起動・構成)

複数ノードをまとめて起動し、パラメータや名前空間を管理する。

*パラメータ(Parameters)

しきい値やゲインなどを外から調整できる。

**図の出典:
(講談社) ROS2とPythonで作って学ぶAIロボット入門 
出村公成.萩原良信.升谷保博.タンチュアン

●ROS2なにがいいのか?

*実運用向け(ROS1より強い)

QoS、複数ネットワーク、マルチロボット、安定運用を意識した設計。

*リアルタイム性に配慮

きちんと設計すれば制御系での遅延やジッタを抑えやすい(用途次第で要工夫)。

*セキュリティ(SROS2)

通信の暗号化や認証などを扱える(運用で重要)。

*OS/言語/環境の柔軟性

Linux中心だが、環境の広がりがあり、C++/Pythonで開発しやすい。

*巨大なエコシステム

ナビゲーション、SLAM、認識、シミュレーション連携など、再利用できる部品が多い。

●ROS2のUbuntu24.04へのインストール

ざっと特徴と、構成要素は以上の通りですがさっそくインストールをします。2025年12月16日の現時点では, Ubuntu24.04上で動くそしてLTS(長期サポート)版で2029年5月までサポートがあるROS 2 Jazzy Jalisco を選択します。
現在公式なものは英語だけになりますが、その内容やインストール手順とインストール後の確認をかいつまんで、説明します。
(https://docs.ros.org/en/jazzy/Installation/Ubuntu-Install-Debs.html)

まず、ros-apt-source パッケージを登録し、ROS リポジトリ用の署名キーを設定します。
そのうえでapt updateでレポを反映させます

# apt install curl -y
# export ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}')
#curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"
# dpkg -i /tmp/ros2-apt-source.deb
# apt update

オプションですが、開発ツールもいれられます。

# apt install ros-dev-tools

それではROS2の本体のインストールです。

# apt install ros-jazzy-desktop

クラウド仮想サーバーのようなGUI環境を用意してなく、使う予定のない場合はCLIだけのインストールも可能です。(今回はPCとラズベリーパイにGUIでの環境を設定しましたので、desktopをインストールした想定で解説を進めます。)

# apt install ros-jazzy-ros-base

インストールが終わると、/opt/ros/jazzy/が作成されROS2のベーシックなTOOLが準備されます。
すでに私の環境ではPCと、ラズベリーパイにインストールがされてます。
1)まずPC側とラズベリー両方で以下を実行して環境を読み込みます。

# source /opt/ros/jazzy/setup.bash

2)PC側でメッセージを出すデモを実行します
 これはメッセージをブロードキャストするデモコマンドです

@pc # ros2 run demo_nodes_py talker
[INFO] [1764548987.102554568] [talker]: Publishing: "Hello World: 0"
[INFO] [1764548988.085197493] [talker]: Publishing: "Hello World: 1"
[INFO] [1764548989.085098663] [talker]: Publishing: "Hello World: 2"
[INFO] [1764548990.085149123] [talker]: Publishing: "Hello World: 3"
[INFO] [1764548991.085399996] [talker]: Publishing: "Hello World: 4"
[INFO] [1764548992.085355064] [talker]: Publishing: "Hello World: 5"
[INFO] [1764548993.086398411] [talker]: Publishing: "Hello World: 6"
[INFO] [1764548994.086157955] [talker]: Publishing: "Hello World: 7"
[INFO] [1764548995.086142381] [talker]: Publishing: "Hello World: 8"
[INFO] [1764548996.084944240] [talker]: Publishing: "Hello World: 9"
[INFO] [1764548997.086103442] [talker]: Publishing: "Hello World: 10"
[INFO] [1764548998.086158821] [talker]: Publishing: "Hello World: 11"
[INFO] [1764548999.086146341] [talker]: Publishing: "Hello World: 12"
[INFO] [1764549000.085276754] [talker]: Publishing: "Hello World: 13"
[INFO] [1764549001.085154431] [talker]: Publishing: "Hello World: 14"
[INFO] [1764549002.085270717] [talker]: Publishing: "Hello World: 15"
[INFO] [1764549003.085436735] [talker]: Publishing: "Hello World: 16"

3)そのあとラズベリー側でも、以下のコマンドでメッセージを受けよるようにします。
  ブロードキャストされたメッセージを受けおるコマンドです。

@rp # ros2 run demo_nodes_py listener
[INFO] [1750205292.389846967] [listener]: I heard: [Hello World: 10]
[INFO] [1750205293.366620189] [listener]: I heard: [Hello World: 11]
[INFO] [1750205294.366679096] [listener]: I heard: [Hello World: 12]
[INFO] [1750205295.365264632] [listener]: I heard: [Hello World: 13]
[INFO] [1750205296.364224372] [listener]: I heard: [Hello World: 14]
[INFO] [1750205297.368250075] [listener]: I heard: [Hello World: 15]
[INFO] [1750205298.363795371] [listener]: I heard: [Hello World: 16]

無事メッセージがラズベリーのほうでもうけとれていることがわかります
以下はPC側からメッセージを送りそのあと、終了させてます。ラズベリーパイのほうは終了させるにメッセージを待つ状態にしてますが、発信側メッセージが終了したのでそれ以上メッセージは来ず待ち続けている状態になってます。("Hello World: 16送信後終了、受け側はHello World: 16でメッセージがこなくなり待ち続けている状態、もちろんPC側で再度メッセージ送信させればそこからまたラズベリーパイはメッセージを受け取り始めます)

イメージとしては以下のような感じです

もう1つ例をだします。今度はPCのほう(どちらでもいいですがGUIでDESKTOPで画面を確認しやすほうを)で亀を操作するturtlesimを動かしてみます。

@pc # ros2 run turtlesim turtlesim_node

すると、亀が真ん中に映ったものができます。次はラズベリーパイで以下のコマンドを実行します。
(これは私は自分の別のWINDOWS PCからラズベリーパイにSSHで接続しました)

@rp # ros2 run turtlesim turtle_teleop_key

すると以下のようなものがでます。回転を以下のキーで決めてからfで回転を終了してアローキーの上下で動かすことができます。

Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
Use g|b|v|c|d|e|r|t keys to rotate to absolute orientations. 'f' to cancel a rotation.
'q' to quit.
root@takeo-ThinkPad-X1-Carbon-7th:/opt/ros/jazzy# ros2 run turtlesim turtle_teleop_key
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
Use g|b|v|c|d|e|r|t keys to rotate to absolute orientations. 'f' to cancel a rotation.
'q' to quit.

● 追記:シミュレータ

実際にロボットを使うとなると結構な出費になるのでそうそうできません。
なので、シミュレータを利用して実験することが多いと思います。
1つ前のLTSであるUbuntu22.04対応 HAMBLEでは
Gazebo(クラシック版) (https://gazebosim.org/)
Webots (https://cyberbotics.com/)
箱庭 (https://toppers.github.io/hakoniwa/)
FutureKreate (https://store.steampowered.com/app/1487230/FutureKreate)
などが対応していたようです。
しかし、Ubuntu24.04に対応したJazzyでは、対応しているのがGazebo Sim, WeBotになります。

ここでは、Gazebo SimとWeBotsのインストールと起動まで紹介します。

Gazebo Sim

  • インストール
# apt install ros-jazzy-ros-gz-sim ros-jazzy-ros-gz-bridge
  • 空世界の起動
# source /opt/ros/jazzy/setup.bash
# ros2 launch ros_gz_sim gz_sim.launch.py gz_args:=empty.sdf


さらにサンプルで亀も出現させてみます。まずインストール

# apt install -y ros-jazzy-turtlebot3*

まずどこの世界(環境名?)にいるかを確認/world/{world名}がでるはず。

# gz topic -l | head
/clock
/gazebo/resource_paths
/gui/camera/pose
/gui/currently_tracked
/gui/track
/stats
/world/empty/clock
/world/empty/dynamic_pose/info
/world/empty/pose/info
/world/empty/scene/deletion

上記よりempty worldにいることが確認できました!。
どんなモデルが使えるか確認のためつまりSDFファイルを探すため、以下のコマンドでパスを設定しておきます。

# TB3_GAZEBO_SHARE=$(ros2 pkg prefix turtlebot3_gazebo)/share/turtlebot3_gazebo
# echo $TB3_GAZEBO_SHARE
# find $TB3_GAZEBO_SHARE -maxdepth 4 -type f \( -name "*.sdf" -o -name "*.urdf" -o -name "*.xacro" \) | head -n 50

以下のように確認できます.

/opt/ros/jazzy/share/turtlebot3_gazebo
/opt/ros/jazzy/share/turtlebot3_gazebo/urdf/common_properties.urdf
/opt/ros/jazzy/share/turtlebot3_gazebo/urdf/turtlebot3_waffle_pi.urdf
/opt/ros/jazzy/share/turtlebot3_gazebo/urdf/turtlebot3_burger.urdf
/opt/ros/jazzy/share/turtlebot3_gazebo/urdf/turtlebot3_waffle.urdf
/opt/ros/jazzy/share/turtlebot3_gazebo/urdf/turtlebot3_burger_cam.urdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_burger/model-1_4.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_burger/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_waffle/model-1_4.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_waffle/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_waffle_pi/model-1_4_.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_waffle_pi/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_dqn_world/obstacle1/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_dqn_world/obstacle2/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_dqn_world/inner_walls/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_dqn_world/goal_box/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_dqn_world/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_dqn_world/obstacles/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_burger_cam/model-1_4.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_burger_cam/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_house/mailbox/model-1_3.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_house/mailbox/model-1_4.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_house/mailbox/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_house/cafe_table/model-1_4.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_house/cafe_table/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_house/table_marble/model-1_4.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_house/table_marble/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_house/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_house/first_2015_trash_can/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_world/model-1_4.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_world/model.sdf

上記のモデルで好きなをを選んで出現させます。以下のモデルを利用します。

# ls $TB3_GAZEBO_SHARE/models/turtlebot3_waffle/model.sdf
/opt/ros/jazzy/share/turtlebot3_gazebo/models/turtlebot3_waffle/model.sdf

先ほどWORLDはemptyであることと、出現させたいモデルも選択したので、このempty世界に亀?を出現させます。

# ros2 run ros_gz_sim create \
  -world empty \
  -file "$TB3_GZ_SHARE/models/turtlebot3_waffle/model.sdf" \
  -name tb3 \
  -x 0 -y 0 -z 0.02
[INFO] [1766513194.085086084] [ros_gz_sim]: Entity creation successful.

すると真ん中に亀がでてきます。

少し動かしてみましょう。現在の状態を確認します。

# gz topic -e -t /world/empty/stats -n 1

もし、paused: true であれば動かす前にまず解除します。

# gz service -s /world/empty/control \
  --reqtype gz.msgs.WorldControl --reptype gz.msgs.Boolean --timeout 3000 \
  --req 'pause: false'

後はコマンドの実行を実施します。
まず前進:

# gz topic -t /cmd_vel -m gz.msgs.Twist -p \
'linear: {x: 0.20, y: 0.0, z: 0.0} angular: {x: 0.0, y: 0.0, z: 0.0}'

これで前進に進み続けます。速度や方向は値を調整ください。
次に回転:

# gz topic -t /cmd_vel -m gz.msgs.Twist -p \
'linear: {x: 0.0, y: 0.0, z: 0.0} angular: {x: 0.0, y: 0.0, z: 0.6}'

最後に停止です:

# gz topic -t /cmd_vel -m gz.msgs.Twist -p \
'linear: {x: 0.0, y: 0.0, z: 0.0} angular: {x: 0.0, y: 0.0, z: 0.0}'

このモデルでは、動く方向や回転方向は限定されますが、3D空間でのシミュレーションでは移動方向、回転方向(x,y,z)で移動回転ができます。

WeBots

  • インストール
# apt install -y ros-jazzy-webots-ros2
  • デモ起動
# source /opt/ros/jazzy/setup.bash
# ros2 launch webots_ros2_universal_robot multirobot_launch.py

ダウンロードをきかれるのでYESで進み、GUIが起動されます。自動さらにダウンロードが進み2つのアームロボットが動いているが見えます。

せっかくなどで動いているものも記載します。
https://youtu.be/_1LBcz6WtEU

以上でROS2の導入方法の解説と確認になりました!。

Discussion