开源六轴协作机械臂myCobot 280接入GPT4大模型!实现更复杂和智能化的任务

本文已经或者同济子豪兄作者授权对文章进行编辑和转载

引言

随着人工智能和机器人技术的快速发展,机械臂在工业、医疗和服务业等领域的应用越来越广泛。通过结合大模型和多模态AI,机械臂能够实现更加复杂和智能化的任务,提升了人机协作的效率和效果。我们个人平时接触不太到机械臂这类的机器人产品,但是有一种小型的机械臂我们人人都可以拥有它myCobot,价格低廉的一种桌面型机械臂。

案例介绍

本文介绍同济子豪兄开源的一个名为“vlm_arm”项目,这个项目中将mycobot 机械臂与大模型和多模态AI结合,创造了一个具身智能体。该项目展示了如何利用先进的AI技术提高机械臂的自动化和智能化水平。本文的目的是通过详细介绍该案例的方法和成功,展示机械臂具身智能体的实际应用。

产品介绍

myCobot 280 Pi

myCobot 280 Pi是一款6自由度的桌面型机械臂,主要的控制核心是Raspberry Pi 4B,辅助控制核心是ESP32,同时配备了 Ubuntu Mate 20.04 操作系统和丰富的开发环境。这使得 myCobot 280 Pi 在无需外接 PC 的情况下,只需连接显示器、键盘和鼠标即可进行开发。

这款机械臂重量轻,尺寸小,具有多种软硬件交互功能,兼容多种设备接口。它支持多平台的二次开发,适用于人工智能相关学科教育、个人创意开发、商业应用探索等多种应用场景。

Camera Flange 2.0

在案例中使用到的摄像头,通过usb数据线跟raspberry pi链接,可以获取到图像来进行机器视觉的处理。

Suction Pump 2.0

吸泵,工资原理通过电磁阀抽空起造成压强差然后将物体吸起来。通过IO接口链接机械臂,用pymycobot 的API进行控制吸泵的开关。

机械臂的末端都是通过LEGO连接件连接起来的,所以它们之间可以很方便的连接起来不需要额外的结构件。

技术介绍

整个的案例将在python环境中进行编译,下面讲介绍使用到的库。

pymycobot:

elephant robotics编写的对myCobot 控制的python库,可以通过坐标,角度来控制机械臂的运动,也可以控制官方适配的末端执行器例如夹爪,吸泵的运动。

Yi-Large:

Yi-large 是由中国人工智能公司 01.AI 开发的大型语言模型,拥有超过 1000 亿参数。Yi-large 使用了一种叫做“Transformer”的架构,并对其进行了改进,使其在处理语言和视觉任务时表现得更好。

Claude 3 Opus:

该模型还展示了强大的多语言处理能力和改进的视觉分析功能,能够进行图像的转录和分析。此外,Claude 3 Opus 被设计为更具责任感和安全性,减少了偏见和隐私问题,确保其输出更加可信和中立。

AppBuilder-SDK:

AppBuilder-SDK 的功能非常广泛,包含了诸如语音识别、自然语言处理、图像识别等AI能力组件 (Read the Docs) 。具体来说,它包括了短语音识别、通用文字识别、文档解析、表格抽取、地标识别、问答对挖掘等多个组件 (Read the Docs) (GitHub) 。这些功能使开发者可以构建从基础AI功能到复杂应用的各种项目,提升开发效率。

该案例中提到了很多的大语言模型,都是可以自行去测试每个大语言输出的不同的结果如何。

项目结构

介绍项目之前必须得介绍一下项目的构成,制作了一张流程图方便理解。

语音识别-appbuild

首先通过调用本地的电脑进行麦克风的录音制作成音频文件。

#调用麦克风录音。
def record(MIC_INDEX=0, DURATION=5):'''调用麦克风录音,需用arecord -l命令获取麦克风IDDURATION,录音时长'''os.system('sudo arecord -D "plughw:{}" -f dat -c 1 -r 16000 -d {} temp/speech_record.wav'.format(MIC_INDEX, DURATION))

当然这种默认的录音在一些特定的环境中效果是不好的,所以要设定相关的参数保证录音的质量。

    CHUNK = 1024               # 采样宽度RATE = 16000               # 采样率QUIET_DB = 2000            # 分贝阈值,大于则开始录音,否则结束delay_time = 1             # 声音降至分贝阈值后,经过多长时间,自动终止录音FORMAT = pyaudio.paInt16CHANNELS = 1 if sys.platform == 'darwin' else 2 # 采样通道数

根据参数的设定,然后开始录音,之后要对文件进行保存。

  output_path = 'temp/speech_record.wav'wf = wave.open(output_path, 'wb')wf.setnchannels(CHANNELS)wf.setsampwidth(p.get_sample_size(FORMAT))wf.setframerate(RATE)wf.writeframes(b''.join(frames[START_TIME-2:END_TIME]))wf.close()print('保存录音文件', output_path)

有了录音文件,电脑当然没那么智能我们需要用到appbuild-sdk来对音频文件的语音进行识别,这样LLM才能够获取我们说的话然后做出一些对应的操作。

import appbuilderos.environ["APPBUILDER_TOKEN"] = APPBUILDER_TOKEN
asr = appbuilder.ASR() # 语音识别组件
def speech_recognition(audio_path='temp/speech_record.wav'):# 载入wav音频文件with wave.open(audio_path, 'rb') as wav_file:# 获取音频文件的基本信息num_channels = wav_file.getnchannels()sample_width = wav_file.getsampwidth()framerate = wav_file.getframerate()num_frames = wav_file.getnframes()# 获取音频数据frames = wav_file.readframes(num_frames)# 向API发起请求content_data = {"audio_format": "wav", "raw_audio": frames, "rate": 16000}message = appbuilder.Message(content_data)speech_result = asr.run(message).content['result'][0]return speech_result

Prompt-Agent

紧接着,我们要prompt大语言模型,提前告诉它出现某种情况应该如何进行应对。这边对调用LLM的API 就不做过多的介绍了,让我们来看看如何对LLM做预训练。

prompt: (截取部分片段,以下是做中文的翻译)你是我的机械臂助手,机械臂内置了一些函数,请你根据我的指令,以json形式输出要运行的对应函数和你给我的回复【以下是所有内置函数介绍】
机械臂位置归零,所有关节回到原点:back_zero()
放松机械臂,所有关节都可以自由手动拖拽活动:back_zero()
做出摇头动作:head_shake()
做出点头动作:head_nod()
做出跳舞动作:head_dance()
打开吸泵:pump_on()
关闭吸泵:pump_off()【输出json格式】
你直接输出json即可,从{开始,不要输出包含```json的开头或结尾
在'function'键中,输出函数名列表,列表中每个元素都是字符串,代表要运行的函数名称和参数。每个函数既可以单独运行,也可以和其他函数先后运行。列表元素的先后顺序,表示执行函数的先后顺序
在'response'键中,根据我的指令和你编排的动作,以第一人称输出你回复我的话,不要超过20个字,可以幽默和发散,用上歌词、台词、互联网热梗、名场面。比如李云龙的台词、甄嬛传的台词、练习时长两年半。
【以下是一些具体的例子】
我的指令:回到原点。你输出:{'function':['back_zero()'], 'response':'回家吧,回到最初的美好'}
我的指令:先回到原点,然后跳舞。你输出:{'function':['back_zero()', 'head_dance()'], 'response':'我的舞姿,练习时长两年半'}
我的指令:先回到原点,然后移动到180, -90坐标。你输出:{'function':['back_zero()', 'move_to_coords(X=180, Y=-90)'], 'response':'精准不,老子打的就是精锐'}

智能视觉抓取

在这个过程中,只需要myCobot移动到俯视的一个位置,对目标进行拍摄,然后将拍摄后的照片交给视觉模型进行处理,获取到目标的参数就可以返回给机械臂做抓取运动。

调用相机进行拍摄

def check_camera():cap = cv2.VideoCapture(0)while(True):ret, frame = cap.read()# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.imshow('frame', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()

讲图像交给大模型进行处理,之后得到的参数需要进一步的处理,绘制可视化的效果,最终将返回得到归一化坐标转化为实际图像中的像素坐标。

def post_processing_viz(result, img_path, check=False):'''视觉大模型输出结果后处理和可视化check:是否需要人工看屏幕确认可视化成功,按键继续或退出'''# 后处理img_bgr = cv2.imread(img_path)img_h = img_bgr.shape[0]img_w = img_bgr.shape[1]# 缩放因子FACTOR = 999# 起点物体名称START_NAME = result['start']# 终点物体名称END_NAME = result['end']# 起点,左上角像素坐标START_X_MIN = int(result['start_xyxy'][0][0] * img_w / FACTOR)START_Y_MIN = int(result['start_xyxy'][0][1] * img_h / FACTOR)# 起点,右下角像素坐标START_X_MAX = int(result['start_xyxy'][1][0] * img_w / FACTOR)START_Y_MAX = int(result['start_xyxy'][1][1] * img_h / FACTOR)# 起点,中心点像素坐标START_X_CENTER = int((START_X_MIN + START_X_MAX) / 2)START_Y_CENTER = int((START_Y_MIN + START_Y_MAX) / 2)# 终点,左上角像素坐标END_X_MIN = int(result['end_xyxy'][0][0] * img_w / FACTOR)END_Y_MIN = int(result['end_xyxy'][0][1] * img_h / FACTOR)# 终点,右下角像素坐标END_X_MAX = int(result['end_xyxy'][1][0] * img_w / FACTOR)END_Y_MAX = int(result['end_xyxy'][1][1] * img_h / FACTOR)# 终点,中心点像素坐标END_X_CENTER = int((END_X_MIN + END_X_MAX) / 2)END_Y_CENTER = int((END_Y_MIN + END_Y_MAX) / 2)# 可视化# 画起点物体框img_bgr = cv2.rectangle(img_bgr, (START_X_MIN, START_Y_MIN), (START_X_MAX, START_Y_MAX), [0, 0, 255], thickness=3)# 画起点中心点img_bgr = cv2.circle(img_bgr, [START_X_CENTER, START_Y_CENTER], 6, [0, 0, 255], thickness=-1)# 画终点物体框img_bgr = cv2.rectangle(img_bgr, (END_X_MIN, END_Y_MIN), (END_X_MAX, END_Y_MAX), [255, 0, 0], thickness=3)# 画终点中心点img_bgr = cv2.circle(img_bgr, [END_X_CENTER, END_Y_CENTER], 6, [255, 0, 0], thickness=-1)# 写中文物体名称img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) # BGR 转 RGBimg_pil = Image.fromarray(img_rgb) # array 转 pildraw = ImageDraw.Draw(img_pil)# 写起点物体中文名称draw.text((START_X_MIN, START_Y_MIN-32), START_NAME, font=font, fill=(255, 0, 0, 1)) # 文字坐标,中文字符串,字体,rgba颜色# 写终点物体中文名称draw.text((END_X_MIN, END_Y_MIN-32), END_NAME, font=font, fill=(0, 0, 255, 1)) # 文字坐标,中文字符串,字体,rgba颜色img_bgr = cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR) # RGB转BGRreturn START_X_CENTER, START_Y_CENTER, END_X_CENTER, END_Y_CENTER

要用到手眼标定将图像中的像素坐标,转化为机械臂的坐标,以至于机械臂能够去执行抓取。

def eye2hand(X_im=160, Y_im=120):# 整理两个标定点的坐标cali_1_im = [130, 290]                       # 左下角,第一个标定点的像素坐标,要手动填!cali_1_mc = [-21.8, -197.4]                  # 左下角,第一个标定点的机械臂坐标,要手动填!cali_2_im = [640, 0]                         # 右上角,第二个标定点的像素坐标cali_2_mc = [215, -59.1]                    # 右上角,第二个标定点的机械臂坐标,要手动填!X_cali_im = [cali_1_im[0], cali_2_im[0]]     # 像素坐标X_cali_mc = [cali_1_mc[0], cali_2_mc[0]]     # 机械臂坐标Y_cali_im = [cali_2_im[1], cali_1_im[1]]     # 像素坐标,先小后大Y_cali_mc = [cali_2_mc[1], cali_1_mc[1]]     # 机械臂坐标,先大后小# X差值X_mc = int(np.interp(X_im, X_cali_im, X_cali_mc))# Y差值Y_mc = int(np.interp(Y_im, Y_cali_im, Y_cali_mc))return X_mc, Y_mc

最后将全部的技术整合在一起就形成了一个完成的Agent了,就能够实现指哪打哪的功能。

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

总结

vlm_arm项目展示了将多个大模型与机械臂结合的巨大潜力,为人机协作和智能化应用提供了新的思路和方法。这一案例不仅展示了技术的创新性和实用性,也为未来类似项目的开发提供了宝贵的经验和参考。通过对项目的深入分析,我们可以看到多模型并行使用在提升系统智能化水平方面的显著效果,为机器人技术的进一步发展奠定了坚实基础。

离实现钢铁侠中的贾维斯越来越近了,未来电影中的画面终将会成为现实。

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

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

相关文章

盘点当下智能体应用开发的几种形态

现在多智能体系统开发的关注度越来越高了,不光在开发者的圈子热度很高,很多职场人士,甚至是小白也参与其中,因为现在的门槛越来越低了,尤其是,最近特别火的扣子(coze)和百度的appbui…

【TB作品】51单片机 Proteus仿真00016 乒乓球游戏机

课题任务 本课题任务 (联机乒乓球游戏)如下图所示: 同步显示 oo 8个LED ooooo oo ooooo 8个LED 单片机 单片机 按键 主机 从机 按键 设计题目:两机联机乒乓球游戏 图1课题任务示意图 具体说明: 共有两个单片机,每个单片机接8个LED和1 个按键,两个单片机使用串口连接。 (2)单片机…

数据结构学生信息顺序表

主程序 #include "fun.h" int main(int argc, const char *argv[]) { seq_p Screate_seq(); stu data; printf("请问要输入几个学生的数据:"); int n; scanf("%d",&n); while(n--) { prin…

MySQL Binlog详解:提升数据库可靠性的核心技术

文章目录 1. 引言1.1 什么是MySQL Bin Log?1.2 Bin Log的作用和应用场景 2. Bin Log的基本概念2.1 Bin Log的工作原理2.2 Bin Log的三种格式 3. 配置与管理Bin Log3.1 启用Bin Log3.2 配置Bin Log参数3.3 管理Bin Log文件3.4 查看Bin Log内容3.5 使用mysqlbinlog工具…

STM32崩溃问题排查

文章目录 前言1. 问题说明2. STM32(Cortex M4内核)的寄存器3. 崩溃问题分析3.1 崩溃信息的来源是哪里?3.2 崩溃信息中的每个关键字代表的含义3.3 利用崩溃信息去查找造成崩溃的点3.4 keil5中怎么根据地址找到问题点3.5 keil5上编译时怎么输出…

【NTN 卫星通信】Starlink基于终端用户的测量以及测试概述

1 概述 收集了一些starlink的资料,是基于终端侧部署在野外的一些测试以及测量结果。 2 低地球轨道卫星网络概述 低地球轨道卫星网络(lsn)被认为是即将到来的6G中真正实现全球覆盖的关键基础设施。本文介绍了我们对Starlink端到端网络特征的初步测量结果和观测结果&…

STM32-ADC+DMA

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. ADC模拟-数字转换器1.1 ADC模拟-数字转换器1.2 逐次逼近型ADC1.3 ADC框图1.4 ADC基本结构1.5 输入通道1.6 规则组的转换模式1.6.1 单次转换,非扫描模式1.6.2 连续转换,非扫描模式1.6.3 单次…

Tabu Search — 温和介绍

Tabu Search — 温和介绍 目录 Tabu Search — 温和介绍 一、说明 二、什么是禁忌搜索以及我可以在哪里使用它? 三、禁忌搜索原则 四、短期记忆和积极搜索: 五、举例时间 六、结论: 七、参考: 一、说明 最近,我参加了…

在DevEco运行typeScript代码,全网详细解决执行Set-ExecutionPolicy RemoteSigned报出的错

目录 基本思路 网络推荐 本人实践 如下操作,报错: 基本思路 //在DevEco运行typeScript代码 /** * 1.保证node -v出现版本,若没有,配置环境变量(此电脑-属性-高级系统变量配置-path-粘贴路径);DevEco在local.properties中可看到当前nodejs的路径 * 2.npm install …

海外仓一件代发功能自动化:海外仓WMS系统配置方法

根据数据显示,2014-2019年短短几年之间,跨境电商销售总额增长了160%以上。这为跨境电商商家和海外仓,国际物流等服务端企业都提供了巨大的发展机遇。 然而,作为海外仓,要想服务好跨境电商,仓库作业的每一个…

车载测试之-CANoe创建仿真工程

在现代汽车工业中,车载测试是确保车辆电子系统可靠性和功能性的关键环节。而使用CANoe创建仿真工程,不仅能够模拟真实的车辆环境,还能大大提升测试效率和准确性。那么,CANoe是如何实现这些的呢? 车载测试中&#xff0…

刷题之合并两个有序数组(leetcode)

因为换了手机号码,之前leetcode的账号登不上去了,正好太久不刷题,很多思路都没了,所以重新开始刷leetcode! 这道题很简单,指针模拟一下,从后往前考虑,先看最大值。 class Solution…

【大语言模型系列之Transformer】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

PLC电源模块

PM电源模块 为CPU信号模块及 其他的扩展设备、其他用电设备(如传感器)提供工作供电 接线和开关 状态显示 灯的闪烁示意看手册 PS电源模块 为CPU信号模块及其他的扩展设备提供工作供电。PS(System Power Supply) 外形与PM电源模块类似,状…

常用的MRI分析软件

MRI(磁共振成像)分析软件种类繁多,涵盖了从基础图像处理到高级数据分析的各个方面。这些软件广泛应用于临床诊断、研究和教育等领域。以下是一些常用的MRI分析软件: 开源软件 商用软件 特殊用途软件 在线工具和云平台 这些软件各…

MATLAB制作一个简单的函数绘制APP

制作一个函数绘制APP,输入函数以及左右端点,绘制出函数图像。 编写回调函数: 结果:

图片高效管理神器,随机高度切割,一键生成灰色图片,个性化处理随心所欲

在数字化时代,图片已成为我们生活和工作中不可或缺的一部分。然而,面对海量的图片资源,如何高效管理、快速处理,成为了许多人头疼的问题。今天,我们为您带来了一款全新的图片高效管理神器_——首助编辑高手&#xff0c…

Nginx 报错问题汇总

目录 一、nginx: [emerg] invalid number of arguments in "include" directive in C:\Program Files\nginx-1.15.4/conf/nginx.conf:61 总结: 二、nginx: [error] OpenEvent("Global\ngx_reload_2152") failed (5: Access is denied) 解决…

51-3 内网信息收集 - 获取RDP密码信息(没有实验成功)

获取常见应用软件凭据 注意: %USERPROFILE% 是环境变量。在使用系统权限时,可以将 %USERPROFILE% 替换为绝对路径,或使用其他用户的令牌进行操作。 获取 RDP 保存的凭据(远程桌面) 为了避免每次连接服务器都进行身份验证,经常使用 RDP 远程桌面连接远程服务器的用户可能…

ubuntu下运行程序时提示缺库问题的有效解决方法

目录 一、问题现象二、解决方式三、总结 一、问题现象 当我们平时在ubuntu上运行一个程序时时长会遇到如下情况,含义为本机缺少执行程序需要的库 这时候我们可能会根据缺少的库使用apt install 库名的模糊名字 进行安装,然后再去运行,此时可…