💡
Raspberry Pi&Ubuntu Server&ROS2(Foxy)でmicro-ROS&Raspberry Pi Pico動作確認
初めての投稿です。
少しでもお役に立てれば幸いです。
記載目的
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をインストール
参考:
# 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ビルド環境を作る
参考:
# 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を作る
参考:
# 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