ROS 1 Bridge#

概要#

ros1_bridgeはROS 1とROS 2の間でメッセージをブリッジ(橋渡し)するためのパッケージである.このパッケージを使用することでROS 1のノードとROS 2のノードを同時に実行し相互に通信させることができる.

本演習ではrosserial(ROS 1)とros2_control(ROS 2)を組み合わせたシステムを構築するためにros1_bridgeを使用する.

必要な環境#

  • ROS 1(ROS-O)がインストールされていること

  • ROS 2(Jazzy)がインストールされていること

インストール方法#

以下の 事前ビルド済みパッケージからのインストール(推奨)ソースからのビルドいずれかを実行する.

ros1_bridgeのbuildは非常に時間がかかるため.debを使ってインストールすると良い

事前ビルド済みパッケージからのインストール(推奨)#

ros1_bridgeをソースからビルドすると時間がかかるため,事前にビルドされた .deb パッケージを使用することを推奨する.

Ubuntu 24.04 (amd64) 用パッケージ#

以下のGoogle Driveリンクから .deb ファイルをダウンロードする.

ダウンロード後,以下のコマンドでインストールする.

$ sudo dpkg -i ros-jazzy-ros1-bridge_0.10.3-0noble_amd64.deb

依存関係のエラーが出た場合は以下のコマンドで解決する.

$ sudo apt-get install -f

ソースからのビルド#

こちらの手順は自分でカスタムにbuildしたい場合に行うこと

事前ビルド済みパッケージが使用できない場合やカスタムメッセージを使用する場合は,ソースからビルドする必要がある.

1. ワークスペースの作成#

$ mkdir -p ~/ros2/bridge/src
$ cd ~/ros2/bridge/src

2. ros1_bridgeのクローン#

$ git clone https://github.com/ros-o/ros1_bridge

3. 依存パッケージのインストール#

両方のROSディストリビューションの環境をsourceしてから依存パッケージをインストールする.

$ cd ~/ros2/bridge
$ source /opt/ros/one/setup.bash
$ source /opt/ros/jazzy/setup.bash
$ rosdep install --from-paths src -i -y -r

4. ビルド#

$ colcon build

ビルドには数分かかる場合がある.

5. セットアップファイルのsource#

$ source ~/ros2/bridge/install/setup.bash

使用方法#

基本的な起動方法#

ros1_bridgeを使用するには以下の3つのターミナルが必要である.

注意: 事前ビルド済みパッケージ(.deb)をインストールした場合は,~/ros2/bridge/install/setup.bash のsourceは不要である.

ターミナル1: ROS 1のroscore

$ source /opt/ros/one/setup.bash
$ roscore

ターミナル2: ros1_bridge

$ source /opt/ros/one/setup.bash
$ source /opt/ros/jazzy/setup.bash
$ source ~/ros2/bridge/install/setup.bash
$ ros2 run ros1_bridge dynamic_bridge --bridge-all-topics

--bridge-all-topicsオプションを指定するとROS 1とROS 2の全てのtopicが自動的にブリッジされる.

ターミナル3以降: ROS 1またはROS 2のノード

ROS 1のノードを起動する場合:

$ source /opt/ros/one/setup.bash
$ rosrun <package_name> <node_name>

ROS 2のノードを起動する場合:

$ source /opt/ros/jazzy/setup.bash
$ ros2 run <package_name> <node_name>

動作確認#

ros1_bridgeが正しく動作しているか確認するにはROS 1とROS 2の両方でtopicリストを確認する.

ROS 1でのtopic確認:

$ source /opt/ros/one/setup.bash
$ rostopic list

ROS 2でのtopic確認:

$ source /opt/ros/jazzy/setup.bash
$ ros2 topic list

両方のコマンドで同じtopicが表示されていればブリッジが正しく動作している.

ブリッジのオプション#

dynamic_bridgeには以下のオプションがある.

オプション

説明

--bridge-all-topics

全てのtopicを自動的にブリッジする

--bridge-all-1to2-topics

ROS 1からROS 2へのtopicのみブリッジする

--bridge-all-2to1-topics

ROS 2からROS 1へのtopicのみブリッジする

--help

ヘルプを表示する

ヘルプの確認:

$ ros2 run ros1_bridge dynamic_bridge --help

メカトロボットでの使用例#

本演習のメカトロボットではrosserial(ROS 1)でArduinoと通信しros2_control(ROS 2)でモータ制御を行う.これらを連携させるためにros1_bridgeを使用する.

ターミナル1: roscore(ROS 1)

$ source /opt/ros/one/setup.bash
$ roscore

ターミナル2: ros1_bridge

$ source /opt/ros/one/setup.bash
$ source /opt/ros/jazzy/setup.bash
$ source ~/ros2/bridge/install/setup.bash
$ ros2 run ros1_bridge dynamic_bridge --bridge-all-topics

ターミナル3: rosserial(ROS 1)

$ source /opt/ros/one/setup.bash
$ rosrun rosserial_python serial_node.py /dev/ttyUSB0

ターミナル4: ros2_control(ROS 2)

$ source /opt/ros/jazzy/setup.bash
$ ros2 launch mechatrobot mechatrobot_controller.launch.py

これによりROS 1のrosserialで受信したセンサデータをROS 2のros2_controlで使用したりROS 2の制御指令をROS 1経由でArduinoに送信したりできる.

トラブルシューティング#

ビルドエラー#

ros1_bridgeのビルド時には必ずROS 1とROS 2の両方の環境をsourceする必要がある.

$ source /opt/ros/one/setup.bash
$ source /opt/ros/jazzy/setup.bash
$ colcon build

bridgeが起動しない#

ros1_bridgeの起動時にもROS 1とROS 2の両方の環境とビルドしたワークスペースをsourceする必要がある.

$ source /opt/ros/one/setup.bash
$ source /opt/ros/jazzy/setup.bash
$ source ~/ros2/bridge/install/setup.bash
$ ros2 run ros1_bridge dynamic_bridge --bridge-all-topics

roscoreが起動していないエラー#

ros1_bridgeを起動した際に以下のようなエラーメッセージが大量に表示される場合がある.

Error in XmlRpcClient::writeRequest: write error (Connection refused).
Error in XmlRpcDispatch::work: couldn't find source iterator
Error in XmlRpcClient::writeRequest: write error (Connection refused).
Error in XmlRpcDispatch::work: couldn't find source iterator
...

このエラーはros1_bridgeを起動する前にroscoreが起動していないことを示している.

解決方法:

別のターミナルでroscoreを起動してからros1_bridgeを起動する.

# ターミナル1: roscoreを起動
$ source /opt/ros/one/setup.bash
$ roscore

roscoreが起動するとエラーメッセージが停止しros1_bridgeが正常に動作する.

注意: ros1_bridgeは起動順序が重要である.必ず以下の順序で起動すること.

  1. roscore(ROS 1)を起動

  2. ros1_bridgeを起動

  3. ROS 1/ROS 2のノードを起動

topicがブリッジされない#

  • roscoreが起動しているか確認する

  • ros1_bridgeが正しく起動しているか確認する

  • メッセージ型がROS 1とROS 2の両方で定義されているか確認する

参考資料#