0


AI多模态大模型+机械臂打造具身实验平台

近期完成了一个结合多模态大模型让机械臂听命主人完成相关的搬运作业(一些不同颜色不同形状的物料),整理记录以便后续查阅使用。

一、背景

之前就有想法试试让机械臂听命与人,指挥干活的项目,假期 就想着利用身边有的dobot magic机械臂搭一个。刚好看见同济子豪兄的视频(可以去b搜他的视频,相关代码他也开源到github了),有了引路人(省去大量摸索时间),就开始做,硬件设备:dobot magic 4轴小机械臂,realsense d435i深度相机,笔记本电脑,物料一些,这些硬件设备都是之前做机械臂抓取实验用的,在前面的博文里面就有具体介绍:

之前是要完成视觉识别程序后,要机械臂做什么事情都要自己去写一个动作逻辑程序,你要改变一下机械臂要完成的作业,有得写一组相关的任务代码,这次实验主要的核心目标:我只需语音说出机械臂你要帮我找到什么什么物料,机械臂就自动去完成,当然其实还可以做些譬如机械臂向前向后之类的任务等。比如你先回到准备点,再帮我找到2个矩形料块和红色圆形料块1个等

二、Pipeline

1.语音模块:语音识别、文本转语音(机械臂回答用)

2.视觉模块:手眼标定、识别出目标(可用视觉大模型或者cnn或者传统处理)

3.决策模块:提示词工程、LLM

4.机械臂作业模块:机械臂各种基本动作的API

三、过程中的坑

1.语音识别

语音识别我试了几个大模型:openai API,百度的,微软的azure,识别率基本都很高,只是速度、价格之类的不一样吧,百度的申请key可以免费用一阵子,微软的azure申请了也可也免费用一阵,但他的申请麻烦,openai API是收费的,还有很多,反正挑一个用就行了。

需要注意的是语音录音后,要注意是双声道还是单声道的,我用的是笔记本跑,用内置的录音设备录出来的是双声道,给大模型识别不对,改成单声道的就行了。pthon代码用的是pyaudio库。

还有就是要自动判断什么时候开始录制和什么时候开始结束,总不能程序一跑就开始录音,或者手段按键停止录音吧,可以采用声音阈值设定开始录音,和长于某段时间没有声音后自动结束,代码直接参考同济自豪兄就行了,我的基本也是参考他,只是需要该双阴道为单声道的几行代码。

2.视觉模块

视觉模块可以用大模型视觉模块,我测试了openai的4o模型,测试几张图,基本能识别有什么东西,但是返回的像素坐标不太准,跟你给的图像很有关系,还有没有试GPT-v,可能v版的gpt会好很多,没有试子豪兄用的零一万大模型(李开复他们搞的),后面觉得整个套路会就行了,无法就是让大模型返回你要抓取的东西的中心像素值,就用了之前自己做的传统算法去找,(当然我这个任务的料块简单些,如果其他的可能要用到cnn或者视觉模型了),总之这里就是要得到抓取物抓取位置的像素点,然后进行坐标变换,前面要做好像素点到相机坐标,在转机械臂坐标,即所谓的手眼标定,这是自己要提前做好,做好后就有一个4*4的变换矩阵,可以保存到txt文档里面。

3.机械臂作业模块

这部分主要是机械臂基本动作单元设计,大模型现在还不能你给他这个机械臂厂家的开发文档,他就给你生出直接可执行的代码,(这个应该是一个很好的研究方向,能不能把厂家的开发文档,一些开发案例代码给大模型微调训练,让大模型自动生成各种应用API,类似copliot或者阿里的通义灵码那种)。比如最关键是输入参数的设计,因为这个输入参数后面是靠大模型自动帮你填进去的。

我这里用的四dobot magic,之前用厂家提供的api写,贼麻烦,这次我直接用pydobot 的python库,不过这个库只是提供了少量的几个功能接口,不知道谁弄的放到python 库里面,为了这次任务,手动修改了这个库文件。

还有一个如果你有协助机器人,或者6轴的,就尽量用,这个dobot magic就3轴,工作范围很小,经常超范围报警,在linux下碰到报警了,除了关机还清除不掉报警,麻烦!

4.决策模块

这是核心的部分,主要是通过你的语音命令,识别出你要让机械臂做什么,即按顺序计划好机械臂执行的任务,就是机械臂的函数名列表,如果没有函数参数的,就直接给除一个函数名(),如果有函数参数的,就要考虑怎么提取参数。这里大模型生成执行函数名称和参数有两种做法:

第一,就是在这个决策agent里不是一步到位,直接把参数提取了放到函数里面,而是把跟这个函数有关的参数信息摘出来整理文字,作为字符串传到封装了机械臂基本动作的函数里面,然后在这个函数里面再调一次视觉大模型(需要设计好提示词和明确输出数据格式)给出符合参数格式的数据,再运行机械臂基本动作单元程序。这样做的好处是,如果你的指令涉及到一些列的复杂动作(好几个机械臂基本动作函数,需要用多模态信息数据),这样更能确保函数参数提取的正确率,还有如果某一个机械臂基本动作单元函数是要处理多次类似的动作,即你的参数可能是一个数组之类的,比如你让机器人进行搬运任务,就需要给它很多个目标点参数,这是因为可以明确了输出格式,可以让大模型输出一个数组或者字典之类的格式数据,不过最重要的是,用这种方法是为了调用多模态大模型来找出抓取物,自然给他参数就是一段包括提示内容的文字。

第二,用大模型的function call 来实现,其实就是agent的工具或者技能之类的做法,这种用法,你不必再提示词里面明确输出格式,通过tools的封装,function call就可以自动去找到相关的参数。这种用法如果你的函数参数结构相对简单,就比较好用,但你的函数参数结构相对复制一些,function call 里面的tools的设计就不要弄了,我试过一下,觉得复杂一些的参数,让tools设计有些啰嗦,还不如第一种,但是如果是参数简单,这个是首选。当然还可以用langchai来做,后面有时间可以试试。

总的来说,这个项目核心还是决策模块,大模型的提示词设计,还有一个就是基本动作或者函数的设计(参数数量、格式设计)。与同济自豪兄做的不一样的地方:它的是让机械臂搬运一个东西到某个地方,办完后就结束了,我的是增加了一个语音唤醒,可以让机械臂搬运几个不同的东西,搬完继续待命。不过这些内容都不重要,内容不同只是你的动作api不一样,只要你整个框架了解了,想做什么任务(只要是多模态大模型能成果识别的)都是可以的,只是花时间去测试。

代码:大家可以去搜:同济子豪兄的github,我的代码等我整理了再放进来。


本文转载自: https://blog.csdn.net/weixin_43030192/article/details/141160043
版权归原作者 Mr.鱼 所有, 如有侵权,请联系我们删除。

“AI多模态大模型+机械臂打造具身实验平台”的评论:

还没有评论