💡

Raspberry Pi&Ubuntu Server&ROS2(Foxy)でmicro-ROS&Raspberry Pi Pico動作確認

2021/09/25に公開

初めての投稿です。
少しでもお役に立てれば幸いです。

記載目的

Raspberry Pi Picoをmicro-ROSで動かしたかったのですが、纏まった資料が見当たらなかったので。

PicoのファームウェアはUbuntu PC(20.04LTS & foxy)で作成、インストールしました。

環境

項目 OS ROS
PC Thinkpad x260 Ubuntu Desktop 20.04 Foxy
SBC Raspberry Pi 4(4GB) Ubuntu Server 20.04 Foxy

PC上のUbuntuでファームウェア開発環境を作る

Pico SDKをインストール

参考:
https://github.com/micro-ROS/micro_ros_raspberrypi_pico_sdk/tree/foxy

# Install dependencies
sudo apt install cmake g++ gcc-arm-none-eabi doxygen libnewlib-arm-none-eabi git python3

git clone --recurse-submodules https://github.com/raspberrypi/pico-sdk.git $HOME/pico-sdk

# Configure environment
echo "export PICO_SDK_PATH=$HOME/pico-sdk" >> ~/.bashrc
source ~/.bashrc

micro-ROS support packageをgithubからcloneしexampleをPicoに書き込む

mkdir ~/pico
cd ~/pico
git clone https://github.com/micro-ROS/micro_ros_raspberrypi_pico_sdk.git -b foxy
cd micro_ros_raspberrypi_pico_sdk
mkdir build
cd build
cmake ..
make
# To flash, hold the boot button, plug the USB and run:
cp pico_micro_ros_example.uf2 /media/$USER/RPI-RP2

Raspberry Pi 4上のUbuntuにmicro-ROS実行環境を作る

ROS2 Foxy上にmicro-ROSビルド環境を作る

参考:
https://micro.ros.org/docs/tutorials/core/first_application_rtos/freertos/

# Source the ROS 2 installation
source /opt/ros/$ROS_DISTRO/setup.bash

# Create a workspace and download the micro-ROS tools
mkdir microros_ws
cd microros_ws
git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup

# Update dependencies using rosdep
sudo apt update && rosdep update
rosdep install --from-path src --ignore-src -y

# Install pip
sudo apt-get install python3-pip

# Build micro-ROS tools and source them
colcon build
source install/local_setup.bash

micro-ROS agentを作る

参考:
https://micro.ros.org/docs/tutorials/core/first_application_rtos/freertos/

# Download micro-ROS-Agent packages
ros2 run micro_ros_setup create_agent_ws.sh
# Build step
ros2 run micro_ros_setup build_agent.sh
source install/local_setup.bash

micro-ROS agentを起動する

ファームウェアを書き込んだPicoをRaspberry Piに接続。

# Run a micro-ROS agent
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyACM0

デバイスのポート名は環境依存です。毎回調べるか、udevを使ってポート名を固定しましょう。

うまく行くと下記のようになります。うまく行かなかったらUSBケーブルを挿し直しましょう。
それでもだめなら/dev/ttyACM0があるか、ケーブルが充電専用でないか、確かめましょう(←私はよくやります)

[1636278871.515104] info     | TermiosAgentLinux.cpp | init                     | Serial port not found. | device: /dev/ttyACM0, error 2, waiting for connection...
[1636278872.518239] info     | TermiosAgentLinux.cpp | init                     | Serial port not found. | device: /dev/ttyACM0, error 2, waiting for connection...
[1636278873.521781] info     | TermiosAgentLinux.cpp | init                     | Serial port not found. | device: /dev/ttyACM0, error 2, waiting for connection...
[1636278873.806098] info     | TermiosAgentLinux.cpp | init                     | running...             | fd: 3
[1636278873.806299] info     | Root.cpp           | set_verbose_level        | logger setup           | verbose_level: 4
[1636278874.283705] info     | Root.cpp           | create_client            | create                 | client_key: 0x19A5DA75, session_id: 0x81
[1636278874.283839] info     | SessionManager.hpp | establish_session        | session established    | client_key: 0x19A5DA75, address: 0
[1636278874.316559] info     | ProxyClient.cpp    | create_participant       | participant created    | client_key: 0x19A5DA75, participant_id: 0x000(1)
[1636278874.321438] info     | ProxyClient.cpp    | create_topic             | topic created          | client_key: 0x19A5DA75, topic_id: 0x000(2), participant_id: 0x000(1)
[1636278874.323820] info     | ProxyClient.cpp    | create_publisher         | publisher created      | client_key: 0x19A5DA75, publisher_id: 0x000(3), participant_id: 0x000(1)
[1636278874.328616] info     | ProxyClient.cpp    | create_datawriter        | datawriter created     | client_key: 0x19A5DA75, datawriter_id: 0x000(5), publisher_id: 0x000(3)

別Terminalでノードが立ち上がってるか、publisherはあるか、publishされてるデータはどんなものかを見てみましょう。

$ ros2 node list
/pico_node
$ ros2 topic list
/parameter_events
/pico_publisher
/rosout
$ ros2 topic info /pico_publisher
Type: std_msgs/msg/Int32
Publisher count: 1
Subscription count: 0
$ ros2 topic echo /pico_publisher
data: 390
---
data: 391
---
data: 392
---
data: 393
---
^C$ 

最後に

ros-serialで作ったロボットのモーター制御部をROS2に移行したいです。

Discussion