自然语言控制机械臂: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 textexcept sr.UnknownValueError:print("Google Speech Recognition could not understand audio")return Noneexcept 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 codeexcept 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 = 80self.mode =0self.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 gripperself.set_grippr_value(1,80,1)time.sleep(1)#clos gripprself.set_grippr_value(0,80,1)time.sleep(1)robot = Newmycobot()
robot.grab_action()
  1. 初步成果与展示:

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

复制生成的代码去运行。

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

6. 结论:

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Quartz + SpringBoot 实现分布式定时任务

文章目录 前言一、分布式定时任务解决方案二、Quartz是什么?1.quartz简介2.quartz的优缺点 二、Quartz分布式部署总结 前言 因为应用升级,由之前的单节点微服务应用升级为集群微服务应用,所以之前的定时任务Spring Scheduled不再适用了&…

vue3第十八节(diff算法)

引言: 上一节说了key的用途,而这个key属性,在vue的vnode 中至关重要,直接影响了虚拟DOM的更新机制; 什么场景中会用到diff算法 如:修改响应式属性需要重新渲染页面,会重新执行render渲染函数返…

【OpenVINO™】使用 OpenVINO™ C# API 部署 YOLOv9 目标检测和实例分割模型(上篇)

YOLOv9模型是YOLO系列实时目标检测算法中的最新版本,代表着该系列在准确性、速度和效率方面的又一次重大飞跃。它通过引入先进的深度学习技术和创新的架构设计,如通用ELAN(GELAN)和可编程梯度信息(PGI)&…

Qt创建基于应用程序的插件

应用程序插件 什么是插件插件的好处插件的种类应用程序插件创建应用程序的插件步骤:创建测试插件的应用程序步骤:应用程序插件示例开发环境创建示例生成插件运行结果总结什么是插件 插件是一种用于应用程序功能扩展和增强,且按照特定规范编写的应用程序接口的程序。 插件的…

Socks5代理IP使用教程及常见使用问题

当我们在互联网上浏览网页、下载文件或者进行在线活动时,隐私和安全问题常常被提及。在这样的环境下,一个有效的解决方案是使用Sock5IP。本教程将向您介绍Sock5IP的使用方法,帮助您保护个人隐私并提升网络安全。 一、什么是Sock5IP&#xff1…

开源模型应用落地-chatglm3-6b-function call-入门篇(六)

一、前言 每个模型都有自己的限制,有些情况下它们无法满足复杂的业务需求。但是,可以通过一个外置函数的方式,例如:"Function Call",让开发者能够更加灵活地利用大型语言模型,帮助开发者在特定场…

7.接口自动化测试-Allure报告

1.环境搭建 (1)下载并解压allure.zip,不要用中文路径,将bin目录配置到path环境变量 官网:Allure下载 (2)cmd安装allure-pytest第三方库 pip install allure-pytest 检测是否安装成功 pip show …

从大量数据到大数据,King’s SDMS仪器数据采集及科学数据管理系统的应用

对于实验室或检测机构,仪器设备是所有业务开展的基础,数据则是核心命脉,而传统的仪器设备原始数据收集方式,效率低耗时长、操作流程不规范、不易保存与查找、错误率高、易篡改等成了制约检测机构持续高速发展的瓶颈和弊端&#xf…

Erlang中常用数据结构原理及其实现

文章目录 一、Erlang 简介二、数据结构2.1、元组(Tuple)2.1.1、示例:2.1.2、实现: 2.2、列表(List)2.2.1、示例2.2.2、实现2.2.3、原理 3. 字典(Dictionary)3.1、创建字典3.2、添加和…

ELK 日志分析系统(一)

一、概念 二、详解 2.1 Elasticsearch 核心概念 2.1.1 接近实时(NRT) 2.1.2 cluster集群 2.1.3 Node节点 2.1.4 index索引 2.1.5 类型(type) 2.1.6 文档(document) 2.1.7 分片和副本(shards & replicas) 2.2 Logstash主要组件 …

UE_导入内容_Maya静态网格体导出为FBX的常规设置

注意事项:单位设置统一为cm;轴朝向,Maya默认y轴朝上,UE4 z轴向上;变换枢轴,UE4会将导入模型前世界中心作为枢轴中心,要旋转就需要注意了;法线,UE4内材质默认单面显示&…

记录一个Kafka客户端Offset Explore连不上的问题

我昨天把集群重装了一下,再连这个工具就连不上了(你先把zk和kafka在集群启起来),报错截图如下: 英文翻译过来大概就是说遍历zk指定路径不存在,我还以为zk的问题,回去又把zk的文档翻了一遍&#…