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


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

    ROS版本Noetic】
    本喵将带来系列教程—基于Chatgpt和ROS的自主无人机~
    大概国内全网唯一教程~
    小无人机镇楼~
    在这里插入图片描述

    目录

    引言 🎉

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

    ROS简介 🛠️

    ROS的基本组件 🧩

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

    为何选用ROS ❓

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

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

    一行指令解决全部问题~
    在这里插入图片描述
    选择[4]即可

    ChatGPT概述 💡

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

    集成ChatGPT到ROS的步骤 🚀

    环境设置与安装 ⚙️

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

    pip install openai
    
    • 1

    在终端运行

    python -c "import openai"
    
    • 1

    没有报错即可

    创建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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    运行结果~

    在这里插入图片描述

    在国内,有时候无法正常访问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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    数据交换与通信 🔄

    数据交换对于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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里,我们创建了一个名为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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    不要忘记给予执行权限:

    chmod +x src/chatgpt_publisher.py
    
    • 1
    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    同样,给予执行权限:

    chmod +x src/chatgpt_subscriber.py
    
    • 1

    4. 运行节点

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

    roscore
    
    • 1

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

    rosrun chatgpt_ros chatgpt_publisher.py
    
    • 1

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

    rosrun chatgpt_ros chatgpt_subscriber.py
    
    • 1

    运行结果,发布者~
    在这里插入图片描述
    运行结果,接收者~
    在这里插入图片描述

    编码实践 🧑‍💻

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    不要忘记给予执行权限:

    chmod +x src/chatgpt_communication.py
    
    • 1

    启动roscore,终端输入

    roscore
    
    • 1

    新建终端,输入

    rosrun chatgpt_ros chatgpt_ros_node.py
    
    • 1

    话题列表
    在这里插入图片描述
    测试话题,发送数据

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

    接收数据
    在这里插入图片描述
    本喵会随时更新的~请多关注哦

  • 相关阅读:
    Nexus私库搭建 Linux(快捷步骤)
    基于Session实现短信登录
    题目 1213: 幸运儿
    SpringBoot+Vue+ElementUI实现文件上传
    机器学习——聚类算法
    变电站监控视频中运动异常运动物检测和跟踪技术的研究
    js第十一章
    【C++】超详细入门——详解函数返回类型
    【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(四)
    干掉 “重复代码”,这三种方式绝了!
  • 原文地址:https://blog.csdn.net/m0_60999883/article/details/136307286