零成本入门多模态大模型调用+机械臂抓取(二):仿真实验

实物可以见前文(一)

复现心得与代码复盘:多模态大模型调用+机械臂抓取(一)_deepsick 语音模组-CSDN博客

【仿真篇】

框架和原理都与之前一样,不再过多赘述代码功能和框架原理,主要记录一下仿真部分的内容,方便大家快速上手,已经不算特别新颖的项目了,仅供练手用。

这里使用Windows下的CoppeliaSim 4.80 EDU软件(原名Vrep)作为仿真环境,python3.10、CUDA12.4(环境感觉没什么影响),使用Windos和Coppeliasim的原因是试了一周ROS,Dobot官方给的模型编译完后用gazebo打开老是有报错,应该是我自己的问题,没找着原因。Coppeliasim EDU里自带了很多常见机械臂模型(比如UR5、UR3)以及示例代码,界面可视化做的还行,容易上手;缺点是每一代版本都有改动,网上教程更新没有它迭代快,选项按钮经常找不着,官方的英文说明书经常看不明白而且我怀疑说明书也没及时更新。

CoppeliaSim有两种调用方式 Simulator API  ZMQ Remote API,博主两个都用过,Sim API的调用方式是一种直接与 CoppeliaSim 的内部环境进行交互的方式,不需要通过网络通信。优点是学习起来对于软件、参数理解会更透彻,参考资料多;缺点是代码繁琐,细节问题比较多。我刚开始用的这个,因为参考资料比较多,后来偶然发现另一个博主开源的代码用了新的ZMQ Remote API,调用方式简洁,函数种类更加方便和丰富(其实是在获取旋转矩阵的时候用旧的做不下去了,硬是卡了两周没搞定坐标变换),理论上可行,但我没弄出来。ZMQ Remote API中的getObjectMatrix函数轻松获取外参矩阵。

每个对象(如机器人关节、传感器、模型等)在 CoppeliaSim 中都有一个唯一的句柄(handle)。通过句柄,可以对这些对象进行操作。当然,不论Sim API还是ZMQ API在程序开头都需要获取句柄。类似下面这样:

# 获得对象的句柄
targetObj = sim.getObject('/target')
tipobj = sim.getObject('/Dobot/tip')
visionSensorHandle = sim.getObject('/vision_1')
deepSensorHandle = sim.getObject('/vision_1/depth')
DobotHandle = sim.getObject('/Dobot')
gripperHandle = sim.getObject('/Dobot/suctionCup_link2')

进入正题,机械臂控制,因为我使用的是吸盘而非夹爪,所以二者最后抓取过程可能有所不同。

首先我们在吸盘所在部件下右击add一个Dummy,调整合适的大小以及运行时隐藏(自行探索一下)重命名为tip,可能需要调整位置使它与吸盘贴合可以选择移动模式后按住Ctrol+点击两个部件,在如下弹窗中选择Position,点击Apply to selection 即可让两部件中心点重合,再利用移动距离微调一下(如果有更好的办法欢迎评论区踢我)。

在Dobot下也是添加一个Dummy,重命名为target,重复上述动作让tip-target两个dummy重合。

设置逆运动学组:

在菜单栏中找到如下图

设置好后会出现一个名为IK的文本,此时已经大功告成,我们点击上方开始仿真(一定是开始仿真后),选择移动模式,拖动target,会看见机械臂整体跟着运动。

这里其实也有一些小问题,比如出现多解的情况,会导致机械臂姿势扭曲诡异,可以通过限定关节角度来减少发生概率,另外就是移动位置尽量不超出其运动范围,可以在代码中调试限定好位置,添加异常处理等。另外,对于该Dobot Magician机械臂,我们选择上方的Newton作为物理引擎,效果较好,Bullet引擎经常会导致吸盘部件分离(可能是超出范围导致的,但是Newton没有这个问题,看起来可接受),不知道原因,欢迎评论区讨论。

相机:RGB采用视觉传感器,深度相机用的是kinect下的,看其它博主代码借鉴来的,原来自己直接用一个视觉传感器好像也能输出深度信息,软件内显示是灰白色的,记不太清了,后来卡在坐标转换太久病急乱投医了,搞好了就没敢再动。那篇文章在这:Coppelia Sim (v-REP)仿真 机器人3D相机手眼标定与实时视觉追踪 (二)_coppeliasim相机标定-CSDN博客

depth_image_encoding.py文件是对运行后cv显示的深度图像上色,后来我没有用,感觉怪怪的,不影响深度信息。

关于标定:

先说一下,各版本差异有点大,我这里有个src文件夹,装的是coppeliasim_zmqremoteapi_client,因为当时病急乱投医,版本号对不上,所以对其做了点小修改,想完全复现我的代码的话,需要把该文件复制替换掉原来C:\Program Files\CoppeliaRobotics\CoppeliaSimEdu\programming\zmqRemoteApi\clients\python\src,然后应该就可以适配。

建议复制之前做好备份,时间久远,我有可能记错位置:(

这里只需要得到相机内外参和畸变系数即可,外参矩阵直接用ZMQ Remote API中的getObjectMatrix函数轻松获取,内参和畸变参数我当时没有找到相关函数获取方法,不过我做的任务有教学性质,索性直接添加棋盘格标定板采图标定了(同样的,如果有大佬知道的话麻烦点拨一下我qwq)。采集代码如collect_2所示:

from src.coppeliasim_zmqremoteapi_client import RemoteAPIClient
import time
import sys
import cv2
import numpy as np
import struct
import depth_image_encoding as encoding

client = RemoteAPIClient()
sim = client.require('sim')

# 启动仿真
sim.startSimulation()
print("Simulation start")

visionSensorHandle = sim.getObject('/vision_1')

# 获取RGB和深度图像
def get_rgb_depth_images():

    img, [resX, resY] = sim.getVisionSensorImg(visionSensorHandle)
    img = np.frombuffer(img, dtype=np.uint8).reshape(resY, resX, 3)
    # img = np.flipud(img)  # 上下翻转
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)  # 转换为BGR格式

    # 显示RGB图像和深度图像
    img_show = np.flipud(img)  # 上下翻转
    # cv2.imshow('RGB Image', img_show)

    return img_show

frame_number = 0  # 初始化frame_number
while True:
    img = get_rgb_depth_images()
    cv2.imshow("Image", img)
    # 处理按键事件
    key = cv2.waitKey(1) & 0xFF
    if key == ord('s'):
        if img is not None:
            cv2.imwrite(f'Camera_cali_2/frame_{frame_number}.png', img)
            print(f"Frame saved as Camera_cali_2/frame_{frame_number}.png")
            frame_number += 1  # 增加frame_number以便下次保存时编号递增
    elif key == ord('q'):
        cv2.destroyAllWindows()
        break  # 退出循环

至少采15张左右,也别太多,然后利用Intrinsic_1脚本进行计算即可,最终会得到一个calibration_results.npz文件,储存的就是标定信息了。

关于大模型部分其实都没变太多,文件内容和框架改变不大,主要就是机械臂的通信控制这里变了一点,通过(一)中实物介绍,相信在AI辅助编程下到这里基本没有太大问题了。

【UI界面】

基于PyQT5设计,利用多线程的方式将原本在终端中的交互与反馈集成到界面中并进行监控,按键即可启动实验。制作粗糙,功能有限,还望理解,多线程+视频流确实很绕,做了一些弹窗确认效果并不算达到预期。感觉还是PyQT Designer做出来好看一点,现在也可以用AI直接帮忙写界面,但是代码无法反向生成.ui文件,也就是不能用Designer可视化然后手动调整设计,只能从代码层抹黑调整一遍遍运行调试。

后续代码会上传至:Agent_Dobot/README.md at main · ZZZdebug1/Agent_Dobot

B站视频演示:基于大模型的智能体机械臂抓取实验设计【实物】【仿真】【UI界面】【多种可切换大模型】【本地部署+API调用】_哔哩哔哩_bilibili

前一篇文章:复现心得与代码复盘:多模态大模型调用+机械臂抓取(一)_deepsick 语音模组-CSDN博客

最近在复现Grounding DINO微调了,现在版本迭代好快,DINO的微调都是快一年前的项目了qwq,希望能对我日后学习有所帮助吧,做完可能也会发一篇梳理一下。

代码肯定会传的,不过想投个教学类的期刊,后面差不多了就传!

如有不对欢迎指正,仿真做的人少,也是本人慢慢摸索试错出来的,还望可以帮助大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值