地平线旭日®X3派(下文简称旭日X3派)是一款拥有着高算力,面向生态开发者的嵌入式开发板,可用于机器人、无人驾驶、智能家居等领域,并搭载了TogetherROS开发平台,可高效进行机器人开发。ChatGPT是一款由OpenAI开发的自然语言处理模型,可以理解人类语言、自动生成文本、回答问题和完成其他任务,还可以与其他技术联动,实现更加复杂的应用。
旭日X3派遇上ChatGPT会碰撞出什么火花呢?本文使用旭日X3派作为载体,在OriginBot上使用ChatGPT进行问答。相关问题欢迎大家注册加入地平线开发者社区交流讨论,配置文件及代码详见地平线开发者社区。
环境配置
1、解释OriginBot小车代码
2、解释运动学模型
3、使用OpenCV在OriginBot小车上实现巡线功能
4、在ROS2环境中实现gmapping或者cartographer
5、总结对话
综上,我们发现ChatGPT有着记忆储存的功能,它区别于SiRi传统的一问一答,能根据聊天的上下文进行互动并归纳总结所有的问题,协助我们完成编程。并且ChatGPT在回复消息时是逐字的显示,很难感觉到是和机器人在对话,仿佛它只是个博学的朋友。
它在针对简单编程问题的处理上可谓是非常惊艳,在ROS相关的问题上,比我们人类更有耐心解答,有时会画出重点并扩展更多的相关知识帮助你去解决问题掌握技术。
既然ChatGPT都能接入WX,那么它和旭日X3派一定也能「chat」一下!不妨我们直接询问ChatGPT,该如何使得旭日X3派和ChatGPT联系起来!它给了我们这样的一个答案:
模型部署
1、部署基本环境
进入旭日X3派,执行以下命令(此处使用的是OriginBot v1.0.2的镜像):
pip3 install openai
2、学习OpenAI API如何使用
import openai
# 将OpenAI访问令牌设置为环境变量
openai.api_key = "YOUR_API_KEY"
# 调用OpenAI GPT-3模型,生成回答
response = openai.Completion.create(
engine="text-davinci-002",
prompt="你好!",
max_tokens=1024, # 最大1024个标记
temperature=0.7,
n=1,
stop=None,
)
# 输出生成的回答
print(response.choices[0].text)
3、书写节点代码
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
import openai
class OpenAINode(Node):
def __init__(self):
super().__init__('openai_node')
self.publisher_ = self.create_publisher(String, 'openai_text', 10)
self.subscription = self.create_subscription(
String,
'user_input',
self.listener_callback,
10)
self.subscription # 防止被Python垃圾回收机制删除
def listener_callback(self, msg):
# 处理从ROS话题订阅到的输入
input_text = msg.data
# 调用OpenAI的GPT-3模型生成文本
openai.api_key = 'YOUR_API_KEY'
response = openai.Completion.create(
engine="davinci",
prompt=input_text,
max_tokens=60,
n=1,
stop=None,
temperature=0.7
)
# 将生成的文本发布到ROS话题
self.publisher_.publish(response.choices[0].text)
def main(args=None):
rclpy.init(args=args)
openai_node = OpenAINode()
rclpy.spin(openai_node)
openai_node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
4、部署到旭日X3派中
此处,即可按照古月老师的ROS2 21讲的方式来创建一个基于python的功能包。
5、程序运行
可以看到,此处运行状态与理想情况有较大出入。回到这一段代码:
import openai
# 将OpenAI访问令牌设置为环境变量
openai.api_key = "YOUR_API_KEY"
# 调用OpenAI GPT-3模型,生成回答
response = openai.Completion.create(
engine="text-davinci-002",
prompt="你好!",
max_tokens=1024, # 最大1024个标记
temperature=0.7,
n=1,
stop=None,
)
# 输出生成的回答
print(response.choices[0].text)
当前,engine使用的模型,此处是”text-davinci-002“,prompt是指输入文本,max_tokens指的是最大输出文字。首先,打印出所有的模型,示例代码如下:
import openai
# 将OpenAI访问令牌设置为环境变量
openai.api_key = "YOUR_API_KEY"
# 获取OpenAI最新的语言模型名称
models = openai.Model.list()
latest_model = models['data'][0].id
print("最新的OpenAI语言模型是:", latest_model)
print("\n")
printf("所有的模型如下:", models)
与当前WX接入ChatGPT方式进行对照发现,可将其理解为Transformer模型,直接把当前和之前所有的问题和回答都当成输入,生成最终的代码:
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
import openai
class OpenAINode(Node):
def __init__(self):
super().__init__('openai_node')
self.publisher_ = self.create_publisher(String, 'chatgpt_node', 10)
self.subscription = self.create_subscription(
String,
'user_input',
self.listener_callback,
10)
self.history = ""
def listener_callback(self, msg):
# 处理从ROS话题订阅到的输入
input_text = msg.data
self.history += input_text
self.history += " "
# 调用OpenAI的GPT-3模型生成文本
openai.api_key = 'KEY'
#models = openai.Model.list()
#latest_model = models['data'][0].id
#print(models)
response = openai.Completion.create(
engine="text-davinci-003",
prompt=self.history+input_text,
max_tokens=1024,
n=1,
stop=None,
temperature=0.7
)
# 将生成的文本发布到ROS话题
msg = String()
msg.data = response.choices[0].text
print(msg.data)
self.history += msg.data
self.history += " "
def main(args=None):
rclpy.init(args=args)
chatgpt_node = OpenAINode()
rclpy.spin(chatgpt_node)
chatgpt_node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
效果如下:
本文转自地平线发者社区
原作者:Lxxxb
原链接:https://developer.horizon.ai/...