ROS2 自作 Turtlebot3(foxbot_core3_r2) で、Rtabmap_ros with Stereo rgbdを試す。
--- 上記、自作ロボットに、navigation2 を組み込んで、Active SLAM で、C++ プログラム制御で、部屋の中を計画コース通りに走らせる。----
ROS2 で、ESP32(Arduino) を使う。 の続きです。
予めMap を作成していないので、同時に、Active Mapping で、地図も作成します。
一応、上記仕様で、自作 Turtlebot3(foxbot_core3_r2) が、動かせるようになったので、書いてみました。
1. 環境。
1) Remote PC
Ubuntu Mate 22.04
ros2: foxy galactic humble
rtabmap_ros, navigation2, Rviz2
注) foxy navigation2 には、不具合があるので、パッチが必要。後述。
注2) ubuntu 20.04 で、galactic が使えるので、こちらの方が良い。by nishi 2023.1.21
しかし、なぜか、galactic 版は、EOL になっているみたい。
humble/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) SBC
Orange Pi5
Armbian Jammy
ros2: foxy galactic humble
micro-ROS Agent
Single USB Stereo Camera
3) SOC
ESP32 Arduino
micro-ROS
IMU
2. foxbot_core3_r2.ino のビルド。
foxbot_core3_r2_config.h を、下記にして、ESP32 へ書き込みます。
詳しい事は、ROS2 で、ESP32(Arduino) を使う。 を参照。
3. Remote PC でのインストール。
3.1 navigation2 のインストール。
Remote PC に navigaton2 をインストールします。
nav2 build and install
パッチを当てないといけないので、source build します。
3. 1.1 navigatino2 のパッチ。
foxy navigation2 には、不具合があるので、パッチが必要。
Would not halt all actions while exception thrown during running BT #2272
BehaviorTreeEngine::run() に、パッチを入れる。
Galactic 版に、実際のパッチが入っているので、それを、foxy-devel 版に、back port すれば良い。
behavior_tree_engine.cpp
こちらの方が、ログが出てくるので、良い。
2箇所必要なので、具体的に書きました。 by nishi 2022.12.25
navigation2/nav2_behavior_tree/src/behavior_tree_engine.cpp
BehaviorTreeEngine::run()
BehaviorTreeEngine::haltAllActions()
の2箇所に、galactic版の、back port パッチを入れます。
上記、BehaviorTreeEngine::haltAllActions() に、パッチを入れても、下記エラーを吐いて、bt_navigator が、die します。
これは、特殊な場合の様です。
T100TA、あるいは、SBC(Jetson Nano 2G) で、navigation2 and teb_local_planner を起動すると、出る様です。
CPUが非力な場合の様です。
navigation2/nav2_bt_navigator/src/bt_navigator.cpp に、loop.sleep() を入れて様子見です。
注) galactic 版だと、navigation2/nav2_behavior_tree/include/nav2_behavior_tree/bt_action_server_impl.hpp になる。
注) delay を増やしました。
rclcpp::WallRate loop(5); // update by nishi 2023.1.15
注) たまに、navigation2 の方で、下記ログが出てくるので、問題は残っています。
[controller_server-1] [INFO] [1671177881.620306978] [local_costmap.local_costmap_rclcpp_node]: Message Filter dropping message: frame 'camera' at time 1671177881.186 for reason 'Unknown'
time stamp がどうなの!!
問題ないか?
注) もしかしたら、nav2_params.yaml の記述の誤りか?
3.2 ROS2 foxy 版、Rtamap_ros をインストール。
introlab /
rtabmap_ros
3.3 ROS2 foxy 版、turtlebot3_navi_my をインストール。
tosa-no-onchan/turtlebot3_navi_my
4. SBC でのインストール。
4.1 OpenCV のビルド。
チョット古いですが、Jetson Nano 2G OpenCV4.1.1 Build を参照。
Jetson Nano 2G が、 JetPack 4.X + Ubuntu 20.04 であれば、以前よりは、簡単ぞね。
Ubuntu 20.04 のデフォルトバージョン OpenCV 4.2.0 ? にします。
4.2 Ros2 版 Single USB Stereo Camera のインストール。
uvc_camera_single
4.3 Ros2 stereo_image_proc のインストール。
パッケージ版では、上手く動かないので、source build 版をインストール。
ros-perception/image_pipeline
foxy 版をインストール。
4.4 ROS2 foxy 版、Rtamap_ros をインストール。
introlab /
rtabmap_ros
注) SBC 側にも必要でした。
ROS2 で、Rtabmap_ros を試す。 を参照。
5. rtabmap_ros_my のインストール。
Remote PC and SBC
tosa-no-onchan/rtabmap_ros_my
6. 実行
rtabmap_ros_my/launch/ratbmap_stero_rgbd.launch.py を実行します。
実行方法は、上記ファイルの上部に記載してあります。
local_planner は、dwb_core::DWBLocalPlanner 、teb_local_planner::TebLocalPlannerROS
どちらでも、動作確認できました。
7. teb_local_planner (Remote PC)
パッケージ版が無いので、source build します。
rst-tu-dortmund/teb_local_planner
注) costmap_converter も必要です。
やれやれ。書くのも大変じゃ。
8. galactic に移行しました。
結論を先に言えば、galactic 版だと、foxy で現れた、Packageのバグがでなくて、より簡単ぞね。
上記の様な、Packageの修正は何もなく、取り敢えず、DWBLocalPlanner で、完走できました。by nishi 2023.1.20
8.1 teb_local_planner で試す。by nishi 2023.1.21
teb_local_planner も、Navigation2 の controller に、 追加のplugin として組み込んでいるだけみたい。
/plugin_tutorials/docs/writing_new_nav2controller_plugin/#3- Pass the plugin name through the params file
サンプルの teb_params.yam を流用すれば、簡単に動かせました。
但し、xy_goal_tolerance、yaw_goal_tolerance には、別途 goal checker plugin の記述が必要でした。
1) global planner が、具合が悪いみたい。
途中で、機能不全になる。
tolerance: 0.5
では、目的地へのコースを算出できないみたい。
問題点としては、global costmap で、
obstacle_layer
data_type: "PointCloud2"
を使っていて、ロボットが前傾した時に、部屋の床が、障害物になっている所為のような気がします。
此処を、対処することが先決か?
local costmap も同様に、床が障害物判定される影響で、通り道が塞がれるので、Success!! にならない。
voxel pulgin、 obstacle plugin の、
<voxel layer>. <data source>.min_obstacle_height: 0.6
<obstacle layer>. <data source>.min_obstacle_height: 0.6
にした。
max_obstacle_height、min_obstacle_height をなるべく近づけて、上下の幅を狭くして、LaserScan のように使うほうがよいかも。
あと、ロボットの半径と障害物の半径を、下記にして、
robot_radius: 0.18 -- ロボットが、回転する際に描く円の半径。
inflation_radius: 0.2 -- 0.0 でも良い気がするが。
実際の、foxbot_core3 ロボットサイズに近づけて、大体、完走できるようになりました。
local costmap、global costmap に障害物が検出されて、目的地へのコースが塞がれると、右往左往します。