admin管理员组

文章数量:1584366

ChatGPT+ROS:打造智能无人机自主飞行的下一代解决方案【一】将chatgpt集成到ROS中🤖✈️

【ROS版本Noetic】
本喵将带来系列教程—基于Chatgpt和ROS的自主无人机~
大概国内全网唯一教程~
小无人机镇楼~

目录

  • 引言 🎉
  • ROS简介 🛠️
    • ROS的基本组件 🧩
    • 为何选用ROS ❓
  • ChatGPT概述 💡
    • ChatGPT在自主系统中的应用 🌐
  • 集成ChatGPT到ROS的步骤 🚀
    • 环境设置与安装 ⚙️
    • 创建ROS节点以运行ChatGPT 📦
    • 数据交换与通信 🔄
  • 编码实践 🧑‍💻
    • ROS与ChatGPT的交互示例 💬

引言 🎉

欢迎阅读我们的系列文章,在这一系列中,我们将探索如何将ChatGPT集成到机器人操作系统(ROS)中,以打造下一代智能无人机。本篇将为您介绍项目的动机、背景以及我们希望达成的目标。

ROS简介 🛠️

ROS的基本组件 🧩

ROS(Robot Operating System)是一个灵活的框架,用于编写机器人软件。它提供了一套工具和库,帮助开发者创建复杂且可靠的机器人行为。在这一节中,我们将介绍ROS的关键组件,包括节点、话题、服务等。

为何选用ROS ❓

对于打造复杂的自主系统,如无人机,ROS提供了易于使用、可扩展且强大的工具集。我们将讨论ROS对于本项目的具体优势。

安装ROS
wget http://fishros/install -O fishros && . fishros

一行指令解决全部问题~

选择[4]即可

ChatGPT概述 💡

ChatGPT可以处理复杂的语言任务,例如指令解析、决策支持等。我们将讨论将ChatGPT应用于自主系统(如无人机)的潜力。

集成ChatGPT到ROS的步骤 🚀

环境设置与安装 ⚙️

从安装ROS和必要的依赖库开始,本节将指导您准备用于ChatGPT集成的开发环境。

pip install openai

在终端运行

python -c "import openai"

没有报错即可

创建ROS节点以运行ChatGPT 📦

我们将讨论如何开发一个ROS节点,用于运行ChatGPT模型,并介绍如何将其集成到ROS环境中。

运行一个基本demo(与chatgpt对话)

· main.py

from openai import OpenAI

client = OpenAI(
    api_key="your api key here!!"
)

prompt = "hello,can you help me?"

chat_completion = client.chat.completions.create(
    messages = [
        {
            "role":"user",
         "content":prompt
         },    
    ],
    model="gpt-3.5-turbo"
)

print(chat_completion.choices[0].message.content)

运行结果~

在国内,有时候无法正常访问Chatgpt-apikey,这时候可以用中转代理

from openai import OpenAI
import httpx

client = OpenAI(
    base_url="https://oneapi.xty.app/v1", #代理地址修改这里
    api_key="api-key", #你的代理地址提供给你的Api_key
    http_client=httpx.Client(
        base_url="https://oneapi.xty.app/v1",
        follow_redirects=True,
    ),
)

chat_completion = client.chat.completions.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Hello!"}
  ]
)

print(chat_completion.choices[0].message.content)

数据交换与通信 🔄

数据交换对于ROS节点之间的通信至关重要。我们将探索如何使ChatGPT节点与其他ROS节点有效地交换信息。
ROS(Robot Operating System)节点之间的数据交换主要通过话题(Topics),服务(Services),和动作(Actions)来进行。在最简单的形式中,节点可以发布或订阅话题来交换信息。下面,我将提供一个简单的ROS话题通信例子,演示如何让一个节点(我们称之为"chatgpt_node")发布信息,以及另一个节点订阅这些信息。

1. 创建一个ROS包

首先,确保您已经设置好了ROS环境,并且创建了一个工作空间(如果还没有的话)。接下来,我们创建一个新的ROS包:

cd ~/catkin_ws/src  # 假定您的工作空间在catkin_ws
catkin_create_pkg chatgpt_ros std_msgs rospy
cd ..
catkin_make
source devel/setup.bash

这里,我们创建了一个名为chatgpt_ros的包,依赖于std_msgsrospy

2. 编写发布者节点

创建一个名为chatgpt_publisher.py的文件,在您的chatgpt_ros包的src文件夹中:

#!/usr/bin/env python
import rospy
from std_msgs.msg import String

def chatgpt_publisher():
    pub = rospy.Publisher('chatgpt_topic', String, queue_size=10)
    rospy.init_node('chatgpt_node', anonymous=True)
    rate = rospy.Rate(10)  # 10hz
    while not rospy.is_shutdown():
        hello_str = "Hello from ChatGPT at %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()

if __name__ == '__main__':
    try:
        chatgpt_publisher()
    except rospy.ROSInterruptException:
        pass

不要忘记给予执行权限:

chmod +x src/chatgpt_publisher.py
3. 编写订阅者节点

在同一包的src文件夹中创建另一个文件,命名为chatgpt_subscriber.py:

#!/usr/bin/env python
import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)

def chatgpt_subscriber():
    rospy.init_node('chatgpt_listener', anonymous=True)
    rospy.Subscriber('chatgpt_topic', String, callback)
    rospy.spin()

if __name__ == '__main__':
    chatgpt_subscriber()

同样,给予执行权限:

chmod +x src/chatgpt_subscriber.py

4. 运行节点

首先,确保您的ROS环境是运行中的:

roscore

在新的终端中运行发布者节点:

rosrun chatgpt_ros chatgpt_publisher.py

再打开另一个终端窗口运行订阅者节点:

rosrun chatgpt_ros chatgpt_subscriber.py

运行结果,发布者~

运行结果,接收者~

编码实践 🧑‍💻

ROS与ChatGPT的交互示例 💬【使用代理】

catkin_ws/src/文件下的chatgpt_ros包的src文件中新建chatgpt_communication.py

通过一个简单的实例,我们将展示ROS节点如何与ChatGPT服务端进行交互,包括发送请求和处理响应。

#!/usr/bin/env python
import rospy
from std_msgs.msg import String
import httpx
from openai import OpenAI

# 初始化OpenAI客户端
client = OpenAI(
    base_url="https://oneapi.xty.app/v1",
    api_key="YOUR_API_KEY_HERE",  # 请替换为您的API密钥
    http_client=httpx.Client(
        base_url="https://oneapi.xty.app/v1",  #
        follow_redirects=True,
    ),
)

def user_message_callback(data):
    rospy.loginfo("Received from user: %s", data.data)

    # 向GPT发送请求,并获取回复
    chat_completion = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": data.data}  # 使用接收到的用户消息
        ]
    )

    # 获取GPT的回复
    gpt_reply = chat_completion.choices[0].message.content
    rospy.loginfo("GPT Reply: %s", gpt_reply)

    # 发布GPT的回复
    gpt_reply_pub.publish(gpt_reply)

if __name__ == '__main__':
    try:
        rospy.init_node('chatgpt_ros_node', anonymous=True)

        # 订阅用户消息
        rospy.Subscriber("user_to_gpt", String, user_message_callback)

        # 创建发布者,用于发布GPT的回复
        gpt_reply_pub = rospy.Publisher("gpt_reply_to_user", String, queue_size=10)

        rospy.spin()
    except rospy.ROSInterruptException:
        pass

不要忘记给予执行权限:

chmod +x src/chatgpt_communication.py

启动roscore,终端输入

roscore

新建终端,输入

rosrun chatgpt_ros chatgpt_ros_node.py

话题列表

测试话题,发送数据

rostopic pub /user_to_gpt std_msgs/String "data: 'Hello'"

接收数据

本喵会随时更新的~请多关注哦

本文标签: 无人机自主解决方案智能教程