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

  1. 引言:

自OpenAI发布ChatGPT以来,世界正迅速朝着更广泛地将AI技术融合到机器人设备中的趋势发展。机械手臂,作为自动化与智能化技术的重要组成部分,在制造业、医疗、服务业等领域的应用日益广泛。随着AI技术的进步,机械手臂不仅能执行复杂的操作任务,还能通过自然语言处理技术进行更加直观的交互,极大提高了灵活性和用户友好性。

就比如说微软的一个人工智能研究中心,研究如何用自然语言来控制机器人设备的一个研究,

所以我想做一个类似的项目,通过允许用户使用自然语言来控制机械手臂,它可以大大降低机器人编程的门槛,使得非专业人士也能轻松地操作和实验。

论文link:

https://www.microsoft.com/en-us/research/uploads/prod/2023/02/ChatGPT___Robotics.pdf

该项目一共分为上下两篇,本篇文章主要内容是整个人工智能系统的设计和构建的过程,未来的下一篇文章将要介绍在开发项目的过程中遇到的而困难,如何解决,以及该项目有什么扩展的性的功能。

  1. 项目背景与动机:

 想象如果有有一天,你命令一个机械臂“帮我收拾一下桌面,将垃圾丢到垃圾桶里”,机械臂就开始听从命令,清理你的桌面的垃圾,那该是多么幸福的一件事情呀。

所以准备工作,我们需要一台小型的机械臂(主要是大的机械臂太贵了),一台能够上网的电脑,以及一颗炙热的心!该项目主要是借鉴微软的那篇改变机器人使用的研究来入手。

  1. 技术概览:

前提本项目是基于python的环境下进行编译的。

首先我们先来介绍一下本项目会使用到的一些软件层面上技术:

ChatGPT:(整个项目最关键的核心技术)

ChatGPT

ChatGPT是一项人工智能技术,基于GPT(Generative Pre-trained Transformer)模型的架构,GPT是一种基于深度学习的自然语言处理模型,通过大规模的无监督预训练和有监督微调来实现语言理解和生成任务。

换句话来说,你可以简单人理解为你在跟一个知识十分渊博的人进行聊天,你可以对它预设一些角色,例如“”你是一个医生”,你就可以跟他聊医学相关的知识,但是请注意并不是所生成的所有聊天都是正确的需要进行自我判断。

Speech recognition:(搭配处理自然语言必不可少的功能模块)

我们这边使用的是Google的一种语音识别服务,Speech-to-text,它允许开发者将语音转化成文本的形式。并且它也支持多种语言和方言,包括但不限于英语,西班牙语,法语,德语,中文等等,可以满足全球用户的需求。

你可以进行在线的尝试语音转文本:https://cloud.google.com/speech-to-text?hl=en#features

pymycobot:(mycobot 280机械臂的控制功能模块)

GitHub - elephantrobotics/pymycobot: This is a python API for ElephantRobotics product.

pymycobot 是大象机器人专门为了my系列产品的机械臂开发的控制模块,这个功能模块的开发,大大降低了机械臂编程控制的门槛。pymycobot 提供了大量的机械臂的控制接口,例如关节控制,坐标控制,配套的机械臂的夹爪控制等等,对机械臂变成的初学者是相当有好的。

 解释这些技术如何合作实现自然语言控制机械手臂的功能。

接下来介绍一下硬件设备:

mycobot 280 M5Stack

mycobot 280 M5Stack 是Elephant Robotics 和M5Stack 合作的一款6自由度的协作性机器人。它外观结构设计小巧精致,一体式全包裹机身设计,采用高精度伺服电机,无任何外漏线缆。mycobot重量只有850g,机械臂末端最大的负载能够达到250g,最大工作半径达到280mm,重复定位精度能够到0.5mm的误差范围内。 

  1. 设计思路与实现过程:

https://www.youtube.com/watch?v=Sq1QZB5baNw&pp=ygUVY2hhdGdwdCBjb250cm9sIHJvYm90

大家可以看一下近期OpenAI发布的一条视频,人跟机器人聊天,机器人来处理自然语言并且生成相对应的动作执行。

也有一些其他的额机械臂也集成了类似的场景。

https://www.youtube.com/watch?v=IGsYgSdrT4Y

我要做的项目就是类似于这个小型版!通过自然语言跟机械臂进行沟通,然后,机械臂执行相对应的指令。

接下来我将要说明项目的过程。

语音识别转文本功能speech-to-text:

为什么要用语音识别转文本功能呢?用过chatgpt的人知道chatgpt有内置的语音聊天的功能,但是我们要集成到PC端和机械臂当中去使用,就不能够使用ChatGPT的web版本,而是要在本地的计算机当中实现,就要用到ChatGPT的API接口。

ChatGPT API的形式的话只能够接收“文本”的形式来使用,所以speech-to-text可以讲我们讲话转化成文本的形式输入到电脑当中。

def speech_to_text():
    recognizer = sr.Recognizer()

    with sr.Microphone() as source:
        print("start speaking...")
        audio = recognizer.listen(source)

        try:
            # text = recognizer.recognize_google(audio, language='zh-CN')
            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("Could not request results from Google Speech Recognition service; {0}".format(e))
            return None

调用ChatGPT API &预训练

获取了语音的文本形式,就可以调用API在本地跟ChatGPT进行聊天了。以下是OpenAI 提供调用ChatGPT API的使用方法。

def generate_control_code(prompt):
    openai.api_key = ''
    prompt = f"{pre_training}The command the user wants to execute is:'{prompt}'."

    try:
        response = openai.Completion.create(
            engine="gpt-3.5-turbo",
            prompt=prompt,
            temperature=0.5,
            max_tokens=100,
            top_p=1.0,
            frequency_penalty=0.0,
            presence_penalty=0.0
        )
        code = response.choices[0].text.strip()
        return code
    except Exception as e:
        print(f"error: {e}")
        return ""

代码当中的API_KEY需要自己去官方申请(需要付费)。

可以关注一下prompt这一句话,这将是要提及到的预训练。

  prompt = f"{pre_training}The command the user wants to execute is:'{prompt}'."

如果想要获取精准的回复,需要提前给ChatGPT知道它需要干什么,要让他干什么,按照我们的想法来输出。我们先用web版本来进行测试,因为API的搭建比较复杂。

以下是我的prompt(针对于这个项目),我只想要它输出机械臂执行的代码给我所以我是这么做的。

Generate Python code that matches the following requirements: 
Use an instance of the MyCobotController class robot to perform a specific action. The instance already contains methods such as move_to_zero() to return to the initial position, grab_position() to move to the grab position, and plus_x_coords(value), plus_y_coords(value), plus_z_coords(value) to move specific distances on the X, Y, and Z axes. 
You don’t need to output other textual content, just output the code directly, for example, the robot arm returns to the origin. robot.move_to_zero()

Here is what I said:
I want the robot arm to return to the origin, and then go to the position to be grabbed to perform grabbing.

这里可以看到能够成功的完成我的基本需求,但是他输出了代码的注释,这会影响我们之后的结果,所以还是需要进行修改。(让他只输出代码,不要输出注释。)

构建新的机械臂API

为什么要构建新的API呢,pymycobot不是已经提供了吗?

当然,pymycobot 提供的API很全面,也很多。我们如果给的语音比较复杂,ChatGPT会生成其他的复杂的代码可能会导致出错。我根据我想要目前测试的一些需求构建了一个新的机械臂的API。

class MyCobotController:
    def __init__(self, port, baud):
         self.mc = MyCobot(port, baud)
         self.speed = 80
         self.mode =0
         self.coords = []

    def grab_position(self):
        # self.mc.send_angles([4.83, 13.97, (-99.31), (-1.75), 4.39, (-0.26)], 80)
        self.mc.send_coords([149.2, (-48.3), 201.7, (-176.98), 4.55, (-84.66)], 80, 0)
        time.sleep(2)

    def move_to_zero(self):
        self.mc.send_angles([0,0,0,0,0,0],70)
        time.sleep(2)

    def gripper_open(self):
        self.mc.set_gripper_state(0,80,1)
        time.sleep(2)

目的是为了快速的将整个项目搭建起来,之后还可以在丰富其中的内容。

这么做是有原因的,比如说,要让机械臂去到一个点位进行抓取,用pymycobot的方法可能是下面这样的:

robot.send_angles([0,0,0,0,0,0],80)
time.sleep(2)
#open gripper
robot.set_grippr_value(1,80,1)
time.sleep(1)
#clos grippr
robot.set_grippr_value(0,80,1)
time.sleep(1)

这样的话就要输出很多行的代码,在其他复杂的情况下可能会导致出错,重新构建一个方法的话咱就只需要调用一个方法就可以执行了,两行代码就能解决。

class Newmycobot():
    def grab_action(self):
        self.send_angles([0,0,0,0,0,0],80)
        time.sleep(2)
        #open gripper
        self.set_grippr_value(1,80,1)
        time.sleep(1)
        #clos grippr
        self.set_grippr_value(0,80,1)
        time.sleep(1)
    
robot = Newmycobot()
robot.grab_action()
  1. 初步成果与展示:

我们先来个快速的调试,用web版本的ChatGPT来实践一下。

复制生成的代码去运行。

可以看到简单的测试是OK的。

6. 结论:

本次的记录就到这里,整个项目还未完成,在未来不久的日子里我将会继续完善这个项目,下一篇的内容我会完善整个项目,以及分享一下在开发的过程出现的一些问题是如何进行解决的。如果你喜欢这篇文章的话,欢迎在下方留言给出你的想法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源大数据集群部署(二十)Trino部署

作者:櫰木 1 解压trino的包到opt目录 cd /root/bigdata tar -xzvf trino-server-389.tar.gz -C /opt/ ln -s /opt/trino-server-389 /opt/trino2 创建trino用户,并配置专属jdk11 useradd trino su – trino chown -R trino:hadoop /opt/trino-server-…

async+await——用法——基础积累

对于asyncawait,我一直都不太会用。。。。 今天记录一下asyncawait的实际用法: 下面是一个实际的使用场景: 上面的代码如下: async fnConfirmCR(){let type this.crType;let crId this.crId;if(typeof crId object){let ne…

一起学习python——基础篇(13)

前言,python编程语言对于我个人来说学习的目的是为了测试。我主要做的是移动端的开发工作,常见的测试主要分为两块,一块为移动端独立的页面功能,另外一块就是和其他人对接工作。 对接内容主要有硬件通信协议、软件接口文档。而涉…

andorid 矢量图fillColor设置无效

问题:andorid 矢量图fillColor设置无效 解决:去掉如下 android:tint一行

股票手续费怎么降下来?这些技巧帮你省钱!

在股票交易中,手续费是每个投资者都必须面对的成本。降低手续费可以有效地增加投资回报。以下是一些降低股票手续费的方法: 1. 选择低佣金的券商:不同的证券公司提供的佣金费率不同,选择佣金较低的券商可以直接减少交易成本 2. 增…

antd+vue——datepicker日期控件——禁用日期功能

需求&#xff1a;今天之前的日期禁用 <a-date-pickerv-model.trim"formNE.deliveryTime":disabled-date"disabledDate"valueFormat"YYYY-MM-DD"allowClearstyle"width: 100%" />禁用日期的范围&#xff1a; //时间范围 disab…

【C语言】C语言题库【附源码+持续更新】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 目录 1、练习2-1 Programming in C is fun! 2、练习2-3 输出倒三角图案 3、练习2-4 温度转换 4、练习2-6 计算物体自由下落的距离 5、练习2-8 计算摄氏温度 6、练习2-9 整数四则运算 7、练习2-10 计算分段函数[1…

3D目标检测跟踪 | 基于kitti+waymo数据集的自动驾驶场景的3D目标检测+跟踪渲染可视化

项目应用场景 面向自动驾驶场景的 3D 目标检测目标跟踪&#xff0c;基于kittiwaymo数据集的自动驾驶场景的3D目标检测跟踪渲染可视化查看。 项目效果 项目细节 > 具体参见项目 README.md (1) Kitti detection 数据集结构 # For Kitti Detection Dataset └── k…

力扣347. 前 K 个高频元素

思路&#xff1a;记录元素出现的次数用map&#xff1b; 要维护前k个元素&#xff0c;不至于把所有元素都排序再取前k个&#xff0c;而是新建一个堆&#xff0c;用小根堆存放前k个最大的数。 为什么是小根堆&#xff1f;因为堆每次出数据时只出堆顶&#xff0c;每次把当前最小的…

Excel 函数与公式应用大全

Excel 函数与公式应用大全 常用Excel函数实际应用示例本期图书推荐Excel 函数与公式应用大全内容简介获取方式 AI爆款文案&#xff1a;巧用AI大模型让文案变现插上翅膀 文案变现一本通内容简介获取方式 Excel 是一款功能强大的电子表格软件&#xff0c;广泛应用于商业、财务、教…

代码随想录算法训练营三刷day51 | 动态规划 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

三刷day51 309.最佳买卖股票时机含冷冻期1.确定dp数组以及下标的含义2. 确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 714.买卖股票的最佳时机含手续费 309.最佳买卖股票时机含冷冻期 题目链接 解题思路&#xff1a; 相对于动态规划&#xff1a;122.买卖股票…

【JavaEE初阶系列】——文件操作 IO 之 文件系统操作

目录 &#x1f4dd;认识文件 &#x1f6a9;树型结构组织 和 目录 &#x1f388;绝对路径和相对路径 &#x1f6a9;文件类型 &#x1f4dd;文件系统操作 &#x1f388;File 概述 &#x1f388;File类的使用 1. 绝对路径 vs 相对路径 2. 路径分隔符 3. 静态成员变量 4…

SCT2A23STER 电源降压转换芯片 1.2A 4.5V-100V

SCT2A23是一种1.2A降压型直流变换器&#xff0c;输入电压范围从4.5V至100V&#xff0c;集成了530mΩ高压侧MOSFET和220mΩ低压侧MOSFET。SCT2A23选用恒导通时刻&#xff08;COT&#xff09;形式控制&#xff0c;支撑PFM形式&#xff0c;具有典型的160uA低静态电流&#xff0c;有…

【C++题解】1329. 求梯形的面积

问题&#xff1a;1329. 求梯形的面积 类型&#xff1a;基本运算、小数运算 题目描述&#xff1a; 梯形面积的求解公式为S(ab)h/2 。从键盘读入一个梯形的上底 a、下底 b 和高 h &#xff0c;请计算表梯形的面积。&#xff08;结果保留1位小数&#xff09;。&#xff08;5.1.1…

Linux内核中常用的C语言技巧

Linux内核采用的是GCC编译器&#xff0c;GCC编译器除了支持ANSI C&#xff0c;还支持GNU C。在Linux内核中&#xff0c;许多地方都使用了GNU C语言的扩展特性&#xff0c;如typeof、__attribute__、__aligned、__builtin_等&#xff0c;这些都是GNU C语言的特性。 typeof 下面…

C++ vector内存分配及正确释放

C vector内存分配及正确释放_vector 释放-CSDN博客 内存分配 #include <iostream> #include <vector> using namespace std;int main(){ vector<int> vec(10); cout << "vec.size: "<< vec.size() <<endl; cout << &quo…

SpringCloudAlibaba-概述(一)

目录地址&#xff1a; SpringCloudAlibaba整合-CSDN博客 记录SpringCloudAlibaba的整合过程 一、简单概述一下项目情况 项目主要有4个模块和4个微服务&#xff1b; 项目结构如下&#xff1a; mall&#xff1a;父工程 -- common&#xff1a;公共组件&#xff0c;存放公用的实…

git常用命令合集,程序员必备技能,5分钟学会

仓库相关操作 1.git remote -v 查看当前仓库地址 2.git remote add origin 仓库地址&#xff1a;给当前git项目添加远程仓库绑定 3.git branch -M main : 重命名当前分支为main 4.git push -u origin main&#xff1a;将当前(main)分支上的内容上传到刚刚添加的origin远程库…

matlab使用教程(40)—二维傅里叶变换和多项式插值

1使用 FFT 进行多项式插值 使用快速傅里叶变换 (FFT) 来估算用于对一组数据进行插值的三角函数多项式的系数。 1.1数学中的 FFT FFT 算法通常与信号处理应用相关&#xff0c;但也可以在数学领域更广泛地用作快速计算工具。例如&#xff0c;通常通过解算简单的线性系统来计算…

JS加密:对比JScrambler和JShaman加密效果

本文&#xff0c;以一个实例&#xff0c;比对JS加密两大神器&#xff1a;JScrambler、JShaman的加密结果&#xff0c;看看谁的加密效果更好。 注&#xff1a;本文不是技术文章&#xff0c;仅仅从加密结果的“型”上简单观查&#xff0c;不做技术分析&#xff0c;仅看哪个加密代…