プロジェクト記録 / シャーシ接続、初回の走行、LiDAR-SLAMを検証済み
NUC ROS2屋内ロボット:センサー経路から初めての地図まで
Intel NUC、Astra Pro、X2 LiDAR、メカナムシャーシを使い、統一起動、速度インターフェース、オドメトリ、初期LiDAR地図を実機で検証した記録。
- ROS2
- NUC
- 移動ロボット
- SLAM
- メカナムシャーシ
このプロジェクトの出発点は、指示を聞く車を作ることではなかった。センサーが継続して出力するか、速度指令が安全にシャーシへ届くか、エンコーダーを使えるオドメトリにできるか、そしてLiDARと車体が同じ「前方」を見ているかを確かめることだった。
ハードウェアはIntel NUC、Orbbec Astra Pro RGB-Dカメラ、X2 2D LiDAR、四輪メカナムシャーシで、Ubuntu 22.04とROS2 Humbleを使用する。現在の成果は自律ナビゲーション製品ではなく、実機、地面走行、初期マッピングまで検証したシステム試作である。
二つの前方距離信号
Astra Proはカラー画像、深度画像、点群、TFをおよそ30 Hzで出力する。深度画像中央の有効値の中央値からfront_obstacle_distanceを作り、正面の障害物距離を独立トピックとして公開した。
ただし深度カメラだけを安全源にしてはいけない。近距離の机上テストでは約0.45 mで無効値が出ることがあったが、X2は連続して距離を返した。そこでLiDARの扇形距離と深度結果をobstacle_statusへ統合し、信頼できるどちらか一方が遮蔽を報告したら停止状態を保持するようにした。
これはセンサーを数多く積むためではない。深度は近場で失敗し、LiDARは近距離の補助になり、近い値を返したときには取り付けや座標の検査にもなるという失敗特性を、判断へ明示的に入れるためである。
「データがある」から「車体の前にある」へ
X2は/scanを安定して公開する。壁面距離テストの誤差はおよそ1~4 mmで、車体全体の起動でも走査の安定性を確認できた。問題は座標規約だった。物理的な前方の扇形が生のスキャンでは約180°に現れ、通常想定する0°ではなかったのである。
そのためbase_link → laserをZ軸まわりに180°回転する静的変換へ修正し、LiDARとカメラを一つのTFツリーへ置いた。最新構成では車体中心をbase_linkとし、LiDARを(0.095, 0, 0.10) m、カメラを(0.11, 0, 0.15) mに配置する。robot_bringupはシャーシ、Astra Pro、静的TF、X2、障害状態ノードを統一起動し、/cmd_vel、/odom、/scan、/tf、/tf_static、カメラトピックを提供する。
LiDARモーターはデフォルトで停止し、start_lidar:=trueを明示したときだけ起動する。「起動できる」と「常に回すべき」を分けるための安全上の境界である。
/cmd_velを測れる運動へ変える
元の制御基板はバックアップし、ST-Linkで最小テストプログラムの起動を確認した。しかしNUCからType-C/CH340経路で安定通信できなかったため、未検証の古いプロトコルを解決済みとせず、四つのエンコーダー、速度閉ループ、シリアルフィードバックを持つ新しいドライバ基板へ切り替えた。
ROS2シャーシノードは/cmd_velを購読し、前進、横移動、角速度を四輪の目標速度へ分配する。エンコーダーから/odomを公開し、odom → base_linkをブロードキャストする。起動時は現在のカウントをゼロ基準にし、指令タイムアウト時と終了時には車輪を停止する。
初回の地面検証
最初は低速の定時指令を使った。0.05 m/sで10秒前進するとオドメトリは約0.488 m、実測は約0.50 mだった。左横移動は0.408 mに対して実測約0.38 m、0.20 rad/sで8秒間左旋回すると約90.8°に対して実測約87°、平行移動のずれは約4.6 mmだった。
これはシャーシ、車輪順序、エンコーダーの符号、メカナム運動学が一緒に動いている証拠である。同時に、オドメトリが初期校正に過ぎないことも示す。現在のタイル床で90°旋回を繰り返した結果、角速度補正係数は約1.033となったが、地面、荷重、電圧が変われば再測定が必要である。
SLAMを接続し、ナビゲーション完了とは言わない
シャーシ運動とTFの基礎が整った後、2D LiDARだけを使うslam_toolboxを接続した。/map、/map_metadata、map → odomが得られ、最初の静止スキャンでは0.05 m分解能、153 × 109セルの地図を出力した。低速の四角形走行後は225 × 209セルへ拡大し、既知の空きセルは約1008から8243へ、占有セルは約76から1152へ増えた。
これはスキャン、オドメトリ、変換が共同で地図を作った証拠であるが、ナビゲーションが完成した証拠ではない。取り付けと車体の遮蔽により、LiDARの有効範囲は主に前方に集中している。LANの読み取り専用地図ビューアは、更新と保存を確認するために追加したもので、制御入口ではない。
現在の境界
現在はシャーシ、カメラ、LiDAR、静的TF、障害状態の経路を統一起動できる。車体起動時のX2走査周波数は約16.6~17.1 Hzで、センサー試験、初回走行、初期マッピングには再確認できる結果がある。
残る課題は、長距離と複合運動でのオドメトリ校正、NUCの電源変換と配線、LiDAR取り付けの改善、停止・非常停止・低電圧試験、安定した地図とオドメトリを前提にしたNav2の導入である。高レベルの言語モデルの意図をナビゲーション目標へ接続するのはその後であり、モデルにモーターを直接制御させることはしない。