16
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【ROS2/Python】ChatGPTのAPIと連携するROS2ノードを作った

Last updated at Posted at 2023-03-08

はじめに

ROS 2でChatGPTを使えるchatgpt_rosを作って公開しました。
使い方等をまとめます。

環境

以下の環境で動作を確認しています。

項目 バージョン
Windows 11
WSL 2
Ubuntu 22.04
ROS2 Humble

準備

OpenAIのAPIの取得と、ROSノードのインストールを行います。

OpenAIのAPIの取得

OpenAI APIを利用するためには、OpenAIの公式サイトからAPI Keyを取得する必要があります。
API Keyの取得方法については、OpenAIのドキュメントを参照してください。

取得したAPIはChatGPT_APIという環境変数に設定してください。

export ChatGPT_API=XXX

パッケージのインストール

以下のコマンドを実行して、ChatGPT ROS2パッケージをインストールします。

$ cd ~/ros2_ws/src
$ git clone https://github.com/koichirokato/chatgpt_ros
$ cd ..
$ colcon build --symlink-install --packages-select chatgpt_ros
$ source install/setup.bash
$ source install/local_setup.bash

ROSノードの実行

Publish/Subscribe通信の使用

chatgpt_rosノードは、/input_text トピックに対して質問をsubscribeし、/output_text トピックに回答をpublishします。
この場合、APIから取得する回答の長さを意味するmax_tokensは50で固定です。

$ ros2 run chatgpt_ros chatgpt_ros

以下のコマンドを実行して、/input_text トピックにメッセージを送信し、ChatGPT ROS2パッケージからの回答を取得します。

$ ros2 topic pub /input_text std_msgs/String "data: 'Hello, ChatGPT.'" -1
$ ros2 topic echo /output_text
ros2 topic echoの出力例
data: '


  Hello there! How can I assist you today?'

サービスの実行

chatgpt_ros_serviceノードは、/chat_gpt_serviceサービスに対して質問と回答の長さを指定して送信し、回答を取得します。

$ ros2 run chatgpt_ros chatgpt_ros_service

以下のコマンドを実行して、/chat_gpt_service サービスに質問を送信し、ChatGPT ROS2パッケージからの回答を取得します。
lengthにはAPIからの回答の文字列の長さを入力します。

$ ros2 service call /chatgpt_service chatgpt_ros_interfaces/srv/ChatGptService "{text: 'What is your name?', length: 50}"
ros2 service callの出力例
waiting for service to become available...
requester: making request: chatgpt_ros_interfaces.srv.ChatGptService_Request(text='What is your name?', length=50)

response:
chatgpt_ros_interfaces.srv.ChatGptService_Response(response='\n\nAs an AI language model, I do not have a name. You can call me OpenAI. How may I assist you?')

要するに、以下の会話をしていますね。
ROS2側:
What is your name?

API:
As an AI language model, I do not have a name. You can call me OpenAI. How may I assist you?

サンプルのサービスクライアント(チャットボット形式)

また、サンプルのサービスクライアントも用意しました。
chatgpt_ros_serviceノードが立ち上がっている状態で以下のコマンドを実行してください。
チャットボットのような形でAPIと会話することができます。

$ ros2 run chatgpt_ros client_sample

実行例

ROS2のノードの使い方を教えてもらいました。サービス呼び出し時のlength(max_tokens)は500です。

$ ros2 run chatgpt_ros client_sample
[INFO] [1678279970.949053631] [chat_gpt_service_client]: Please enter your prompt for ChatGPT API. If you want to exit, please enter "quit"
> How do I make ROS2 node?
As an AI language model, I cannot provide the exact steps for creating a ROS2 node as it requires technical knowledge and coding skills. However, I can provide a brief overview of the process:

1. Install ROS2 on your system and set up the environment.

2. Create a new ROS2 package using the command line tool 'ros2 pkg create'.

3. Create a new node file within the package directory using a text editor or an Integrated Development Environment (IDE).

4. Define the node's name, namespace, and any required parameters.

5. Implement the node's functionality using ROS2 APIs such as Publishers, Subscribers, Services, and Actions.

6. Build the package using the command 'colcon build'.

7. Run the node using the command 'ros2 run <package_name> <node_name>'.

For more detailed information and tutorials on creating ROS2 nodes, please refer to the official ROS2 documentation.

実行例その2

ROS2のTwistメッセージのサンプルをJSON形式で渡してもらいました。サービス呼び出し時のlength(max_tokens)は同じく500です。

> Please show me sample Twist message for ROS2. Format is JSON.
Response:

{
   "header":{
      "seq":0,
      "stamp":{
         "sec":0,
         "nanosec":0
      },
      "frame_id":""
   
   "twist":{
      "linear":{
         "x":0.0,
         "y":0.0,
         "z":0.0
      },
      "angular":{
         "x":0.0,
         "y":0.0,
         "z":0.0
      }
   }
}

This is a sample Twist message for ROS2 in JSON format. It contains information about the linear and angular velocities of a robot. The "header" field includes a sequence number, timestamp, and frame ID. The "twist" field includes the linear and angular velocities of the robot. The "linear" field includes the x, y, and z components of the velocity, while the "angular" field includes the x, y, and z components of the angular velocity.
> Please show sample Twist message for stop command in ROS2. Format is JSON And you dont have to explain anything, your response is only JSON message.
Response:

{"op": "publish", "topic": "/cmd_vel", "msg": {"linear": {"x": 0.0, "y": 0.0, "z": 0.0}, "angular": {"x": 0.0, "y": 0.0, "z": 0.0}}}

まとめ

ROS2でChatGPT APIを使用するROSノードを作成しました。可能性は無限大だと思います。
今後は、APIをもっと活用するべく、APIのリクエストに入れるパラメータの精査を行おうと思います。

関連情報

  • ROS2で音声対話システムができるという情報もあります!!!

  • ROS1のC++で作成されたChatGPT APIを使用するROSノード

  • APIの公式ページ

[2023/3/11]
ROS newsで取り上げていただきました!

16
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?