ROS2 で、ESP32(Arduino) を使う。
--- Turtlebot3 の自作 を、 ROS2 に移植する。 ---
前回の、自作 Turtlebot3 自律走行に向けたプログラム。#15 で、ROS の限界を感じたので、ROS2 を試す事にしました。
1. 環境。
PC
Ubuntu Mate 22.04
ros2: foxy galactic humble
SBC
Orange pi 5
Armbian jammy
ros2: foxy galactic humble
注1) foxy navigation2、teb_local_planner には、不具合があるので、パッチが必要になる。
注2) ubuntu 20.04 で、galactic が使えるので、こちらの方が良い。by nishi 2023.1.21
しかし、なぜか、galactic 版は、EOL になっているみたい。
foxy/Releases
EOL 版でも大丈夫みたいぞね。
下記で、eol 版の galactic 版も、同じようにビルドできます。
$ rosdep update --rosdistro=${ROS_DISTRO} && rosdep install --from-path src --ignore-src -y
rosdep オプション
注3) 今は、ubuntu 22.04 Ros2 Humble対応です。navigation2 rpp
2. ros2arduino を試す。
どうやら、こちらは、開発が止まっているようです。
ESP32 にサンプルを入れて試してみましたが、うまく行かないので、止めました。
ESP32 Serial は、まだ使えないままの様です。
上記をテストするのに、eProsima Micro XRCE-DDS が必要な様で、試しにインストールしてみましたが、
次の micor-ROS を試す段階で、/usr/local/lib/libfastrtps.so /usr/local/lib/libfastrtps.so.2.8.0 が競合するようで、
削除する事にしましたが、あいにく make uninstall が無いので、削除するのが大変でした。
$ sudo make install すると、Micro-XRCE-DDS-Agent/build/install_manifest.txt にインスしたファイル一覧があるので、
Shell で、これを読みこんで、削除しました。
uninstall_from_files.sh
$ sudo sh ./uninstall_from_files.sh
$ sudo ldconfig /usr/local/lib
3. micro-ROS を試す。
ros2arduino は、さっさと諦めて、micro-ROS を試す事にしました。
こちらは、試験的な開発重視なので、安定版は望めないようなのが、将来気になります。
3.1 SBC(JetsonNano) へ micro-ros Agent をインストール。
SBC(JetsonNano) へ micro-ros Agent をインストールしないといけない。
micro-ROS/micro_ros_setup
Building micro-ROS-Agent
注) ここは、micro-ROS-Agent が更新された時に、その都度行う。
3.2 開発 PC に micro-ros arduino をインストール。
ESP32 へプログラムを書き込む環境をインストール。
micro-ROS/micro_ros_arduino
Arduino ライブラリーなので、おんちゃんは、
~/Arduino/lib-foxbot_core3_r2/ 下へダウンロードします。
注) micro-ROS Agent のアップデートに合わせて、こちらも定期的に更新が必要ぞね。
$ cd ~/Arduino/lib-foxbot_core3_r2/micro_ros_arduino
$ git branch
* galactic
main
$ git pull origin galactic
foxy 版のサンプルプログラムが、あるので、
micro-ROS/micro_ros_arduino/tree/foxy/examples
micro-ros_publisher 、micro-ros_tf_publisher 、 micro-ros_reconnection_example 、micro-ros_time_sync を一通り試して、
これらを全て、ROS 対応の foxbot_core3.ino に組み込めば、 ROS2 対応になりそうなので、早速試してみました。
注意点。
幾つか注意点がありました。
1) デフォルトの domain_id。
micro_ros の デフォルトの domain_id = 0 の様です。
Turtlebot3 で試す時は、domain_id = 30 なので、プログラム上でこれを変更します。
サンプルが、下記にあります。
【micro-ROS for Arduino】簡単なPublisherとSubscriberの書き方
2) micro_ros_arduino で、Serial speed (Serial barud rate) を変える方法。
micro_ros_arduino/src/default_trnasport.cpp
4. ROS2 対応 自作 Turtlebot3(foxbot_core3) の作成。
ROS対応の 自作 Turtlebot3(foxbot_core3) へ、micro-ros を組み込んで、 ROS2 対応にしてみました。
4.1 実行方法。
1) SBC(Jetson nano 2G) での、micro-ROS Agent の起動。
$ sudo chmod 777 /dev/ttyTHS1
$ ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyTHS1 -b 1000000
2) Remote PCでの操作。
未だ、入力デバイスがなにも無いので、teleop-keyboard で動かすだけぞね。
$ ros2 run turtlebot3_teleop teleop_keyboard
github にアップロードしました。
tosa-no-onchan/foxbot_core3
5. Single USB Camera を、ROS2 対応にしました。
/tosa-no-onchan/uvc_camera
これで、ROS2 rtabmap_ros with Stereo Camera が実行できます。
6. 後書き。
ESP32 に、foxbot_core3_r2.ino を書き込めば、 ROS2 対応になるぞね。
当初、ESP32 - Micro-ROS 間のコネクションが、時々リセットされる不具合が在りましたが、今は改修しちょります。
おんちゃんは、今は、ROS2 rtabmap_ros with Stereo Camera Sync と、navigation2 を使って、C++ プログラムから、
自作 Turtlebot3 (foxbot_core3_r2.ino) を、部屋の中で動かしちょります。
Planner が、 DWBLocalPlanner なので、あまり動きは良くありませんが、ROS で勉強した事を参考に、改造していくぞね。
ROS2 対応、
teb_local_planner があるから、早速、試さんといかんぞね。
注) DWBLocalPlanner でも、問題なく動きました。
nav2_params.yaml の変更に問題があったみたい。今は、それなりに動きます。 by nishi 2022.12.19
7. 改造 2023.2.28
ESP32 の Serial2(tx:17,rx:16) を使えるようにしました。
LED は、 14 に変更しました。
foxbot_core3_r2.ino で、
#define USE_TRACE
ビルドすると、(tx:17,rx:16) pin をTARCE 用として使えます。
要所要所に Trace を出して、ESP32 - micro-ROS Agent (Jetson Nano 2G) 間の接続状況を見ていましたが、結構通信が途絶えるようです。
基本的に、通信が途絶える事を前提にプログラムしないといけないみたいぞね。
今回の改造点。
1) galactic 版になってから、通信断時の再接続が、途中でエラーになっていた点の修正。
2) 再接続した際に、従来は、 IMUのリセット、odom、TF の位置、向き情報の初期化をしていましたが、それを止めにしました。
IMUのリセット、odom、TF の位置、向き情報の初期化 は、ESP32 が起動した時のみとしました。
3) 通信断になっている間は、モータ駆動を即止める。
これで、ロボットの位置、向き情報が継続されるので、通信エラーが有っても無視できます。
注) ROS のほうでも、この問題が出ているものと思います。いずれ、バックポートしなければいかんぞね。
github にアップロードしました。
tosa-no-onchan/foxbot_core3
注) Ubuntu 22.04 ROS2 humble 対応です。by nishi 2024.9.18
ついでに、python3 で、Serial 表示をできるようにしました。
serial_term.py
実行は、
$ sudo chmod 777 /dev/ttyUSB0
$ python3 serial_term.py