Python ROS2 プログラム 高専4年生

【ROS2講座⑪】LiDARを使った自律制御【DOGZILLA】【Python】

前回は4足歩行ロボットの姿勢制御について学びました。

LiDAR(レーザ距離センサ)の基礎と利用

1. LiDAR(ライダー)とは?

LiDAR(Light Detection And Ranging)は
レーザー光を照射 → 距離を測定 するセンサです。

◆ どうやって距離を測る?

  1. センサがレーザー光を発射
  2. 物体に当たって反射
  3. 帰ってくるまでの時間(Time of flight)を測定
  4. 距離=「光速 × 時間 / 2」から計算

→「物体までの距離」と「方向」がわかる

360度回転できるモデルは
 周囲の障害物を全方向で測定可能

2. DOGZILLA に搭載されている LiDAR

DOGZILLA S2 には
MS200シリーズのLiDAR が搭載されています。

特徴説明
最大測距 12mかなり広い範囲を検出可能
360°スキャン周囲全方向を測定
高速スキャン移動中も利用可能
コンパクトDOGZILLAに搭載しやすい

3. LiDARから取得できるデータ

LiDARは ROS2 上で
/scan トピックとして配信されます。

/scan の内容

内容説明
angle_min計測開始角度(例:0°)
angle_max計測最終角度(例:360°)
ranges[]距離データ配列(単位 m)
intensities[]反射強度(物体の材質で変化)

ranges 配列
→ たとえば360点なら
 1°ごとの距離が格納されるイメージです。

4. LiDAR用ノードの起動

基本的にこのロボットではROS2で以下の bringup を行うことでLiDARノードも起動できます。

ros2 launch bringup Navigation_bringup.launch.py

起動後に以下のコマンドを別のターミナルで実行すると配信されているトピックを確認できます。

ros2 topic list

以下のようなトピックが配信されていることがわかります。

ros2 topic list
/cmd_vel
/imu/data_raw_self
/joint_states
/parameter_events
/robot_description
/rosout
/scan
/tf
/tf_static

中身は以下のコマンドで確認できます。

ros2 topic echo /scan

GUIで確認したければRviz2で確認してみましょう。

rviz2
  • Add → LaserScan
  • Topic に /scan を指定
  • Fixed Frame→base footprint

→ 360度の距離が点群として見えます

障害物回避

LiDAR(レーザ距離センサ)を使って
周囲の障害物を検知し、自動で回避行動をとる仕組みを学びます。

LiDARは前章で説明したように、360°の距離データを取得できます。
このデータを使えば、ロボットの前方に「壁」「人」「物体」があるかを判断し、
止まる・方向を変えるといった動作を自律的に行えます。

まずはbringupを起動します。

ros2 launch bringup Navigation_bringup.launch.py

次に障害物回避ノードを起動します。

ros2 run yahboom_laser laser_Avoidance_xgo_RS200

起動すると、ターミナルに

“Start it.”
のようなログが表示されます。

障害物回避プログラムは
デフォルトではオフ(Switch=False) のため動作しません。

3つ目のターミナルでパラメータを変更できるGUIを起動します。

ros2 run rqt_reconfigure rqt_reconfigure

Switchに✓を入れるとロボットが動き出します。

このGUIではほかに、

ResponseDist(障害物距離)

linear(前進速度)

angular(旋回速度)

LaserAngle(観測角度)

の値を調整できます。

LiDAR の /scan を読み取り:

  • 右側に一定数以上の近距離点 → 右に障害物
  • 左側 → 左に障害物
  • 正面 → 前方に障害物

という判定を行い、
状況に応じて /cmd_vel を出力します。

例:

  • 前が空いている → 前進
  • 前が近い → 左 or 右に回避
  • 左右も近い → 一旦後退 → 再判定

課題15

こちらの障害物回避のプログラムのソースを確認し、プログラムのアルゴリズムの内容を説明してください。

/root/yahboomcar_ws/src/yahboom_laser/yahboom_laser/laser_Avoidance_xgo_RS200.py

LiDAR Trackin(LiDAR 追従)

LiDAR Tracking とは、
LiDAR が検知した “もっとも近い物体” の方向を検出し、
DOGZILLA をその方向へ向かわせたり、
対象に追従する動作を実現するものです。

この機能は LiDAR の /scan 情報から

  • いちばん近い物体の方向(角度)
  • その物体までの距離

を計算し、

  • 物体の方向へ旋回
  • 適度な距離を維持しつつ前進する

といった動作を実現します。

障害物回避の「避ける」に対して、
LiDAR Tracking は「追いかける」機能に相当します。

まずはbringupを起動します。

ros2 launch bringup Navigation_bringup.launch.py

次にRadar Tracking ノードを起動します。

ros2 run yahboom_laser laser_Tracke_RS200

Radar Tracking は Switch=False のままでは動きません

別ターミナルでGUIを起動します。

ros2 run rqt_reconfigure rqt_reconfigure

switchにチェックを入れると動きます。

パラメータ意味設定
Switch自律追従のON/OFF✔にする
ResponseDist追従したい距離例:0.5〜1.0
linear前進スピード0.2〜0.5
angular旋回スピード0.5〜1.0
LaserAngle探す角度範囲30〜60°

動作は以下の通りです。
手を正面にかざす
→ DOGZILLA が前進しながら距離調整

手を左に動かす
→ DOGZILLA が左旋回して追いかける

後ろに下げる
→ DOGZILLA が距離を詰めてくる

課題16

こちらのLiDAR Trackinのプログラムのソースを確認し、プログラムのアルゴリズムの内容を説明してください。

/root/yahboomcar_ws/src/yahboom_laser/yahboom_laser/laser_Tracker_xgo_RS200.py

Lidar Guard(警備モード)

この章では DOGZILLA の 「Lidar Guard(警備モード)」 を学びます。

Lidar Guard の動作イメージ

  1. LiDAR が最も近い物体を検出する
  2. 物体が横に動くとき、ロボットも同じ方向に向きを変える
  3. 物体がロボットに近づき、設定した距離よりも近くなるとアラーム音を鳴らす
  4. 物体が遠ざかるとアラームは止む

「不審者が近づきすぎたら警告する見張りモード」

を実現する機能です。

まずはbringupを起動します。

ros2 launch bringup Navigation_bringup.launch.py

次に警備モード(Lidar Guard)を起動します。

ros2 run yahboom_laser laser_Warning_RS200

起動しただけでは動きません。
必ず動的パラメータで Switch を有効化します。

別ターミナルで以下を実行します。

ros2 run rqt_reconfigure rqt_reconfigure
パラメータ意味推奨値
Switch警備モード ON/OFF✔ ON
ResponseDistブザーを鳴らす距離0.4〜1.0 など
LaserAngle監視する左右角度30〜60°
angular旋回スピード0.5〜1.0

前に立って近づいてみる
→ 距離が近づくとブザーが鳴る

左右に移動してみる
→ ロボットが向きを合わせて追従

ResponseDist を変えてみる
→ 警告が鳴るタイミングが変わる

課題17

こちらのLidar Guardのプログラムのソースを確認し、プログラムのアルゴリズムの内容を説明してください。

/root/yahboomcar_ws/src/yahboom_laser/yahboom_laser/laser_Warning_xgo_RS200.py

次回はこちら

Comming soon

Follow me!

-Python, ROS2, プログラム, 高専4年生
-, , , ,

PAGE TOP