地平线机器人 · 2023年02月24日 · 江苏

当旭日X3派遇上ChatGPT,我们能「chat」什么

地平线旭日®X3派(下文简称旭日X3派)是一款拥有着高算力,面向生态开发者的嵌入式开发板,可用于机器人、无人驾驶、智能家居等领域,并搭载了TogetherROS开发平台,可高效进行机器人开发。ChatGPT是一款由OpenAI开发的自然语言处理模型,可以理解人类语言、自动生成文本、回答问题和完成其他任务,还可以与其他技术联动,实现更加复杂的应用。
旭日X3派遇上ChatGPT会碰撞出什么火花呢?本文使用旭日X3派作为载体,在OriginBot上使用ChatGPT进行问答。相关问题欢迎大家注册加入地平线开发者社区交流讨论,配置文件及代码详见地平线开发者社区。

环境配置

1、解释OriginBot小车代码

1.jfif

2、解释运动学模型

2.png

3、使用OpenCV在OriginBot小车上实现巡线功能

3.png
3.1.png

4、在ROS2环境中实现gmapping或者cartographer

4.png

5、总结对话

5.jfif

综上,我们发现ChatGPT有着记忆储存的功能,它区别于SiRi传统的一问一答,能根据聊天的上下文进行互动并归纳总结所有的问题,协助我们完成编程。并且ChatGPT在回复消息时是逐字的显示,很难感觉到是和机器人在对话,仿佛它只是个博学的朋友。

它在针对简单编程问题的处理上可谓是非常惊艳,在ROS相关的问题上,比我们人类更有耐心解答,有时会画出重点并扩展更多的相关知识帮助你去解决问题掌握技术。

既然ChatGPT都能接入WX,那么它和旭日X3派一定也能「chat」一下!不妨我们直接询问ChatGPT,该如何使得旭日X3派和ChatGPT联系起来!它给了我们这样的一个答案:

6.png

模型部署

1、部署基本环境

进入旭日X3派,执行以下命令(此处使用的是OriginBot v1.0.2的镜像):

pip3 install openai

2、学习OpenAI API如何使用

7.png

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、程序运行

8.png

可以看到,此处运行状态与理想情况有较大出入。回到这一段代码:

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()

效果如下:

9.png

本文转自地平线发者社区
原作者:Lxxxb
原链接:https://developer.horizon.ai/...
推荐阅读
关注数
1248
内容数
65
我们的使命是 AI 赋能万物 共创智能未来。我们致力于打造最实用、最好用、最易用的边缘 AI 开发平台。通过地平线自研的高算力 AI 芯片,开发工具,让更多的 AI 开发者,中小企业,学习和加速 AI 产品开发和创新!
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息