はじめに
TERAKATA Roboticsの連載第4回です。
これまでに、[第1回]ハードウェア、[第2回]Docker開発環境、[第3回]自律走行アルゴリズムについて解説してきました。
つくばチャレンジのような屋外ロボット競技会。そこは「時間との戦い」の場でもあります。
限られた走行枠の中で、準備し、走り、データを取る。
コンソール画面黒い画面に流れる大量のテキストログを目視で追っていては、日が暮れてしまいます。
「効率化できるところは、徹底的にツール化する」。
そのために私たちが開発した2つの強力なGUIツール(System Check Dashboard と Waypoint Editor)をご紹介します。これらはROS 2の標準GUIフレームワークである rqt のプラグインとしてPythonで実装しました。
1. System Check Dashboard (Docker Monitor)
ロボットの健康状態を一目で把握するための「コックピット」です。
私たちのシステムは全てDockerコンテナで構成されているため、コンテナの生死監視がそのままシステムチェックになります。
全体像
-
Container Status: 各機能(LiDAR, Navigation, Drivers等)のDockerコンテナが
Runningかどうかを一覧表示。 -
Error Detection: コンテナのログを裏で監視し、
[ERROR]や[FATAL]が出力されたら即座に赤色アラートを表示。 - Quick Actions: 問題のあるコンテナを、GUI上のボタン一つで「再起動(Restart)」できます。
Manual Checks (Topic Checker)
Dashboardには「Manual Checks」タブもあり、ボタン一つで診断スクリプトを実行できます。
特に Topic Checker は、LiDARやカメラなどの重要トピックを数秒間監視し、データが来ているか(STREAMING)、値が固まっていないか(STATIC)、そもそも来ていないか(NOT_RECEIVED)を判別してレポートします。
「コンテナは動いているのにセンサーデータが来ていない」といったゾンビ状態の検知に役立ちます。
実装のポイント:Docker Socket通信
ROSの標準的な diagnostics は使用せず、より低レイヤーかつ確実な Docker Unix Socket (/var/run/docker.sock) を直接叩く実装にしました。これにより、ROSノード自体が落ちていても検知可能です。
Dashboard Plugin (Python) の断片:
class DockerClient:
def __init__(self, socket_path='/var/run/docker.sock'):
self.socket_path = socket_path
def list_containers(self):
# Docker Daemonと直接通信してステータス取得
status, data = self._request('GET', '/containers/json?all=1')
return json.loads(data)
def get_logs(self, container_id, tail=200):
# ログを取得してエラー文字列を検索
endpoint = f'/containers/{container_id}/logs?stdout=1&stderr=1&tail={tail}'
status, data = self._request('GET', endpoint)
# ... (ログ解析処理) ...
Pythonの http.client をソケット通信でラップすることで、外部ライブラリ(docker-py等)に依存せず、軽量に実装しています。コンテナが落ちた瞬間に「再起動」ボタンを押せるこのツールは、現場での復旧速度を劇的に向上させました。
2. Waypoint Editor
500mのコースには、数十箇所の経由点(ウェイポイント)が必要です。
これをYAMLファイルに手打ちで x: 12.3, y: 45.6 と書いていくのは人間業ではありません。しかも、現地で「ここの曲がり角、もう少し手前で減速したいな」と思ったら、即座に修正が必要です。
そこで、Rviz上でマーカーをドラッグするだけで位置修正・一括削除ができるツールを作りました。
機能
- Spatial Editing: 読み込んだ経路上の全ポイントがインタラクティブマーカーとして表示され、マウス一つで位置や向きを微調整できます。
- Eraser Tool: 「このエリアの点はいらない」と思ったら、マウスで矩形領域を指定して一括削除できます。手作業で数十個消す苦行から解放されました。
- Stop Areas: 一時停止が必要な交差点などで、四角形の「停止エリア」を作成・配置できます。
- Undo/Redo: 操作ミスをすぐ取り消せる、安心設計です。
実装のポイント:Interactive Marker Server
バックエンドは InteractiveMarkerServer で実装されており、Rviz側のメニュー操作に応じて座標更新や削除ロジックが走ります。
rqtプラグインはランチャー(起動画面)として機能し、ファイル選択や距離ベースの間引き起動(Thinning)をサポートしています。
waypoints.yaml (例):
waypoints:
- id: 1
pose: {x: 10.5, y: 20.0, yaw: 1.57}
velocity: 0.8
stop_time: 0.0
description: "Start of Straight Line"
- id: 2
pose: {x: 50.0, y: 20.0, yaw: 1.57}
velocity: 0.5
stop_time: 3.0
description: "Intersection Stop"
このツールのおかげで、試走しながら「ここ危ないからポイントの位置を変更しよう」といった修正が、まるでゲームのエディタのように直感的に行えるようになりました。経路作成時間は、手打ち時代の10分の1以下に短縮されました。
3. コマンドエイリアス (Shell Scripts)
GUIだけでなく、CUIでの効率化も忘れていません。
~/.bashrc にチーム共通のエイリアスを定義し、長いコマンドを打つ手間をなくしました。
# よく使うコマンド
alias s='ros2 launch terabo_bringup navigation.launch.py' # Start
alias k='pkill -f ros2' # Kill all (暴走時用)
alias t='ros2 topic list'
alias b='colcon build --symlink-install'
alias source='source install/setup.bash'
# ログ確認用
alias check_batt='ros2 topic echo /terabo/battery'
「s で起動、k で停止」。
このシンプルさが、緊張感のある現場でのオペレーションミスを防ぎます。
まとめ
- System Check Dashboard: ロボットの悲鳴(異常)を聞き逃さない。
- Waypoint Editor: 500mのコース設計をクリエイティブな作業に変える。
- Shell Alias: 指先の迷いをなくす。
ツール作りは「開発のための開発」に見えて、実は「成果への最短ルート」です。
これらのツールは、今後の活動の中でオープンソース化(OSS)していく予定です。こうご期待!
次回はいよいよ最終回。
中之島での失敗と、つくばでの成功。2つの経験から見えた、私たちの 「次なる野望」 について語ります。
リンク
最新の活動状況や、今回紹介した技術のソースコードは以下で公開しています。
興味を持っていただけた方は、ぜひフォロー&スターをお願いします!
- Website: https://sites.google.com/view/terakata-robotics
- X (Twitter): https://x.com/terakata_robot
- Instagram: https://www.instagram.com/terakata_robotics/
- GitHub: https://github.com/TERAKATA-Robotics/terabo-navigation
