🐱

micro-ROS(Pico)でカスタムメッセージ型を追加する

2025/01/25に公開

まえがき

製作中のロボット(車輪+1軸アーム+グリッパ)のアームとグリッパにPWMサーボMG92Bを使っています。このサーボはRaspberry Pi PicoにつながっておりPWMで駆動するようにしています。この動作をmicro-ROSのサービスで行うようにするため必要になりました。

環境

  • ノートPC(Ubuntu 22.04LTS) & ROS2 humble(インストール済)
  • micro-ROS Pico SDK のもの。micro-ROS-arduinoではないので注意。
  • micro-ROSは$HOME/pico/micro_ros_raspberrypi_pico_sdkにインストール。

micro-ROSの環境構築は記事を参照してください。Ubuntu20.04&foxyのときに書きましたが、Ubuntu22.04&Humbleでも多分大丈夫。

ROS2環境でカスタムメッセージを作成

カスタムメッセージのパッケージ作成

どこかのROS2ワークスペースで以下実行。ここではパッケージ名をmicrodc_msgsとしています。

ros2 pkg create microdc_msgs --build-type ament_cmake --dependencies rosidl_default_generators

CMakeLists.txt修正

カスタムメッセージを作るように追記します。カスタムメッセージはsrv/ArmFinger.srvとします。

cd microdc_msgs
vi CMakeLists.txt
CMakeFiles.txt
cmake_minimum_required(VERSION 3.8)
project(microdc_msgs)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  "srv/ArmFinger.srv"
 )

ament_package()

package.xml修正

vi package.xml

内容は以下。

package.xml
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>microdc_msgs</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="xxx@xxx.xxx">xxx</maintainer>
  <license>TODO: License declaration</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <build_depend>rosidl_default_generators</build_depend>
  <exec_depend>rosidl_default_runtime</exec_depend>
  <member_of_group>rosidl_interface_packages</member_of_group>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

カスタムメッセージのファイル作成

カスタムメッセージのファイル名はArmFinger.srv。

mkdir srv
vi srv/ArmFinger.srv

内容は以下。アームの上・下とハンドの指先の開・閉なのでbool型にしました。

srv/ArmFinger.srv
bool arm
bool finger
---
bool success

colcon build実行

ワークスペース直下に行ってcolcon buildして問題がないことを確認しましょう。

micro-ROS環境にカスタムメッセージを追加

カスタムメッセージのパッケージをコピー

コピー先はmicro_ros_raspberrypi_pico_sdk/microros_static_library/library_generation/extra_packages/となります。

cp -r microdc_msgs ~/pico/micro_ros_raspberrypi_pico_sdk/microros_static_library/library_generation/extra_packages/

extra_packages.reposの編集

追加したいカスタムメッセージをextra_packages.reposに追加します。

cd ~/pico/micro_ros_raspberrypi_pico_sdk/microros_static_library/library_generation/extra_packages/
vi extra_packages.repos

microdc_msgs:以下を追加。pathはextra_packages/以下の相対パスで良さげ。

extra_packages.repos
repositories:
  control_msgs:
    type: git
    url: https://github.com/ros-controls/control_msgs
    version: humble

  microdc_msgs:
    type: local
    path: microdc_msgs

micro-ROSのstatic library再生成

以下を実行。おもむろにdockerを使ってるので必要に応じてインストールしてください。

cd ~/pico/micro_ros_raspberrypi_pico_sdk/
docker run -it --rm -v $(pwd):/project microros/micro_ros_static_library_builder:humble

library_generation.shの修正(Humbleだけ必要?)

static library再生成がうまく行かなかったら以下を編集し、再度static library再生成をする。

library_generation.sh
vi microros_static_library/library_generation/library_generation.sh

修正内容は以下。docker中で使用するpico-sdkのバージョンを決め打ちする必要があるみたい。

 git diff microros_static_library/library_generation/library_generation.sh
diff --git a/microros_static_library/library_generation/library_generation.sh b/microros_static_library/library_generation/library_generation.sh
index 7ae4c93..a28a5ff
--- a/microros_static_library/library_generation/library_generation.sh
+++ b/microros_static_library/library_generation/library_generation.sh
@@ -6,7 +6,7 @@ apt update
 
 apt install -y gcc-arm-none-eabi
 
-git clone https://github.com/raspberrypi/pico-sdk /pico-sdk
+git clone --branch 1.5.1 https://github.com/raspberrypi/pico-sdk /pico-sdk
 
 ######## Init ########
 

できたかどうか確認

カスタムメッセージが作成されると~/pico/micro_ros_raspberrypi_pico_sdk/libmicroros/include/
にインクルードファイルが置かれる模様。

ls -R libmicroros/include/microdc_msgs/
libmicroros/include/microdc_msgs/:
msg  srv

libmicroros/include/microdc_msgs/msg:
rosidl_generator_c__visibility_control.h
rosidl_typesupport_introspection_c__visibility_control.h
rosidl_typesupport_microxrcedds_c__visibility_control.h

libmicroros/include/microdc_msgs/srv:
arm_finger.h  detail

libmicroros/include/microdc_msgs/srv/detail:
arm_finger__functions.h                           arm_finger__struct.h
arm_finger__rosidl_typesupport_introspection_c.h  arm_finger__type_support.h
arm_finger__rosidl_typesupport_microxrcedds_c.h   microxrcedds

libmicroros/include/microdc_msgs/srv/detail/microxrcedds:

できたのが確認できたら、動作確認しましょう。

最後に

本記事を書いている時点(2025/1/25)ではmicro-ROS内にサービスサーバは1つしか立てられない模様。したがって、一つのサービスサーバにいろいろなものをごちゃごちゃ入れなきゃならないのはあまり美しくない。

とはいえ、micro_ros_raspberrypi_pico_sdk環境でmicro-ROSカスタムメッセージの作り方が分かったので良かったです。
ESP32とかSTM32とかだと公式通りに作ればよいのかな?使ったことがないからわからないけど。

Discussion