【ROS版本Noetic】
本喵将带来系列教程—基于Chatgpt和ROS的自主无人机
~
大概国内全网唯一教程~
小无人机镇楼~
欢迎阅读我们的系列文章,在这一系列中,我们将探索如何将ChatGPT集成到机器人操作系统(ROS)中,以打造下一代智能无人机。本篇将为您介绍项目的动机、背景以及我们希望达成的目标。
ROS(Robot Operating System)是一个灵活的框架,用于编写机器人软件。它提供了一套工具和库,帮助开发者创建复杂且可靠的机器人行为。在这一节中,我们将介绍ROS的关键组件,包括节点、话题、服务等。
对于打造复杂的自主系统,如无人机,ROS提供了易于使用、可扩展且强大的工具集。我们将讨论ROS对于本项目的具体优势。
wget http://fishros.com/install -O fishros && . fishros
一行指令解决全部问题~
选择[4]即可
ChatGPT可以处理复杂的语言任务,例如指令解析、决策支持等。我们将讨论将ChatGPT应用于自主系统(如无人机)的潜力。
从安装ROS和必要的依赖库开始,本节将指导您准备用于ChatGPT集成的开发环境。
pip install openai
在终端运行
python -c "import openai"
没有报错即可
我们将讨论如何开发一个ROS节点,用于运行ChatGPT模型,并介绍如何将其集成到ROS环境中。
· 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")发布信息,以及另一个节点订阅这些信息。
首先,确保您已经设置好了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_msgs
和rospy
。
创建一个名为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
在同一包的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
首先,确保您的ROS环境是运行中的:
roscore
在新的终端中运行发布者节点:
rosrun chatgpt_ros chatgpt_publisher.py
再打开另一个终端窗口运行订阅者节点:
rosrun chatgpt_ros chatgpt_subscriber.py
运行结果,发布者~ :
运行结果,接收者~:
在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'"
接收数据
本喵会随时更新的~请多关注哦