micro-ROS(Pico)でカスタムメッセージ型を追加する
まえがき
製作中のロボット(車輪+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
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
内容は以下。
<?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型にしました。
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/
以下の相対パスで良さげ。
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再生成をする。
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