地平线旭日®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
全部0条评论
快来发表一下你的评论吧 !