news 2026/6/8 22:27:21

基于RealSense与GRCNN的机械臂平面抓取Python实现,含标定、检测、后处理与硬件对接全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于RealSense与GRCNN的机械臂平面抓取Python实现,含标定、检测、后处理与硬件对接全流程

本文还有配套的精品资源,点击获取

简介:直接可用的机械臂视觉抓取代码包,用Python实现GRCNN模型在平面场景中预测物体最佳抓取位姿。支持Intel RealSense系列RGB-D相机实时采集图像,内置相机标定脚本(run_calibration.py、calibrate_camera.py),能完成深度图对齐、内参外参估计;抓取区域生成由grasp_generator.py驱动,结合Graspness热图输出候选抓取框;post_process.py负责NMS筛选、角度归一化和置信度排序;robot.py封装UR/ROS/Dynamixel等常见机械臂控制接口,camera.py和device.py抽象设备通信层;visualisation模块提供抓取结果叠加显示;train_network.py支持模型微调,evaluate.py用于Jacquard/Cornell数据集评估;配套get_jacquard.sh等脚本一键下载公开抓取数据集;所有配置通过cfg/_config.yml统一管理,预训练权重存于models目录,测试图像和示例数据放在image与data子目录;README.md详述Ubuntu+Python3.7+PyTorch环境搭建、依赖安装及run_realtime.py/run_offline.py两种运行模式,适配高校机器人课程设计、毕业设计及实验室四轴/六轴机械臂平台快速验证。

1. 项目概述:这不是一个“调用API就能跑通”的玩具Demo

如果你正在为机器人课程设计焦头烂额,或者手头刚拆开一台四轴桌面机械臂、一块Intel RealSense D435i,却卡在“怎么让机械臂知道杯子在哪、该从哪边夹起”这个最基础的问题上——恭喜你,这套代码不是给你看的“参考实现”,而是我连续三个月在实验室工位上反复调试、烧坏两块USB3.0扩展卡、重装七次Ubuntu系统后,亲手打磨出的一套可直接拧上螺丝就进产线级验证环节的抓取流水线。它不讲论文里的F1-score曲线有多漂亮,只解决你明天上午十点导师来验收时,机械臂能不能稳稳夹起一枚20mm直径的M3螺母。

核心关键词——GRCNN抓取、RGB-D视觉、机械臂定位、RealSense驱动、抓取位姿预测——这五个词不是标签,而是五个必须被打通的关卡。GRCNN(Grasp Region Convolutional Neural Network)不是YOLO那种通用检测器,它专为“夹取”而生:输出的不是边界框,而是带旋转角度、宽度、深度偏移量的6自由度抓取矩形(grasp rectangle);RGB-D视觉意味着你不能只靠颜色,必须把深度图里每个像素对应的实际空间坐标算清楚;机械臂定位不是“大概对准”,而是要把相机坐标系下的抓取点,毫厘不差地转换到机械臂基座坐标系下;RealSense驱动不是pip install pyrealsense2就完事,而是要处理红外帧同步、深度-彩色图对齐、IMU数据融合、USB带宽抖动导致的帧丢弃;抓取位姿预测最终要落地成URScript指令或Dynamixel协议包,中间差着坐标变换、运动学逆解、关节限位校验三道生死线。

这套方案之所以能“开箱即用”,是因为它把高校实验室最容易踩的坑全预埋了答案:比如RealSense在Ubuntu 20.04上默认用libusb1.0驱动会偶发掉帧,我们强制切换到内核驱动模式;比如GRCNN输出的抓取角度是[-π/2, π/2],但UR机械臂要求[-π, π]且需避开奇异点,post_process.py里做了角度连续性插值;比如四轴机械臂没有腕部旋转自由度,所有抓取必须强制约束为俯视垂直抓取,robot.py里内置了“平面抓取模式”开关。它不假设你懂李群李代数,但也不会替你绕过坐标系转换这个必答题——所有矩阵运算都附带注释,连np.dot(R_cam2base, np.array([x,y,z,1]))这种基础操作,都在camera.py第87行加了# R_cam2base = T_base2cam[:3,:3].T,注意转置!的血泪提醒。

适合谁?不是给CV博士生做SOTA对比的,而是给大三学生三天内搭出抓取demo的;不是给ROS老手写launch文件的,而是给第一次听说tf2就头皮发麻的同学提供robot.py里一行arm.move_to_grasp(grasp_pose)就能触发真实动作的封装;它甚至考虑到了你实验室那台老旧的i5-6200U笔记本——run_offline.py支持纯CPU推理(速度约1.2fps),而run_realtime.py则自动启用CUDA加速(RTX3060下达18fps)。现在,我们开始拆解这条流水线的每一颗螺丝。

2. 整体架构与模块化设计逻辑:为什么这样分层?

整套系统的目录结构不是随意堆砌,而是按“数据流方向”和“故障隔离原则”严格划分。当你运行python run_realtime.py时,实际启动的是一个精密咬合的齿轮组:每个模块只负责一件事,且接口定义清晰到可以用类型提示(type hint)精确描述。这种设计不是为了炫技,而是为了让你在机械臂突然夹歪了螺丝时,能30秒内定位到是post_process.py的NMS阈值设高了,还是robot.py的逆解算法没处理好手腕翻转角。

2.1 数据采集层:RealSense驱动不是“打开摄像头”那么简单

get_realsense_rgbd_image.py是整个流水线的源头活水。它不直接调用rs.pipeline()裸奔,而是通过camera.py封装了一个RealSenseCamera类,这个类干了五件关键事:

第一,硬件握手可靠性加固。RealSense D435i在USB3.0口供电不足时,会静默丢弃深度帧但继续发彩色帧,导致后续所有计算错位。我们在start_stream()方法里加入了双通道帧计数器:每秒检查彩色帧与深度帧数量差是否超过3帧,超限则自动重启流并记录/tmp/rs_restart.log。这个逻辑在camera.py第142行,注释写着“实测某实验室USB集线器供电压降0.3V时必触发”。

第二,深度-彩色图精准对齐。官方SDK的align.process()函数在动态场景下存在1-2像素偏移。我们改用cv2.remap()配合内参矩阵做亚像素级重映射:先用rs.intrinsics生成畸变校正LUT表,再用双线性插值将深度图每个像素映射到彩色图坐标。这部分代码在get_aligned_depth_frame()方法中,耗时增加12ms但精度提升至0.5像素内。

第三,深度单位自适应校准。不同批次D435i的深度缩放因子(depth scale)可能有±0.00005差异。我们在calibrate_camera.py里新增了auto_depth_scale_calibration()函数:用已知厚度(10.00mm)的陶瓷标定块,在5个不同距离下拍摄,拟合深度读数与真实距离的线性关系,自动修正scale值。这个功能救了我们三次——某次采购的D435i出厂scale设为0.00102,而标准值应为0.00100。

第四,IMU数据融合预留接口。虽然当前抓取任务未用到IMU,但RealSenseCamera类已预留get_imu_data()方法,返回时间戳对齐的加速度计与陀螺仪数据。这是为后续扩展“移动平台上的动态抓取”埋的伏笔,避免后期重构。

第五,资源安全释放机制。Python的__del__方法在异常退出时不可靠,我们采用atexit.register()注册清理函数,确保即使Ctrl+C中断,也会执行pipeline.stop()和USB设备重置,防止下次运行时报“device busy”。

提示:run_calibration.py不是一次性的标定脚本。它包含两个模式:--mode=intrinsics仅标定内参(推荐每月执行),--mode=extrinsics标定外参(需将机械臂末端固定在标定板中心,推荐每次更换相机位置后执行)。外参标定时,我们不用OpenCV的solvePnP,而是用机械臂自带的TCP坐标作为真值,通过最小二乘拟合旋转平移矩阵——因为机械臂重复定位精度(±0.1mm)远高于视觉标定(±0.3mm)。

2.2 模型推理层:GRCNN不是黑盒,它的输出必须可解释

grasp_generator.py加载的GRCNN模型,权重来自models/grcnn_cornell.pth(Cornell数据集预训练)或models/grcnn_jacquard.pth(Jacquard数据集微调)。但重点不在模型本身,而在如何让它的输出真正服务于抓取任务。

GRCNN原始论文输出四个通道:Graspness热图(表示该点适合抓取的概率)、角度图(抓取矩形长轴与x轴夹角)、宽度图(最佳夹爪开口宽度)、深度图(抓取点距相机距离)。我们的GraspGenerator类做了三重改造:

第一,Graspness热图阈值动态化。固定阈值0.5会导致小物体漏检、大物体多检。我们采用Otsu算法对热图做自适应二值化:先用cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)获取最优阈值,再在此基础上浮动±0.1形成区间,确保至少保留3个候选区域。这段代码在_generate_grasp_candidates()方法第98行。

第二,角度连续性保障。原始角度图输出范围是[-π/2, π/2],但相邻像素角度跳变可能达π(如-1.57到1.57),导致NMS误杀。我们在_refine_angles()方法中引入角度插值:对每个候选点,取其3×3邻域内角度均值,并强制约束在[-π, π]内,用np.arctan2(np.sin(angles), np.cos(angles))保证连续性。

第三,深度图可信度加权。深度图噪声在远距离(>1.2m)显著增大。我们根据深度值动态调整置信度权重:confidence = graspness * (1.0 - min(depth/1.5, 1.0)),即距离越远,权重越低。这个设计让模型在1.5m外自动降低抓取建议强度,避免机械臂盲目伸长。

注意:train_network.py支持两种微调模式。--mode=feature_extractor冻结backbone只训练head层(适合小样本,如你只有50张自家零件图);--mode=fine_tune全网络微调(需≥500张图)。我们实测发现,对M3螺母这类小目标,用feature_extractor模式在20张图上训练30轮,mAP提升12.7%,而fine_tune模式需要150张图才能达到同等效果——因为backbone学到的通用特征反而干扰了小目标细节。

2.3 后处理层:筛选不是删减,而是构建抓取可行性评估体系

post_process.py是整条流水线的“决策大脑”。它接收GRCNN输出的数百个候选抓取,最终只输出1-3个最优解。这个过程不是简单排序,而是四层过滤网:

第一层:几何可行性过滤
检查抓取矩形是否完全落在图像有效区域内(排除边缘截断),且宽度值是否在机械臂夹爪物理极限内(如Robotiq 2F-85夹爪宽度范围为0~85mm)。代码中is_grasp_valid()函数会计算矩形四个顶点坐标,用cv2.pointPolygonTest()判断是否全在图像矩形内。

第二层:NMS(非极大值抑制)去重
传统NMS用IoU(交并比)判断重叠,但抓取矩形的IoU计算复杂。我们采用更鲁棒的“抓取中心点距离+角度差”联合判据:若两个候选抓取中心点距离<20像素,且角度差<15°,则保留置信度高的那个。这个阈值在cfg/_config.yml中可配置,实验室测试证明20像素/15°组合在D435i@640×480分辨率下误删率最低。

第三层:工作空间可达性校验
这才是最关键的一步。robot.py中的is_pose_reachable()方法会调用机械臂运动学模型(UR用DH参数,Dynamixel用MDH参数),将相机坐标系下的抓取点(x,y,z)和姿态(roll,pitch,yaw)转换到基座坐标系,再检查:
- 是否在机械臂最大工作半径内(UR5为850mm)
- 是否在关节限位范围内(如UR的joint_3不能<-120°)
- 是否存在自碰撞(用简化包围盒模型快速检测)

如果不可达,该候选直接淘汰。我们曾因此发现一个致命bug:GRCNN总在桌面边缘预测抓取,但UR5的基座安装高度导致边缘点z坐标过低,逆解失败——后来在post_process.py第215行加入z_min_threshold: 0.05(强制抓取点距桌面≥5cm)解决。

第四层:稳定性打分排序
最终排序不只看GRCNN置信度,而是加权综合得分:
final_score = 0.4*graspness + 0.3*stability_score + 0.2*reachability_score + 0.1*angle_continuity
其中stability_score基于抓取矩形长宽比(理想值≈4:1)、reachability_score是逆解成功率历史统计值、angle_continuity是邻域角度标准差倒数。这个公式在cfg/_config.yml中明确定义,允许你根据实际抓取对象调整权重。

3. 核心流程详解:从一帧图像到机械臂动作的完整旅程

现在我们以run_realtime.py为蓝本,走一遍真实场景下的端到端流程。这不是伪代码,而是你明天在实验室电脑上敲python run_realtime.py --camera=d435 --arm=ur5后,每一毫秒发生的真实事件链。

3.1 实时图像采集与预处理(耗时≈35ms)

当脚本启动,RealSenseCamera实例化并调用start_stream()。此时发生:
- USB设备枚举:pyrealsense2扫描/sys/class/video4linux/,找到D435i的video0(彩色)和video2(深度)设备节点
- 流配置:设置彩色流为640×480@30fps(RGB8格式),深度流为640×480@30fps(Z16格式),红外流关闭以节省带宽
- 对齐初始化:生成640×480大小的remap LUT表,耗时≈8ms
- 首帧捕获:pipeline.wait_for_frames()阻塞等待,实测首帧延迟120ms(USB握手耗时),后续帧稳定在33ms间隔

拿到原始帧后,进入预处理:
1.深度图滤波:用双边滤波(cv2.bilateralFilter)保留边缘的同时降噪,d=5, sigmaColor=75, sigmaSpace=75
2.无效像素填充:深度图中值为0的像素(无深度信息)用周围5×5窗口中值替换,避免后续坐标计算崩溃
3.彩色-深度对齐:调用cv2.remap()应用LUT表,将深度图每个像素映射到彩色图坐标,生成对齐后的深度图aligned_depth
4.点云生成:遍历aligned_depth每个像素,用相机内参fx,fy,cx,cy和深度值d计算世界坐标:
x = (u - cx) * d / fx
y = (v - cy) * d / fy
z = d
存入points_3d数组(shape: [H×W, 3])

实操心得:在get_realsense_rgbd_image.py第67行,我们注释了“若发现深度图大面积为0,请检查D435i红外发射器是否被遮挡——实验室常见原因是学生把相机贴在金属支架上,红外光被反射干扰”。这个细节官网文档从没提过,但我们烧过三块D435i才确认。

3.2 GRCNN推理与抓取候选生成(耗时≈180ms @ RTX3060)

预处理后的RGB-D图像被送入GraspGenerator
-输入构造:将RGB图(640×480×3)与对齐深度图(640×480×1)沿通道拼接,得到640×480×4张量
-归一化:RGB通道除以255.0,深度通道除以1000.0(单位转为米),减去ImageNet均值
-模型前向model(input_tensor.unsqueeze(0)),输出四个通道的特征图
-候选提取:在Graspness热图上用cv2.findContours找连通域,每个连通域质心作为候选中心点,结合角度图、宽度图、深度图生成抓取矩形

这里的关键是坐标系一致性。GRCNN输出的抓取点坐标(u,v)是图像像素坐标,必须转换为三维空间坐标(x,y,z)才能给机械臂用。转换公式为:
x = (u - cx) * z / fx
y = (v - cy) * z / fy
z = depth[u,v]
注意:这里的z必须用对齐后的深度值,而非原始深度——我们曾在grasp_generator.py第156行加了断言assert abs(depth_raw[u,v] - aligned_depth[u,v]) < 0.005来捕捉对齐失效。

3.3 后处理与最优抓取决策(耗时≈45ms)

PostProcessor接收约120个候选抓取,执行四层过滤:
-几何过滤:剔除32个边缘截断和宽度超限(>85mm)的候选,剩88个
-NMS去重:用中心点距离+角度差判据,合并相似抓取,剩41个
-可达性校验:调用robot.is_pose_reachable(),对每个候选计算逆解。UR5的逆解用ikpy库的chain.inverse_kinematics(),耗时≈8ms/次。41次共耗时328ms?不,我们用了批量逆解优化:将41个位姿打包成tensor,用torch.inverse_kinematics_batch()(自研CUDA核)一次性计算,总耗时仅22ms。这个优化在robot.py第301行,注释写着“省下300ms,够机械臂抬一次手臂”
-打分排序:计算综合得分,取Top-3输出

最终输出的best_grasp是一个字典:

{ 'position': [x, y, z], # 相机坐标系下,单位:米 'rotation': [roll, pitch, yaw], # ZYX欧拉角,单位:弧度 'width': 0.032, # 夹爪开口宽度,单位:米 'score': 0.92, # 综合得分 'pixel_center': [320, 240] # 图像坐标,用于可视化 }

3.4 机械臂控制与硬件对接(耗时≈200ms)

robot.pymove_to_grasp()方法是硬件对接的核心:
-坐标系转换:调用transform_point()将相机坐标系下的position转换到机械臂基座坐标系。转换矩阵T_cam2base来自calibrate_camera.py的外参标定结果,存储在cfg/camera_extrinsics.npy
-姿态适配:GRCNN输出的rotation是抓取姿态(夹爪闭合方向),需转换为机械臂末端执行器姿态。对UR5,我们约定:
tcp_rotation = [roll, pitch, yaw + np.pi/2]# 绕Z轴旋转90°,使夹爪开口方向对准抓取矩形长轴
-逆解计算:调用ikpy.chain.Chain.inverse_kinematics(),输入[x,y,z][rx,ry,rz],输出6个关节角度
-轨迹规划:不直接发送关节角度,而是用urx库的movej()进行关节空间插补,设置加速度0.5 rad/s²,速度0.3 rad/s,避免急停抖动
-夹爪控制:通过Modbus TCP向Robotiq夹爪发送0x010F指令,设置目标宽度为width*1000(单位:毫米)

常见问题:首次运行时机械臂乱动?大概率是T_cam2base矩阵符号错了。我们在robot.py第422行加了可视化调试:visualisation.plot_coordinate_frame(T_cam2base, 'base'),用Open3D画出基座坐标系,再用plot_coordinate_frame(np.eye(4), 'camera')画出相机坐标系,直观检查是否反向。这个技巧帮我们定位了7次坐标系错误。

4. 实操避坑指南:那些README里不会写的血泪教训

这套代码能跑通,不等于你能顺利复现。以下是我在实验室白板上记满的23条避坑笔记,按出现频率排序:

4.1 RealSense相关高频问题

问题现象根本原因解决方案出现场景
RuntimeError: No device connectedUbuntu 20.04默认禁用USB3.0 xHCI主机控制器/etc/default/grub中添加usbcore.autosuspend=-1,运行sudo update-grub && sudo reboot新装系统首次连接
深度图大面积黑色(值为0)D435i红外发射器被金属支架反射干扰将相机移至塑料支架,或在红外窗口贴3M红外增透膜实验室金属台面
彩色-深度图错位(物体边缘发虚)SDK版本不匹配(pyrealsense2 2.50.0+需librealsense 2.50.0)pip uninstall pyrealsense2 && sudo apt-get install librealsense2-dev && pip install pyrealsense2升级系统后
帧率不稳定(15fps波动)USB3.0端口供电不足(<900mA)使用带外部供电的USB3.0集线器,或在rs.config()中设置enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 15)降帧率笔记本USB口直连

提示:run_calibration.py的外参标定必须在机械臂静止时进行。我们曾因标定时机械臂散热风扇震动,导致外参矩阵旋转误差达3°——后来在calibrate_camera.py第88行加入time.sleep(2)等待风扇停转。

4.2 GRCNN模型推理陷阱

  • GPU内存溢出torch.cuda.OutOfMemoryError。不是显存小,而是grasp_generator.py第72行torch.no_grad()没写全。GRCNN的损失函数部分残留梯度计算,必须用with torch.no_grad():包裹整个推理过程。
  • 抓取角度跳变:输出角度在-1.57和1.57间疯狂切换。这是角度图未做连续性插值。修复在grasp_generator.py第129行,添加angles = np.arctan2(np.sin(angles), np.cos(angles))
  • 小物体漏检:GRCNN对<20像素的目标敏感度低。解决方案不是换模型,而是在get_realsense_rgbd_image.py中增加cv2.resize(rgb_img, (1280, 960))超分,再送入模型——实测M3螺母检出率从63%升至91%,推理耗时仅增25ms。

4.3 机械臂控制致命错误

  • UR5夹不住物体move_to_grasp()后夹爪未动作。检查robot.py第512行gripper.open()是否被注释——我们为防误触发,默认关闭夹爪控制,需手动取消注释。
  • 机械臂撞到桌子is_pose_reachable()返回True但实际碰撞。原因是UR5的DH参数中d3(肘部偏移)值错误。正确值应为0.1195m(UR官方文档Table 3),而非网上流传的0.122m。这个0.25mm误差导致z轴计算偏差3cm。
  • Dynamixel舵机响应延迟:发送指令后2秒才动作。这是波特率不匹配:device.pyDXL_BAUDRATE = 57600,但你的AX-12A舵机出厂设为1000000。用Dynamixel Wizard软件重设波特率。

4.4 环境配置隐形雷区

  • PyTorch版本冲突torch==1.10.0+cu113torchvision==0.11.1不兼容,导致torch.nn.functional.interpolate报错。解决方案:统一用pip install torch==1.10.2+cu113 torchvision==0.11.3+cu113 -f https://download.pytorch.org/whl/torch_stable.html
  • OpenCV版本陷阱cv2.remap()在OpenCV 4.5.5以上版本对float32 LUT表支持更好。低于此版本会出现偏移,必须升级:pip install opencv-python-headless==4.5.5.64
  • Ubuntu内核问题:Linux 5.15+内核对RealSense支持有bug,rs-pose示例程序闪退。降级到5.13:sudo apt install linux-image-5.13.0-52-generic

5. 扩展与定制化路径:如何让它为你所用

这套方案不是终点,而是你机器人项目的起点。以下是三条经过验证的扩展路径,附具体代码修改点:

5.1 数据集微调:从Cornell到你的产线零件

你不需要从零训练GRCNN。get_jacquard.sh下载的Jacquard数据集含5万张合成抓取图,但你的M3螺母照片只有20张。这时用train_network.py --mode=feature_extractor --dataset_dir ./my_parts
- 修改datasets/my_parts_dataset.py:继承GraspDataset,重写__getitem__(),用cv2.drawContours()在你的零件图上人工标注抓取矩形(只需标10张,其余用弹性形变增强)
- 关键参数:--epochs=50 --lr=0.001 --batch_size=4(小数据集必须小学习率)
- 微调后权重存于models/grcnn_my_parts.pth,在cfg/_config.yml中修改model_path: models/grcnn_my_parts.pth

5.2 多相机融合:解决单视角盲区

当前只用一个D435i,桌面边缘物体易漏检。添加第二个相机(如D415)只需三步:
1. 在camera.py中新增RealSenseCamera2类,复用大部分逻辑
2. 修改run_realtime.py,实例化两个相机,用threading.Thread并行采集
3. 在post_process.py中,对两个视角的候选抓取做跨视角NMS:将不同相机的抓取点都转换到同一世界坐标系(用各自的T_cam2base),再按空间距离(非图像距离)去重

5.3 ROS集成:无缝接入现有ROS系统

不想重写整套代码?robot.py已预留ROS接口:
- 启动roscore后,运行python ros_bridge.py(新脚本),它会:
- 订阅/camera/color/image_raw/camera/aligned_depth_to_color/image_raw
- 发布/grasp_candidates(自定义msg,含位置/姿态/宽度)
- 订阅/grasp_execute(std_msgs/Bool),收到True则触发抓取
- 所有坐标系命名遵循ROS REP-105:camera_link,base_link,tool0

最后分享一个小技巧:在visualisation.py中,plot_grasp_on_image()函数第45行,我们加了cv2.putText(img, f'Score:{score:.2f}', (u-50,v-10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2)——实时显示抓取得分。这个小小的数字,让调试时一眼就能判断是模型问题(得分低)还是坐标转换问题(得分高但抓不准)。它不改变任何功能,却让每天的调试效率提升了一倍。

这套方案的价值,不在于它用了多前沿的算法,而在于它把实验室里那些没人说破的“脏活累活”,全部变成了可复制、可验证、可 debug 的代码。当你明天站在导师面前,按下回车键,看着机械臂稳稳夹起那枚M3螺母时,你会明白:真正的工程能力,就藏在这些被反复锤炼过的细节里。

本文还有配套的精品资源,点击获取

简介:直接可用的机械臂视觉抓取代码包,用Python实现GRCNN模型在平面场景中预测物体最佳抓取位姿。支持Intel RealSense系列RGB-D相机实时采集图像,内置相机标定脚本(run_calibration.py、calibrate_camera.py),能完成深度图对齐、内参外参估计;抓取区域生成由grasp_generator.py驱动,结合Graspness热图输出候选抓取框;post_process.py负责NMS筛选、角度归一化和置信度排序;robot.py封装UR/ROS/Dynamixel等常见机械臂控制接口,camera.py和device.py抽象设备通信层;visualisation模块提供抓取结果叠加显示;train_network.py支持模型微调,evaluate.py用于Jacquard/Cornell数据集评估;配套get_jacquard.sh等脚本一键下载公开抓取数据集;所有配置通过cfg/_config.yml统一管理,预训练权重存于models目录,测试图像和示例数据放在image与data子目录;README.md详述Ubuntu+Python3.7+PyTorch环境搭建、依赖安装及run_realtime.py/run_offline.py两种运行模式,适配高校机器人课程设计、毕业设计及实验室四轴/六轴机械臂平台快速验证。


本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 22:13:02

Win11Debloat:Windows系统终极瘦身与隐私守护神器

Win11Debloat&#xff1a;Windows系统终极瘦身与隐私守护神器 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and custom…

作者头像 李华
网站建设 2026/6/8 22:08:16

BetterNCM安装器完全指南:5分钟掌握网易云音乐插件一键安装

BetterNCM安装器完全指南&#xff1a;5分钟掌握网易云音乐插件一键安装 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 你是否厌倦了网易云音乐客户端单调的功能&#xff1f;想要为你的…

作者头像 李华
网站建设 2026/6/8 22:08:13

怎样高效实现磁力链接转种子文件:专业级元数据提取实战指南

怎样高效实现磁力链接转种子文件&#xff1a;专业级元数据提取实战指南 【免费下载链接】Magnet2Torrent This will convert a magnet link into a .torrent file 项目地址: https://gitcode.com/gh_mirrors/ma/Magnet2Torrent Magnet2Torrent 是一个专注于磁力链接转换…

作者头像 李华
网站建设 2026/6/8 22:07:58

基于JTAG边界扫描的LPC55S69硬件互连故障精准定位实战

1. 项目概述最近在调试一块基于NXP LPC55S69的工控板时&#xff0c;遇到了一个棘手的问题&#xff1a;板子焊接完成后&#xff0c;核心MCU能正常启动&#xff0c;但有几个关键的GPIO外设通信始终失败。用万用表量通断是好的&#xff0c;上电电压也正常&#xff0c;但就是“不通…

作者头像 李华
网站建设 2026/6/8 22:07:07

计算机小程序毕设实战-django大数据基于微信小程序的直播带货商品数据分析系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/8 22:00:23

新鲜出炉26年高考北京卷压轴(真实,全网维衣,欢迎讨论)

mn的数表&#xff0c;每个位置取值为1或-1&#xff0c;满足其中任意长宽之差为2的矩形的四个角上四个数之和为0。第二问是求m4&#xff0c;n5时最多有多少个1。第三问是证明m6,n6时&#xff0c;在数表中任取一个矩形&#xff0c;有左下、右上两个角上的数都等于左上与右下之积。…

作者头像 李华