🍓

ラズパイPicoでmicro-ROSを使う(その2)

2025/02/02に公開

以下の続き。

https://zenn.dev/usagi1975/articles/2025-02-02_pico_micro_ros

プログラムはビルドできたので、UART接続周りの設定を行う

接続は下図のとおり

  • PCとPicoProbeはUSB接続
  • PicoProbeとPicoはSWD経由で接続して書き込みできるようにする
  • PicoProbeからPicoへ電源を供給、UART0と接続してprintfなどの標準出力を拾って、VSCodeのシリアルモニタで表示
  • Picoと母艦となるZero2はUART接続
  • Zero2への電源供給はコンセントから(PCからだと電源たりなくてWifiが起動しなかった)

7. PicoのUART設定

こちらは、前回投稿したとおり、プログラム内で設定するのみなので特に設定はないです。
UART1を使う設定だけです。UART0については、cmake内でも定義されてます。

# CMakeLists.txt
# Modify the below lines to enable/disable output over UART/USB
pico_enable_stdio_uart(micro-ros-sample 1)
pico_enable_stdio_usb(micro-ros-sample 0)

8. Pi Zero2 (Pi 4)のUART設定

Zero 2のUART設定、Pi 4以降ではハードウェア構成が異なるので設定方法が異なる。

Zero 2はUARTが1個しかなく、デフォルトではBluetoothが割り当たっているので、これらをオフする必要がある。

# Raspberry Pi 3, Zero, Zero 2
# /boot/firmware/config.txt 

[All] 
enable_uart=1
dtoverlay=disable-bt
dtoverlay=uart0

cmdline.txtは以下のような感じ。console=serial0,115200などの行がある場合は削除する。

# /boot/firmware/cmdline.txt 

console=tty1 multipath=off dwc_otg.lpm_enable=0 root=LABEL=writable rootfstype=ext4 rootwait fixrtc cfg80211.ieee80211_regdom=JP

念のため、シリアルポートを使った以下のサービスは停止しておく

sudo systemctl disable serial-getty@ttyAMA0.service
sudo systemctl stop serial-getty@ttyAMA0.service

UART0が有効になると、以下のGPIO14、GPIO15に割り当てされる。

Raspberry Pi Zero 2
UART0(ttyAMA0) PL011 TX: GPIO14, RX: GPIO15

https://robu.in/wp-content/uploads/2024/06/Circuit-Diagram-Pi-Zero-2W.jpg

config.txt, cmdline.txtを修正したら再起動する

> sudo reboot

ちなみにRaspberry Pi 4と接続する場合

ラズパイ4以降は、複数のコントローラーがあるので、デフォルトのUART0、UART1は避けたほうがいい。

Raspberry Pi 4, 5
UART0(ttyAMA0) PL011 TX:GPIO14, RX:GPIO15
UART1 miniUART
UART2(ttyAMA1) PL011 TX:GPIO0, RX:GPIO1 ※I2Cオフした場合
UART3(ttyAMA2) PL011 TX:GPIO4, RX:GPIO5
UART4(ttyAMA3) PL011 TX:GPIO8, RX:GPIO9

UART5もあったかもしれないが省略

下記のようにUART2を有効にする場合、以下の変更を行って再起動。

# Raspberry Pi 4, 5
/boot/firmware/config.txt

dtoverlay=uart2
enable_uart=1

再起動後、デバイスファイルに割り当てられているか確認する

ttyAMA0

> sudo dmesg | grep ttyAMA
[    0.910565] fe201000.serial: ttyAMA0 at MMIO 0xfe201000 (irq = 19, base_baud = 0) is a PL011 rev2

Pi4の場合であれば、ttyAMA1が存在しているか確認

[    0.911093] fe201400.serial: ttyAMA1 at MMIO 0xfe201400 (irq = 19, base_baud = 0) is a PL011 rev2

パーミッションを追加しておく

> sudo usermod -a -G dialout ubuntu

9. micro_ros_agentのビルド

micro_ros_setupリポジトリをクローンしてビルドシステムをインストールする。

colcon build すると、ローカルにbuild, install フォルダ以下にモジュール等作成される。

> source /opt/ros/$ROS_DISTRO/setup.bash

> mkdir microros_ws
> cd microros_ws
> git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup

> rosdep install --from-paths src --ignore-src -y
> colcon build

エージェントをビルドする

> source install/local_setup.bash
> ros2 run micro_ros_setup create_agent_ws.sh
..
=== ./uros/micro-ROS-Agent (git) ===
Cloning into '.'...
=== ./uros/micro_ros_msgs (git) ===
Cloning into '.'...
#All required rosdeps installed successfully

> ros2 run micro_ros_setup build_agent.sh

10. UART接続とエージェント起動

PicoとROS2ホスト側(Pi4、Zero2)は以下のように接続する。どちらもデフォルトのUART0を使ってないので注意。あとGNDを接続しないと動作しないので忘れないようにする。

Pico(micro-ROS) Pi4(ROS2)
UART1 TX(GPIO4) UART2 RX(GPIO1)
UART1 RX(GPIO5) UART2 TX(GPIO0)
GND GND
Pico(micro-ROS) Pi Zero2(ROS2)
UART1 TX(GPIO4) UART0 RX(GPIO15)
UART1 RX(GPIO5) UART0 TX(GPIO14)
GND GND

micro-ROSエージェントの起動は以下のように実施する。

> cd microros_ws
> source install/local_setup.bash

# Zero2
> ros2 run micro_ros_agent micro_ros_agent serial -b 115200 --dev /dev/ttyAMA0

# Pi4
> ros2 run micro_ros_agent micro_ros_agent serial -b 115200 --dev /dev/ttyAMA1

11. データ送信の確認( Pico => ROS2 )

ワイヤ接続したら、Picoをリセットしてプログラムを最初から実行すると、シリアル接続経由でROS2上のagentと通信開始することが分かる。

micro-ros-sample start.
OK) Ping has reached the micro-ROS agent.
executor start.
timer callback msg.data = 1
timer callback msg.data = 2
timer callback msg.data = 3

ROS2側で別のターミナルを起動して、pico_node が正しく作成されているかを確認する

> cd microros_ws
> source install/local_setup.bash

> ros2 node list
/pico_node

pico_publish_topicトピックが出来ているか確認する

> ros2 topic info /pico_publish_topic
Type: std_msgs/msg/Int32
Publisher count: 1
Subscription count: 0

pico_publish_topicトピックをエコーして、Pico側から送信されているメッセージをROS2側で表示してみる

> ros2 topic echo /pico_publish_topic
data: 191
---
data: 192
---
data: 193
:

次回は、ROS2側がパブリッシャー、Pico側がサブスクライバとなってメッセージを送信するケースを実施する予定。

サンプルプログラムのリポジトリ
https://github.com/chihiro1234567/pico-micro-ros-samples/

以上

Discussion