このリポジトリはGPT-4を用いてラズパイマウスを制御するデモを実装したROS2パッケージです。
Ubuntu22.04, ROS2 Humbleでの動作を前提としています。
# ROS2ワークスペースに移動
cd ~/ros2_ws/src
git clone https://github.com/Azuma413/voice_gpt.git
cd ..
colcon build
- ラズパイマウスにssh接続してROSノードを起動
ros2 launch raspimouse raspimouse.launch.py
- rqtを起動
rqt
ServiceCallerからラズパイマウスの/motor_powerをTrueにする。
- メインのlaunchファイルを起動
ros2 launch chat_rover chat_rover.launch.py
- BehaviorTreeを起動
ros2 run chat_rover_bt main_node
以上の操作でロボットは音声入力待機状態へ移行します。
プログラムは全体としてROS2によって統合され,以下のようにノード同士が接続します。

こちらのディレクトリは本パッケージで利用するROSのメッセージ型を定義するためのものです。
こちらのディレクトリは主にサービスサーバーの形式で実装されたROSノードを纏めたものです。
chat_rover/chat_rover/に各種ノードを実装したpythonファイルが格納されています。
chat_rover/launch/にlaunchファイルが格納されています。
こちらのディレクトリは主にBehaviorTreeとそこで使われるROSノードを纏めたものです。
chat_rover_bt/srcにメインプログラムが格納されています。
chat_rover_bt/include/my_action_node.hppにBehaviorTreeのアクションノードが実装されています。
chat_rover_bt/include/my_ros_node.hppにBehaviorTreeで使われるROSのサービスクライアント等が実装されています。
chat_rover_bt/configにBehaviorTreeの構造を記したxmlファイルが格納されています。
BehaviorTree上でVOSKが呼び出されると,vosk_nodeのサービスが呼び出され,音声検出が始まります。音声を検出すると,その内容をBehaviorTreeへテキストとして返します。
VOSKはGPT1へそのテキストデータを送り,GPT1はそのデータをもとにgpt1_nodeを呼び出します。
gpt1_nodeは受け取ったテキストをGPT-4へ入力し,その出力を返します。GPT-4はテキストがロボットの命令であるかどうかを判断し,そうである場合は命令をより単純な形に分解します。
GPT1はGPT2へ受け取ったテキストデータを送ります。
yolo_nodeはリアルセンスから送られてくる映像データから物体を認識し,その物体名と座標をBehaviorTreeのYOLOへ送ります。YOLOはそのデータをGPT2へ送ります。
GPT2はGPT1から送られてきた単純な指示と,YOLOから送られてきた物体の位置情報を纏めてgpt2_nodeへ送ります。
gpt2_nodeは受け取ったデータをGPT-4へ入力し,その出力を返します。GPT-4はテキストデータから,ロボットの目標座標のリストを出力します。
GPT2はgpt2_nodeから値を受け取るとその情報をSendPosへ送ります。
SendPosは目標座標をpos2vel_nodeへ送ります。
pos2vel_nodeは目標座標と,ar_nodeから送られてくる現在位置のデータをもとに,ロボットの目標速度を定め,それをラズパイマウスへ送ります。
BehaviorTreeは以上の動作をTreeの構造に従い繰り返します。
