🎃
ROS2メモ
概要
- ROSの後継
- パッケージの互換性は(そのままでは)ない。
- 繋ぐにはros1_bridgeを用いるか,頑張ってpackage.xmlとCMakeLists.txtを書き直す。
- 主な違い
- 自動運転プラットフォームの実用化︓ROS 2で⾼信頼ソフトウェアの実装
- C++とPythonのバージョンが新しい。
- 外部ミドルウェアDDSの採用によるリアルタイム性と通信品質の確保 (QoS)。
- ROSのroscoreが無い。通信方式が完全に分散。
- component nodeなるものが登場。ROSのnodeletにあたる。
- Windowsでも使えることになった (が,環境汚染が甚だしいので個人的にはまだ無理)。
- 筆者の環境
- Ubuntu 20.04/22.04
- ROS2 Foxy/Humble
テンプレート
- それぞれGitpodで動くようにしてますので,ちょっとお試し&環境構築の参考にご利用ください。
クイックスタート
0. インストール
- 2つのリポジトリに置いた.gitpod.ymlが環境構築手順そのものです。
1. パッケージの作成
- テンプレートを参考に,あるいはクローンして以下のようなディレクトリ階層を作る。
<work_dir>
- src
- <package1>
- CMakeLists.txt (auto generated)
- package.xml (auto generated)
- src (auto generated)
- <node1>.cpp
- <package2>
- ...
- <package3>
- ...
- 細かい説明はREADMEに。
- PythonのテンプレはCMakeを使わず,もっと単純。ググれば出る。
- サービス通信はめんどいので割愛。
2. ビルド&実行
# ワークスペース丸ごと
cd <work_dir> && colcon build
# 個別パッケージ
cd <work_dir> && colcon build --packages-up-to --packages-select <pkg>
. install/local_setup.bash
# target
ros2 run <pkg> <target>
# launch
ros2 launch <pkg> <launch>
他人のパッケージの使い方
- ROSの良いところは他人がGitHubに置いているパッケージを引っ張ってきてホイホイ使えることです。
- 使い方は単にクローンするだけです。クローン先はワークスペースディレクトリが良いです。
cd <work_dir> && git clone -b ros2 https://github.com/....git
- こうすると,ワークスペースで自分のパッケージと一緒にビルドすることができます。
- 一回パッケージ単体でビルドしてみましょう。
cd <work_dir> && colcon build --packages-select <pkg_name>
- -bオプションはブランチを指定しています。有名どころのリポジトリはROSとROS2両対応しているので,プラットフォームごとにブランチを分けて管理しています。-b ros2は例なので自分でリポジトリのブランチを確認してから行ってください。
VS Codeデバッグ環境の作り方
- https://qiita.com/iwatake2222/items/20fcad3eb68bb1e03792
- WSLやDockerでやる場合も同じです。
- うまくいくとブレークポイントとか当てれるようになります。
VS Codeでインクルードがうまくいかないときは
- ROSに限った話ではないですが。。。
- .vscode/c_cpp_properties.jsonをチェック(もしくは生成)。includePathが不足している。
- vscodeのSettings → Extensions → C/C++ → IntelliSense → C_Cpp:Intelli Sense Engine がTag Parserになってると死ぬ。これはdefaultにしないといけない。
ros_bridgeについて
- non-ROSな通信プロトコルとROSをスムーズに繋いでくれるのがros_bridge
- Client側はWebSocketなどを使いJSONフォーマットに従ってROSのお約束に則ることで実装できる。
- 参考: Husty.RosBridge (Tutorial)
rosbagについて
- ROS時代とほとんど同じです。
- ただし.db3というsqlite3に準拠したフォーマット,メタファイルがついてくる点は異なる。
ros2 bag record -o <file_name> <topic1> <topic2> ... (全部取る場合は-a)
ros2 info <file_name>
ros2 play <file_name>
ROS→ROS2
- メッセージ型の書き方が若干変わります。
- ROS : include <geometry_msgs/Twist.hpp>
- ROS : geometry_msgs::Twist
- ROS2: include <geometry_msgs/msg/twist.hpp>
- ROS2: geometry_msgs::msg::Twist
- bagファイルの仕様が異なるようです。
- 変換ツールがあります。
pip install rosbags
rosbags-convert <name>.bag
# コマンドがない場合は~/.bashrcにexport PATH=$PATH:~/.local/binと追記
# うまくいくと同名のフォルダが生成される
# 見てみよう
ros2 bag play <name>
その他コマンド
- create package
# C++
cd <work_dir>/src && ros2 pkg create <pkg> --build-type ament_cmake --dependencies rclcpp <other_deps>
# component(詳しいやり方はhttps://github.com/husty530/ros2-template/tree/master/src/custom_component)
cd <work_dir>/src && ros2 pkg create <pkg> --build-type ament_cmake --dependencies rclcpp rclcpp_components <other_deps> --library-name <node_name>
# Python
cd <work_dir>/src && ros2 pkg create <pkg> --build-type ament_python --dependencies rclpy <other_deps>
- search msg, srv, action, topic, node
ros2 interface list
ros2 interface show <type>
ros2 topic list
ros2 node list
- kill ros daemon
ps aux | grep ros | grep -v grep | awk '{ print "kill -9", $2 }' | sh
- launch rosbridge-suite-server
ros2 launch rosbridge_server rosbridge_websocket_launch.xml
# 'op' = 'call_service', 'advertise', 'unadvertise', 'publish', 'subscribe', 'unsubscribe', 'fragment', 'advertise_service', 'service_response', 'unadvertise_service'
Discussion