1. はじめに
今まで、ROS2を使って様々なシミュレーションをしてきましたが、基本的に自分でシーケンスを組んでそれ通りに動かすというものでした。そんな中でなんとなく「適当に指示を出したら、ロボットがいい感じに動いてくれないだろうか?」ということを考えるようになりました。
そんなときに見つけたのが、以下のリポジトリです。
このリポジトリを使えば、これまでぼんやりと考えていたことが実現できるのではないかと思い、私の持っている環境でもできるのかな?と試してみたのが今回の記事です。
今回やってみたのは、 ローカルLLM(Ollama) と ros2ai をつないで、Gazebo上のTurtleBot3に対して /cmd_vel を 1回だけ publish し、前進させるというものです。(なお、Ollamaの解説については他の方が詳細な解説をされておりますので、そちらをご参照ください。)
- 本記事の目的:「LLM→ros2ai→ROS2 CLI実行→Gazeboロボが動く」をひとまず試してみる
- 割り切り:LLMに“賢く速度を考えさせる”のは後回し
2. 実行環境
- CPU: CORE i7 7th Gen
- メモリ: 32GB
- GPU: GeForce RTX 2070
- OS: Ubuntu22.04(WSL2ではなくPCに直接インストール)
3. 構築手順
3.1. 全体像(ざっくり)
ターミナル3つで動かします。
- T1:Ollama(LLMサーバ) ※検証中だけ起動
- T2:Gazebo(TurtleBot3)
- T3:ros2ai(LLM⇔ROS2)
3.2. Step 1(T1): Ollamaをインストール(初回だけ)
curl -fsSL https://ollama.com/install.sh | sh
3.3. Step 2(T1): Ollamaを「検証中だけ」起動する(サービス常駐させない)
まず、もしサービスが動いていたら止めます。
sudo systemctl stop ollama 2>/dev/null || true
sudo systemctl disable ollama 2>/dev/null || true
手動起動(このターミナルを開いている間だけ動きます)
ollama serve
以降、T1は閉じないでください(閉じるとOllamaが止まります)
3.4. Step 3(T3でもOK): モデルをダウンロード(初回だけ)
※ ollama serve が動いている状態で実行
ollama pull llama3.2:3b
ollama list
3.5. Step 4(T3): OllamaのHTTP疎通確認(毎回やると安心)
curl -s http://127.0.0.1:11434/api/generate \
-d '{"model":"llama3.2:3b","prompt":"Return only JSON: {\"linear\":0.1,\"angular\":0.0}","stream":false}'
JSONっぽい応答が返ればOK。
3.6. Step 5(T2): GazeboでTurtleBot3を起動
sudo apt update
sudo apt install -y ros-humble-turtlebot3*
source /opt/ros/humble/setup.bash
export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_gazebo empty_world.launch.py
3.7. Step 6(T3): ros2ai_ws を作成して ros2ai をビルド(初回だけ)
source /opt/ros/humble/setup.bash
mkdir -p ~/ros2ai_ws/src
cd ~/ros2ai_ws/src
git clone https://github.com/fujitatomoya/ros2ai.git
依存Python(Humble向け)
python3 -m pip install -U pip
python3 -m pip install -U openai ollama validators --ignore-installed
ビルド
cd ~/ros2ai_ws
colcon build --symlink-install --packages-select ros2ai
読み込み
source ~/ros2ai_ws/install/setup.bash
3.8. Step 7(T3): ros2aiをOllamaに接続(毎回やります)
unset OPENAI_API_KEY
export OPENAI_MODEL_NAME=llama3.2:3b
export OPENAI_ENDPOINT=http://127.0.0.1:11434/v1
接続確認
ros2 ai status -v
3.9. Step 8(T3): ros2ai から /cmd_vel を1回publishして前進させる(本記事のゴール)
ここが本記事のゴールです。
ros2aiの exec に「1回だけこれを実行して」と依頼して、/cmd_vel を1回publishします。
ros2 ai exec "Run this exactly once: ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist '{linear: {x: 0.1, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}'. Do not do anything else."
Gazebo上のTurtleBot3が少し前進すれば成功ですが、以下が成功した時の動画です。
3.10. Step 9(T3): 動かなかったときのデバッグ
「LLMは動いてそうなのに、ロボが動かない」時は、以下のことを確認しました。
ros2aiがOllamaに繋がっているか
ros2 ai status -v
api_endpoint が http://127.0.0.1:11434/v1 になっているか確認。
ros2ai抜きで手動publishすると動くか?
これで動かなければ Gazebo側の問題です。
ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.1, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"
ありがちな source 漏れ(T3)
source /opt/ros/humble/setup.bash
source ~/ros2ai_ws/install/setup.bash
3.11. Step 10(終了処理): 検証が終わったらOllamaを止める
手動起動(ollama serve)の場合
T1のターミナルで Ctrl + C。
サービスで動いていた場合👇
sudo systemctl stop ollama
3.12. おまけ:あいまいな指示を出そうとしたら、こんなエラーが出た(現象メモ)
次のレベルとして、曖昧な指示でやってみたところ、以下のようなエラーが出ました。
(とりあえず「こういうことが起きる」というメモとして残します。
あいまいな指示その1
ros2 ai exec "Move forward slowly once using /cmd_vel. Publish only once."
結果:
Package 'my_catkin_package' not found
あいまいな指示その2
ros2 ai exec "Check the message type of /cmd_vel, then publish a small forward motion once."
結果:
Warning: Multiple commands detected in "ros2 topic poll /cmd_vel -r 10 && sleep 5 && ros2 pub /cmd_vel geometry_msgs/msg/Twist --publish-key "/t /n 0.1" ". Only the first 'ros2' command will be executed.
usage: ros2 topic [-h] [--include-hidden-topics]
Call `ros2 topic <command> -h` for more detailed usage. ...
ros2 topic: error: argument Call `ros2 topic <command> -h` for more detailed usage.: invalid choice: 'poll' (choose from 'bw', 'delay', 'echo', 'find', 'hz', 'info', 'list', 'pub', 'type')
所感:
-
execは安全側の都合で 複数コマンド(&&連結)をそのまま実行しないらしい - LLMが
ros2 topic pollのような 存在しないサブコマンドを生成することがある
4. まとめ
今回はOllama(ローカルLLM)を起動し、ros2ai を OPENAI_ENDPOINT=http://127.0.0.1:11434/v1 に接続し、ros2 ai exec 経由で /cmd_vel を 1回だけ publishしてGazebo上のTurtleBot3を動かせました。次は、曖昧な指示でも安定させるプロンプトやコマンドを分割する運用などに取り組もうかと考えています。
参考サイト: