オドメトリー実験車を動かす

オドメトリー実験車の動かし方は次の3通りある。
➀ ジョイスティックでコントールする
 単純にジョイスティックをラジコンのコントローラーとして使う動かし方。
➁ ロボットの動きを画面上で確認する
 ➀の動きをRviz2を使って画面上で確認する。
➂ ArUcoマーカーを使ってロボットの位置を補正する
 ジョイスティックによる移動に加え、トピック/waypointsを使って指定の位置に移動することができる。また0,0への移動を指定すると、0,0に到着したタイミングでロボット上のArUcoマーカーをカメラが検出し、その位置を使ってロボットの現在位置を補正することができる。

ロボットカーに電池をセットする。
まずは、下記の画像のように電池を設定し、電源ボタンをonにする。

写真の向きに電池をセットする。電源ボタンを押すと横のOLEDにプログラム名が表示される。

ジョイスティックでコントロールする

画像に alt 属性が指定されていません。ファイル名: odometry_11-1024x486.jpg

ジョイスティックでロボットカーを操作する場合の起動手順である。上の図でジョイスティックはPC2に接続しているが、Raspberry Pi 5でよいし、この方が使いやすい。

Raspberry Pi 5のターミナルから起動。

 Raspi5のターミナル1 --- ジョイステックをRaspi5にペアリングする            その他のコマンド
sudo bluetoothctl             # bluetoothctlコマンドのインタラクティブモードで実行する
connect 6B:CF:6F:C4:1D:9E     # ペアリングは済んでいるので接続する   ※ジョイスティックを接続可能にしておく

disconnect 6B:CF:6F:C4:1D:9E  # 切断する

 Raspi5のターミナル2 --- ジョイステックをROS2に接続する。
ros2 run joy_linux joy_linux_node

 Raspi5のターミナル3 --- micro-ROS-Agentを起動する 【ESP32の ENボタン を押して再起動すること】
ros2 run micro_ros_agent micro_ros_agent udp4 -p 8888

※dockerを使う場合
sudo docker run -it --rm -v /dev:/dev --privileged --net=host microros/micro-ros-agent:jazzy udp4 --port 8888

ジョイスティックでロボットをコントロールするプログラムを起動する。

 PC2(DELL2)のターミナル --- ロボットをコントロールするAPP
ros2 run dc_motor_encoder micro_ROS_joy2cmd_vel    --- APPを起動する

画面上のロボットの動きをRviz2(可視化ツール)で見てみる

上の「ジョイスティックでコントロールする」に加えて、Rviz2(可視化ツール)を使うと画面上でロボットの動きを見ることができる。

エンコーダ値からオドメトリーをパブリッシュするプログラムを起動する。

 PC1(DELL2)のターミナル --- オドメトリーをパブリッシュするAPP
ros2 run dc_motor_encoder micro_ROS_odometry    --- APPを起動する

④Rviz2を起動する。

PC1(DELL2)のターミナル --- Rviz2を起動する。
rviz2

➀ 画面の右下「Add」をクリックして現れたダイアログからOdometryを選択する。
➁ Odmetryが表示され Status OK を確認する。
➂ Fixed Frame で odomを選択すると右のロボット移動の状態が表示される。  

odomとbase_linkを表示する。

odometryをパブリッシュする例
odomとbase_linkをRviz2に表示した例

 ArUcoマーカーでロボットの位置情報を補正する

➀カメラを座標0.0の真上にセットする。
カメラから見た中心が、座標0,0になる。この実験では、カメラを真下に向け、床面から1.25mの高さに設定した。

➁Raspberry Pi 5 のターミナルから下記を起動する。

ターミナル1 --- ジョイステックをRaspi5にペアリングする            bluetoothctlのその他のコマンド
sudo bluetoothctl             # bluetoothctlコマンドのインタラクティブモードで実行する
connect 6B:CF:6F:C4:1D:9E     # ペアリングは済んでいるので接続する   ※ジョイスティックを接続可能にしておく

disconnect 6B:CF:6F:C4:1D:9E  # 切断する

ターミナル2 --- ジョイステックをROS2に接続する。
ros2 run joy_linux joy_linux_node

ターミナル --- カメラの画像とカメラ情報をトピックで出力する。
ros2 run usb_cam usb_cam_node_exe --ros-args --remap video_device:=/dev/video0 -p framerate:=15.0

ターミナル --- 画像を確認する。
ros2 run rqt_image_view rqt_image_view

ターミナル --- 画像トピックからマーカー情報をトピックで出力する。
ros2 run ros2_aruco aruco_node --ros-args -p aruco_dictionary_id:=DICT_4X4_50 -p image_topic:=/image_raw -p camera_info_topic:=/camera_info -p marker_size:=0.055  # マーカーのサイズを 0.065 → 0.055 に補正

 ターミナル --- micro-ROS-Agentを起動する 【ESP32の ENボタン を押して再起動すること】
ros2 run micro_ros_agent micro_ros_agent udp4 -p 8888

※dockerを使う場合 --- PC2(ubuntu)の場合
sudo docker run -it --rm -v /dev:/dev --privileged --net=host microros/micro-ros-agent:jazzy udp4 --port 8888
 PC2(DELL2)のターミナル --- ロボットをコントロールするAPP
ros2 run dc_motor_encoder micro_ROS_joy2cmd_vel    --- APPを起動する

※以下は、PCの組み合わせを変えた場合の操作方法

PC2(DELL2)の代わりにPC1(WSL2)を使ってファイアウォール再設定する場合。操作方法

 現在PC1(WSL2)のターミナルから使えない。 ---- アップデート以降、WSL2とWindowsのミラーリングが機能していない。
 PC1(WSL2)のターミナル --- ロボットをコントロールするAPP
source ~/myenv/bin/activate                        --- 仮想環境に入る
ros2 run dc_motor_encoder micro_ROS_joy2cmd_vel    --- APPを起動する

ジョイステックをPC(ubuntu)にペアリングする場合(参照)。

ジョイスティックの操作

十字ボタン上下→前進/行進
左右→左右の回転
停止状態からは、6回押して動き出す。
〇ボタン停止停止と同時に巡回も打ち切る。
✕ボタン現在地の座標設定
x:0,y:0,theta:0
△ボタン座標x:0,y:0に移動し、
マーカーの座標で更新する
マーカーを監視するカメラが動作していること。
🔲ボタン巡回パターン3
L1ボタン巡回パターン1
R1ボタン巡回パターン2
OPTIONボタントピックで指定した巡回パターン下の「トピック/waypointsを使った巡回パターンの使い方」参照。

トピック/waypointsを使った巡回パターンの使い方

トピック/waypointsは、文字列型のトピックで、巡回する座標を指定する。
       p:[x座標]/[y座標] ------ 指定する座標と次の座標との区切り文字は';'(セミコロン)である。
                               座標0,0を指定するとロボットのマーカーをカメラが認識し、現在のオドメトリーを更新する。
    c:-              ------ これ以前に指定した内容をクリアする。
指定例
ros2 topic pub --once /waypoints std_msgs/msg/String "{data: p:0.0/1.8;p:-1.0/1.0;p:-1.5/0.0;p:-1.0/-0.5;p:-0.7/0.5;p:0.0/0.0}"

ros2 topic pub --once /waypoints std_msgs/msg/String "{data: p:-0.5/0.0;p:-1.0/-0.5;p:-1.5/0.0;p:-1.0/1.0;p:0.0/1.8;p:0.0/0.0}"

# これ以前の指定をクリアする。
ros2 topic pub --once /waypoints std_msgs/msg/String "{data: c:-}"

動作環境

PC1Windows11上のWSL2
Ubuntu 24.04.1 LTS
jazzy
※ESP32 dev ModuleがCOMポートで認識しない。
PC2Ubuntu 24.04 LTS
※joystickのBluetooth接続ができるので使用。
Raspberry Pi 5Ubuntu 24.04.1 LTS
jazzy
Arduino IDE 1.8.19
ESP32ESP32 dev Module 38pin
実験車こちらを参照

—-

  

参照

ATOMS3R M12カメラキットの画像をROS2にパブリッシュ
[ROS2]カメラキャリブレーションの方法