🎃

ROS2メモ

2023/03/03に公開

概要

  • ROSの後継
  • パッケージの互換性は(そのままでは)ない。
  • 繋ぐにはros1_bridgeを用いるか,頑張ってpackage.xmlとCMakeLists.txtを書き直す。
  • 主な違い
  • 筆者の環境
    • Ubuntu 22.04
    • ROS2 Humble

テンプレート

  • それぞれGitpodで動くようにしてますので,ちょっとお試し&環境構築の参考にご利用ください。

https://github.com/zwire/ros2-template
https://github.com/zwire/gazebo-ros2-template

クイックスタート

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デバッグ環境の作り方

VS Codeでインクルードがうまくいかないときは

  • ROSに限った話ではないですが。。。
  1. .vscode/c_cpp_properties.jsonをチェック(もしくは生成)。includePathが不足している。
  2. 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のお約束に則ることで実装できる。

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