自然语言控制机械臂:ChatGPT与机器人技术的融合创新(下)

news2024/9/20 8:04:10

引言

在我们的上一篇文章中,我们探索了如何将ChatGPT集成到myCobot 280机械臂中,实现了一个通过自然语言控制机械臂的系统。我们详细介绍了项目的动机、使用的关键技术如ChatGPT和Google的Speech-to-text服务,以及我们是如何通过pymycobot模块来控制机械臂的。通过将自然语言处理和机械臂控制相结合,我们的项目旨在降低机器人编程的门槛,使得非专业人士也能轻松地进行机器人编程和实验。

接下来,在这篇文章中,我们将讨论在开发这一系统过程中遇到的挑战,我们是如何克服这些挑战的,以及项目未来的扩展可能性。我们的目标是深入了解技术实施的具体问题,并探索该系统未来发展的新方向。

开发当中遇到的困难

在开发集成了ChatGPT的mycobot 280机械臂控制系统的过程中,我面临了几个主要的技术挑战。

1.语音识别的准确性和响应时间

首先,我遇到的挑战是语音识别的准确性和反应时间。尽管使用了Google的Speech-to-text,但在实际应用中,我发现它有时难以准确识别专业术语或在嘈杂环境中捕捉语音指令。可能是因为不太理解底层逻辑运行的一个原理是什么,也不知道如何来正确的使用。此外,从语音输入到文本输出的过程延迟较长,如何来判断这句话是不是说完了,通常响应的时间较久。

在我说完之后,大概会有3s左右的响应时间。

  1. OpenAI API的实用性和地域限制

ChatGPT的API 是整个项目的核心功能点,没有了他就不能实现AI的机械臂控制系统了。在一开始测试代码的时候我用的是WEB版本的ChatGPT,一开始没有考虑到使用API是一个比较大的问题。

 因为地区的问题,没有办法直接通过API进行访问OpenAI,会出现网络延迟,不能够使用代理等软件来实现访问。除此之外还得确保网络的稳定性才能够快快速的进行处理。

  1. 自然语言转指令的处理

如果解决了上边的生成代码的问题,我们将会得到类似于命令行的字符串,需要将它转变成可以编译的代码。一开始只考虑到了单行的命令行

"robot.move_to_zero()"

要将字符串转化成执行的代码可以用到python的getattr(),他是一个内置函数,用于获取对象的属性值。

getattr(object, name[, default])
object:表示要获取属性的对象。
name:表示要获取的属性的名称。
default:可选参数,表示如果指定的属性不存在时返回的默认值。

getattr() 函数会尝试获取指定对象的指定属性的值。如果对象具有该属性,则返回属性的值;如果对象没有指定的属性,但提供了默认值,则返回默认值;如果对象没有指定的属性,并且没有提供默认值,则会引发 AttributeError 异常。

举个例子直接调用类的方法

class Myclass:
    def print_1(self):
        print("halo word")
    
obj = mycalss()
getattr(obj,"print_1")()

"""
halo word

用这个方法就可以完美解决如何将字符串的形式输出可执行的代码了!

接下来是将字符串转化为可执行代码的过程:

我们收到的字符串是代码的形式例如

"robot.move_to_zero()"

我们要将这一部分进行拆分,分为obj和方法两部分,就要用到python当中的分割的方法。

# 以.为节点分为前后两个部分
command_str = "robot.move_to_zero()"
parts = command_str.split(".")

parts[0] = "robot"
part[1] = "move_to_zero()"
# 去掉括号保留,方法名
method_name = part[1].split("()")[0]

method = getatter(robot,method_name)
method()

#处理转化方法
def execute_command(instance,command_str):
    try:
        #分割对象名和方法
        parts = command_str.split(".")
        if len(parts) != 2 or parts[0] != 'robot':
            print("Invalid command format.")
            return

        method_name = parts[1].split("()")[0] #移除括号

        #使用getattr 安全的获取方法引用
        if hasattr(instance, method_name):
            method = getattr(instance, method_name)
            method()

        else:
            print(f"the method {method_name} does not exist!")

    except Exception as e:
        print(f"An error occurred: {e}")

这样就完成了,能够处理单行的字符串,但是在测试的时候使用产生多行的命令的时候,这个代码就不行了,它会变成一长串,所以这个方法是无效的。

上述三个是我主要遇到的问题,接下来我将一一的进行解答。

解决方案和应对策略

  1. 优化语音识别

根据我上述描写的识别延迟的问题,我是通过设置时间来优化我的程序。

# 设置timeout为3秒,phrase_time_limit为10秒
audio = recognizer.listen(source, timeout=3, phrase_time_limit=10)

默认设置没有听到声音,一直的进行监听,我设置了时间上的限制10s,也能够保证我在说完话之后较快的一个响应。

接下来完成的功能代码


import speech_recognition as sr

def speech_to_text():
    # 初始化识别器
    recognizer = sr.Recognizer()

    with sr.Microphone() as source:
        print("start speaking...")

        # 监听源,设置timeout和phrase_time_limit
        # timeout:在这段时间内没有检测到声音,则停止监听
        # phrase_time_limit:监听的最大时长
        try:
            audio = recognizer.listen(source, timeout=3, phrase_time_limit=10)
        except sr.WaitTimeoutError:
            print("No speech was detected within the timeout period.")
            return None

        try:
            # 使用Google的语音识别服务
            text = recognizer.recognize_google(audio, language='en-US')
            print("You said: " + text)
            return text
        except sr.UnknownValueError:
            print("Google Speech Recognition could not understand audio")
            return None
        except sr.RequestError as e:
            print(f"Could not request results from Google Speech Recognition service; {e}")
            return None

这目前已经可以满足大部分的需求了,实际的使用情况下来来看,整个的功能还是比较完整的,能够有效的识别出语音内容,特别是让我说数字的时候他主动转化成阿拉伯数字,在进行交互的过程中省了处理数字的问题。

  1. 自然语言转化优化

如何来解决多行的指令问题呢。

当我们收到,多行的指令就不能跟之前单纯的分离来进行处理了得考虑其他的方式,以下的情况默认ChatGPT生成的指令是下面这种换行行的字符串,没有带注释的(ChatGPT很喜欢写注释)。

"robot.move_to_zero()
robot.grab_position() 
 robot.plus_z_coords(20)"

只要把多个当成一个来看就好了!

# 分割成多行
commands = command_str.strip().split('\n')

#万一里面存在一些空白符,得先进行处理
for cmd in commands:
    cmd = cmd.strip()
    if not cmd:
        continue

# 我们默认obj 是robot,就只需要获取方法名字就可以了
            if cmd.startswith("robot."):
                cmd = cmd[6:]

            # 分割方法名,和参数
            if '(' in cmd and cmd.endswith(")"):
                method_name, args_str = cmd.split('(', 1)
                method_name = method_name.strip() #删除前后空格
                args_str = args_str.rstrip(")") #删除右侧的)
                # 移除可能的空白字符,并按逗号分隔参数
                args = [arg.strip() for arg in args_str.split(',')] if args_str else []

it works!

  1. ChatGPT API的问题

关于这个问题,我目前并没能很好的进行解决,大家如果有好的方法可以,私信我跟我沟通,因为地区的问题,并不能够直接的用API获取响应。

项目的扩展功能和未来展望

视觉功能

在本次记录当中,缺少了最重要的一个模块,视觉模块,单独有一个机械臂没有眼睛的话跟瞎子又有什么区别呢。 对于这一部分的开发,会需要花费较大的经历,如果以后有完成一定程度上的开发,我也会及时出来跟大家进行分享。

之前也有看到日本的Shirokuma 开发个类似的项目,用到了ChatGPT4-vision的功能,做了说出目标进行抓取的一个功能。

https://twitter.com/neka_nat/status/1733517151947108717

这个项目也是相当的有意思,给了我不少开发这个项目的想法。

更加智能的“贾维斯”

相信大家的肯定都有看过钢铁侠,随着AI的不断发展,我觉得在不久的将来,肯定会出现一款如同电影当中的机械臂,能够通过交流的方式来帮助你完成一些工作。

近几年也能说是人工智能的突发猛进的几年,AIGC是近期最火热的内容,只要接收到内容就可以生成对应的文本,图像,视频和音频等等。

总结

很期待未来,AI和机器人相结合能够融合到怎样的一个程度,是不是已经能够帮助人类做一定的事情了!如果你有一些好的想法,或者对我的项目修改的意见欢迎随时跟我提出!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1597530.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++面向对象程序设计 - 类和对象进一步讨论

在C中,关于面向对象程序设计已经讲了很大篇幅,也例举很多案例,此篇将通过一些习题来进一步了解对象、静态成员、指针、引用、友元、类模板等等相关知识。 一、习题一(构造函数默认参数) 示例代码: #includ…

主流App UI设计,7个在线平台供您选择!

在数字时代,用户界面(UI)设计变得非常重要,因为良好的UI设计可以改善用户体验,增强产品吸引力。随着技术的发展,越来越多的应用程序 ui在线设计网站的出现为设计师和团队提供了一种全新的创作方式。本文将盘…

关于Wordpress的操作问题1:如何点击菜单跳转新窗口

1.如果打开,外观-菜单-菜单结构内,没有打开新窗口属性,如图: 2.在页面的最上部,点开【显示选项】,没有这一步,不会出现新跳转窗口属性 3.回到菜单结构部分,就出现了

Mysql嵌套查询太简单了

1、子查询的分类 不相关查询: 子查询能独立执行 相关查询: 子查询不能独立运行 相关查询的执行顺序: 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询, 若WHERE子句返回值为真,则取此元组放入结果…

CSS基础:margin属性4种值类型,4个写法规则详解

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端工具”,可获取 Web 开发工具合集 268篇…

PaddleOCR训练自己模型(1)----数据准备

一、下载地址: PaddleOCR开源代码(下载的是2.6RC版本的,可以根据自己需求下载) 具体环境安装就不详细介绍了, 挺简单的,也挺多教程的。 二、数据集准备及制作 (1)下载完代码及配置…

Navicat for MySQL 使用基础与 SQL 语言的DDL

一、目的: Navicat for MySQL 是一套专为 MySQL 设计的高性能数据库管理及开发 工具。它可以用于任何版本 3.21 或以上的 MySQL 数据库服务器,并支持大 部份 MySQL 最新版本的功能,包括触发器、存储过程、函数、事件、视图、 管理用户等。…

软件工程及开发模型

根据希赛相关视频课程汇总整理而成,个人笔记,仅供参考。 软件工程的基本要素包括方法、工具和(过程) 方法:完成软件开发的各项任务的技术方法; 工具:运用方法而提供的软件工程支撑环境&#xff…

数据结构 -- 二分查找

本文主要梳理了二分查找算法的几种实现思路,基本概念参考 顺序、二分、哈希查找的区别及联系_生成一个大小为10万的有序数组,随机查找一个元素,分别采用顺序查找和二分查找方式-CSDN博客 1、基本概念 (1)前提条件:待查找数据必须…

Leetcode二叉树刷题

给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true public boolean isSymmetric(TreeNode root) {if(rootnull)return true;return compare(root.left,root.right);}public boole…

【Unity】游戏场景添加后处理特效PostProcessing

添加后处理特效PostProcessing 添加雾效果后处理何为后处理?添加后处理特效 添加雾效果 依次点击Window -> Rendering -> Lighting添加Lighting面板。 点击Lighting里面的Environment,找到Other Setting 将Fog选项勾选 更改下方的颜色 调整雾的浓…

自然语言处理: 第二十七章LLM训练超参数

前言: LLM微调的超参大致有如下内容,在本文中,我们针对这些参数进行解释 training_arguments TrainingArguments(output_dir"./results",per_device_train_batch_size4,per_device_eval_batch_size4,gradient_accumulation_steps2,optim"adamw_8bi…

JavaSE图书管理系统

JavaSE图书管理系统 思路一.Main方法二.User包1.User类2.NormaUser类3.AdminUser类三.book包1.BookList类2.Book类四.operation包1.IOPeration接口2.AddOperation类新增图书3.BorrowOperation类借阅图书4.DelOperation类删除图书5.FindOperation类查找图书6.ReturnOperation类归…

Unity解决:导出安卓apk 安装时报错:应用未安装:软件包似乎无效

Unity2018.4.36 导出安卓apk 安装时报错:应用未安装:软件包似乎无效 解决办法:因为安装到安卓12 需要添加添加过滤规则 在AS工程AndroidManifest.xml 添加过滤规则即可。 android:exported"true"

初识ansible服务剧本playbook及剧本编写实例

目录 1、playbook剧本文件概念 1.1 剧本文件的结构由4部分组成 2、配置实例 实例1-编写一个实现批量安装mariadb数据库的剧本 实例2-编写一个创建一个目录/backup,并在目录喜爱创建01.txt文件的剧本 实例3-编写一个添加定时同步时间的定时任务剧本 错误反思 1、playbook剧…

MDK-ARM Keil5.38 下载安装环境搭建

一、keil软件介绍 KEIL是公司的名称,有时候也指KEIL公司的所有软件开发工具,目前2005年Keil由ARM公司收购,成为ARM的公司之一。 MDK(Microcontroller Development Kit) 也称MDK-ARM、KEIL MDK、RealView MDK、KEIL For…

不需要GPU就可以玩转模型,同时支持本地化部署

简单一款不需要GPU就可以在Win 机器跑的模型:Ollama;用于本地运行和部署大型语言模型(LLMs)的开源工具 关于Ollama的简要介绍 平台兼容性:Ollama支持多种操作系统,包括macOS、Linux和Windows,…

linux系统USB/IP远程共享USB设备 —— 筑梦之路

概述 USB/IP 是一个开源项目,已合入 Kernel,在 Linux 环境下可以通过使用 USB/IP 远程共享 USB 设备。 USB Client:使用USB的终端,将server共享的usb设备挂载到本地。 USB Server:分享本地的usb设备至远程。 架构原理…

蓝桥杯2024年第十五届省赛真题-R 格式(高精度乘法 + 加法)

本题链接:蓝桥杯2024年第十五届省赛真题-R 格式 - C语言网 题目:​​​​​​​ 样例: 输入 2 3.14 输出 13 思路: 根据题意,结合数据范围,这是一道模板的高精度乘以低精度问题。 题意是double 类型 d 与…

vue3从精通到入门4:diff算法的实现

Vue 3 的 diff 算法相较于 Vue 2 有了一些改进和优化,主要是为了应对更复杂的组件结构和更高的性能需求。 以下是 Vue 3 diff 算法在处理列表更新时的大致步骤: 头头比较:首先,比较新旧列表的头节点(即第一个节点&…