ラズパイPicoでmicro-ROSを使う(その2)
以下の続き。
プログラムはビルドできたので、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 |
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側がサブスクライバとなってメッセージを送信するケースを実施する予定。
サンプルプログラムのリポジトリ
以上
Discussion