资讯动态

基于深度图的GG-CNN机械臂抓取检测:原理、仿真与避坑指南

发布时间:2026/9/25 2:08:04 来源:尧图企业网站定制
简介面向机器人抓取与深度学习交叉领域的研究者和开发者这份资源提供基于GG-CNN的完整机器人抓取系统方案核心是利用深度图预测像素级抓取质量与姿态结合Gazebo与Pybullet仿真环境实现实时抓取可视化并通过康奈尔和提花数据集训练网络最终适配Kinova机械臂。资源共5个文件压缩包约42KB包含2个Python脚本用于抓取流程控制与模型推理1个Markdown说明、1个txt说明文件用于环境配置与使用指引另有1个docx附赠文档补充技术细节整体结构精简清晰。已有215人学习下载。通过该资源读者可了解GG-CNN如何从深度图像中生成抓取候选、如何在两个仿真平台搭建测试场景以及如何利用公开数据集训练与评估模型并参考Kinova平台上的开放闭环抓取实现为实际机器人部署和算法改进提供可直接参照的代码与思路。1. 先弄清 GG-CNN 在抓取系统里的位置一个深度图搞定质量与姿态机械臂抓取最烦的一件事是检测完物体位置之后还要算怎么伸手。传统做法是先做目标检测框出物体再拟合抓取矩形这类框级输出在遮挡、堆叠场景里直接崩而且框的位姿估计算法一大套放到真实机器人上很难在闭环里跑实时。GG-CNN 换了个思路输入一张深度图逐像素预测抓取质量、抓取角度和夹爪宽度推理一次不到 30ms直接在图像空间选出来抓取中心点输出天然连续适合做视觉伺服闭环。这套方案配合 Gazebo 和 Pybullet 两个仿真平台都能部署训练数据用康奈尔与提花数据集机械臂模型用 Kinova资源包里把训练脚本、仿真 world 和模型文件都打包好了适合做机器人分拣、机械臂抓取研究的工程师也适合刚入门想跑通一个完整抓取闭环的学生。2. 模型原理与网络结构为什么 GG-CNN 能端到端输出抓取质量图2.1 像素级抓取表示用三张图编码一个抓取抓取动作可以用一个四元组表示抓取点位置u, v、抓取角度 φ、夹爪宽度 w。传统方法把抓取当作「在图像里检测一个矩形框」而 GG-CNN 的做法是把这个四元组拆成三张与输入深度图同尺寸的特征图逐像素回归。第一张是质量图 Q。Q 图上每个像素的值表示「以该像素为抓取中心、沿该处预测的抓取角度闭合夹爪成功抓住物体的概率」数值在 0 到 1 之间。第二张是角度图编码该像素处的最优抓取角度。第三张是宽度图表示夹爪在该处应当张开多少。推理时只需要在 Q 图上找最大值那个像素就是当前场景里置信度最高的抓取点然后取出该点的角度和宽度直接下发执行。整个过程没有候选框、没有 NMS、没有锚点这是 GG-CNN 能跑实时闭环的根本原因。为什么用深度图而不是 RGB抓取是一个几何任务深度图直接提供物体表面距离信息对光照、纹理、阴影不敏感。康奈尔数据集里同时有 RGB 和深度实践下来用深度通道训练的模型在真实场景里的泛化明显比 RGB 稳而且深度图输入是单通道模型参数可以压得很小嵌入式 GPU 也能跑。输入一般预处理成 224×224 或 96×96 的灰度深度图深度缺失的像素用近邻插值或中值滤波补上。2.2 网络骨架轻量编码器-解码器回归四通道输出GG-CNN 本质上是一个全卷积的编码器-解码器结构。编码器逐步下采样压缩深度图的空间信息提取「哪里可能有抓取点」的语义特征解码器通过转置卷积把特征图恢复到输入分辨率最终输出四通道特征图。注意输出不只是 Q、φ、w 三张角度图在工程实现上拆成了 sin 和 cos 两个通道这样角度 0 和 180 在数值空间里不会出现跳变这是训练稳定性的关键。下面是一个可以直接跑的简化版网络结构参数量约 1M推理一张 224×224 深度图在普通 GPU 上不超过 15msimport torch import torch.nn as nn class GGCNN(nn.Module): def __init__(self, in_channels1, out_channels4): super().__init__() # 编码器三层卷积 池化逐步下采样获得高层语义 self.encoder nn.Sequential( nn.Conv2d(in_channels, 32, kernel_size3, padding1), nn.ReLU(), nn.MaxPool2d(2), # 224 - 112 nn.Conv2d(32, 64, kernel_size3, padding1), nn.ReLU(), nn.MaxPool2d(2), # 112 - 56 nn.Conv2d(64, 128, kernel_size3, padding1), nn.ReLU(), nn.MaxPool2d(2), # 56 - 28 ) # 解码器转置卷积逐级恢复分辨率 self.decoder nn.Sequential( nn.ConvTranspose2d(128, 64, kernel_size4, stride2, padding1), nn.ReLU(), nn.ConvTranspose2d(64, 32, kernel_size4, stride2, padding1), nn.ReLU(), nn.ConvTranspose2d(32, 16, kernel_size4, stride2, padding1), nn.ReLU(), nn.Conv2d(16, out_channels, kernel_size3, padding1), ) def forward(self, x): feat self.encoder(x) out self.decoder(feat) # 四通道质量图 sin/cos 角度 宽度 q torch.sigmoid(out[:, 0:1]) angle torch.tanh(out[:, 1:3]) width torch.sigmoid(out[:, 3:4]) return torch.cat([q, angle, width], dim1)中间特征分辨率压到 28×28解码器再恢复到 224×224。这样做的好处是感受野大——每个输出像素都能看到物体周围足够大的上下文不会只盯着局部纹理。质量图用 sigmoid 保证 0 到 1角度用 tanh 约束在 -1 到 1对应 sin/cos 编码后的数值范围宽度用 sigmoid 映射到 0 到 1解码时再乘上夹爪最大开口宽度。实际训练时不要把网络做得太深。我曾经试过把编码器换成 ResNet18 特征提取精度提升不到两个点推理时间翻了三倍闭环里丢失帧数明显增加。GG-CNN 这类方法的定位就是「实时可闭环」精度靠数据集增强和损失函数设计去补而不是靠堆模型容量。2.3 损失函数加权 MSE 与角度周期性的处理抓取质量图里真正重要的是高 Q 值区域因为推理时只取最大值那个像素。所以损失函数不能对所有像素一视同仁否则模型会把大量容量浪费在桌面背景这些永远不会被选中的像素上。常见做法是加权 MSE权重在 ground truth 质量图基础上加一个偏置让高质量抓取中心的loss占比更高。角度通道要特别注意周期性。直接回归角度数值的话0 度和 180 度在数值上差 180但物理上是一回事模型会被这种假矛盾搞晕。所以把角度乘 2 之后取 sin/cos 编码这样 0 度和 180 度对应同一个编码点周期性自然消除。恢复角度时用 atan2 解算再除以 2 得到真正的抓取角。下面是带权重计算的损失函数import torch.nn.functional as F def weighted_grasp_loss(pred, target, weight_bias1.0): # pred/target: [B, 4, H, W]通道顺序为 Q, sin(2φ), cos(2φ), W q_pred pred[:, 0:1] ang_pred pred[:, 1:3] w_pred pred[:, 3:4] q_gt target[:, 0:1] ang_gt target[:, 1:3] w_gt target[:, 3:4] # 权重图gt 质量图越高loss 权重越大也保留一点背景权重 weights weight_bias q_gt # 分项计算加权 MSE q_loss (weights * (q_pred - q_gt) ** 2).mean() ang_loss (weights * (ang_pred - ang_gt) ** 2).mean() w_loss (weights * (w_pred - w_gt) ** 2).mean() return q_loss ang_loss w_loss训练时 Q 图不是二值标签而是以抓取中心为圆心的高斯分布所以模型学到的是「中心点附近都是潜在可抓区域越靠近中心置信度越高」。这样做的好处是即使推理时选点有 2-3 个像素的偏差抓取角度和宽度仍然是合理的。康奈尔数据集里负样本矩形对应的区域 Q 图全为 0权重图相应减小避免负样本区域的梯度淹没正样本。实践里我把 weight_bias 设为 0.5比设为 1.0 在高 Q 区域收敛更快——高置信度区域的权重占比更大模型会优先把「最值得抓的地方」预测准。3. 从康奈尔数据集到可训练样本标注格式、预处理与训练参数3.1 康奈尔与提花怎么选真实但量少还是合成但量大康奈尔抓取数据集是 GG-CNN 论文里最早使用的基准包含数百张真实场景的 RGB-D 图像每张图有若干个正负抓取矩形标注。真实数据的好处是深度图分布和实际相机接近坏处是数量太少只靠它训练出来的模型换个环境效果就明显下滑。提花数据集是用 3D 模型批量渲染生成的合成数据集场景数量大一个量级每个场景的抓取标注也更密集很多标注还附带分割掩码适合用来做预训练或者数据增强的补充。两个数据集的标注形式也不同康奈尔是矩形框坐标提花除了矩形框还给出物体掩码预处理的写法会有点差别。我的建议流程是先在康奈尔上把训练、推理、仿真闭环整套代码调通因为数据量小一个 epoch 很快调试效率高。确认全流程没问题之后再混合提花数据训练一个泛化更好的最终模型。直接用提花从头训练会踩一个坑合成深度图的噪声分布和真实相机差很远模型容易过拟合到「干净的深度轮廓」上这个坑我在第五章展开说。3.2 矩形标注转像素级三通道标签把抓取矩形变成高斯分布康奈尔标注文件里每个抓取矩形用四个角点表示常见的读取格式是每行一组矩形参数。要把这样的标注转换成网络需要的 Q 图、角度图、宽度图需要对每个矩形计算中心点、角度和短边长度然后以中心点为圆心生成高斯分布写入 Q 图。多个矩形重叠时按 Q 值最大的矩形取角度和宽度不能让后一个矩形把前一个的预测直接清零。下面是一个完整的转换实现import numpy as np def rect_to_ggcnn_label(rects, h, w, sigma5.0): q_map np.zeros((h, w), dtypenp.float32) ang_sin np.zeros((h, w), dtypenp.float32) ang_cos np.zeros((h, w), dtypenp.float32) width_map np.zeros((h, w), dtypenp.float32) y, x np.mgrid[0:h, 0:w] for rect in rects: # rect: [x1, y1, x2, y2, x3, y3, x4, y4]四个角点顺时针 pts rect.reshape(4, 2) cx pts[:, 0].mean() cy pts[:, 1].mean() # 矩形短边长度作为夹爪宽度长边方向作为抓取角度 edge1 np.linalg.norm(pts[1] - pts[0]) edge2 np.linalg.norm(pts[2] - pts[1]) if edge1 edge2: long_edge pts[1] - pts[0] short_edge edge2 else: long_edge pts[2] - pts[1] short_edge edge1 angle np.arctan2(long_edge[1], long_edge[0]) # 高斯分布写入 Q 图中心点置信度最高 gauss np.exp(-((x - cx) ** 2 (y - cy) ** 2) / (2 * sigma ** 2)) mask gauss q_map q_map[mask] gauss[mask] # 角度乘 2 编码解决 0 度和 180 度等价问题 ang_sin[mask] np.sin(2 * angle) ang_cos[mask] np.cos(2 * angle) width_map[mask] short_edge # 返回四通道图与网络输出格式对应 return np.stack([q_map, ang_sin, ang_cos, width_map], axis0)高斯核的 sigma 决定标签的「影响范围」。sigma 太小Q 图只有中心一个点有值模型很难收敛sigma 太大允许的抓取中心偏离程度过高角度预测在边缘处会失真。我一般设为 5 到 7 个像素对应到 224×224 输入下约两到三厘米的实际范围和夹爪指尖尺寸匹配。注意角度方向康奈尔标注里矩形的长边方向是一个可取抓取角但同一个矩形旋转 180 度后物理抓取效果相同用 sin/cos 双通道编码正好消掉这个歧义。3.3 训练参数与增强策略翻转时角度标签必须同步训练时的数据增强直接影响模型能不能从几百张康奈尔图里学到泛化能力。随机翻转、随机旋转、随机裁剪、深度图加噪都要做但有一个容易翻车的细节水平翻转图像时抓取角度会变成补角如果只翻转输入图却保持标签角度不变模型会学到错误的映射关系训练 loss 能降实际抓取角度却总是偏的。# 训练关键参数参考配置可复现 # 输入尺寸 224x224深度图归一化到 [-1, 1] # 优化器 Adam学习率 1e-3权重衰减 1e-4 # batch size 32训练 30 个 epoch # 学习率调度ReduceLROnPlateaupatience5factor0.5 # 数据增强随机翻转、随机旋转 ±20 度、随机裁剪 90%~100%、高斯噪声 sigma0.01旋转增强时角度标签要加上旋转角度翻转时角度取反再编码。深度图加噪用高斯噪声模拟 Kinova 深度相机的测量误差噪声幅值不宜过大否则会盖住物体的几何轮廓。训练过程里我习惯存两类权重每轮结束存一个latest.pt另外保存验证集上 loss 最低的best.pt。仿真部署时优先加载 best因为它在泛化上通常比最后一个 epoch 的权重好。预训练模型在第 30 个 epoch 左右 KL 散度开始震荡这时候 ReduceLROnPlateau 会把学习率降下来微调。如果训练到 30 轮仍没收敛优先检查标签生成流程看 Q 图最大值是不是正好落在物体中心附近——这一步是最容易出问题的黑匣子模型结构反而很少需要调。4. 把模型搬进 Gazebo 与 Pybullet仿真可视化全流程4.1 Gazebo 还是 Pybullet选型看你要闭环还是要生态Gazebo 和 Pybullet 都能做抓取仿真但定位不一样。Gazebo 深度集成 ROS 生态传感器插件、TF 树、ros_control 都是现成的适合做完整机器人系统——比如机械臂加移动底盘、导航避障加抓取一条龙。Pybullet 是一个 Python 库没有 ROS 也能直接跑加载 URDF、获取相机图像、控制夹爪全部通过 Python API 完成启动快、调试成本低特别适合把 GG-CNN 的「深度图采集—推理—抓取执行」闭环快速跑通和 MuJoCo 这类学术向仿真器相比Pybullet 的接触反馈和夹爪控制接口更直接更适合做闭环策略验证。维度GazeboPybullet物理引擎ODE可换 BulletBulletROS 集成原生支持话题/TF 全套需自己桥接启动速度分钟级world 加载慢秒级脚本直接跑深度图真实感可配置噪声和畸变默认偏干净常见用途系统集成、导航抓取全链路抓取闭环、策略验证做 GG-CNN 项目我的选择是调试算法用 Pybullet因为迭代快最后出系统级演示用 Gazebo因为要接 ROS 的 move_group 和相机话题。两者在资源包里共用同一套模型和训练权重切换成本主要是坐标系和数据格式的转换。4.2 Pybullet 写一个最小抓取闭环从深度图到夹爪闭合Pybullet 里跑 GG-CNN 闭环只需要四个步骤加载 Kinova 机械臂和物体、获取相机深度图、推理得到抓取点、控制机械臂过去并闭合夹爪。关键点在于相机到机械臂基座的坐标变换。Pybullet 的getCameraImage返回的深度图是视锥体 z-buffer需要结合相机内参反投影成三维点再从相机坐标系变换到机械臂基座坐标系这个变换矩阵可以从getLinkState拿到。import pybullet as p import numpy as np p.connect(p.GUI) # 加载 Kinova 机械臂模型基座固定 robot p.loadURDF(kinova_gen3.urdf, useFixedBaseTrue) obj p.loadURDF(box.urdf, basePosition[0.5, 0.0, 0.1]) # 相机参数安装在机械臂末端上方 cam_pos [0.5, 0.0, 0.8] cam_orient p.getQuaternionFromEuler([0, 0, 0]) fx, fy, cx, cy 500.0, 500.0, 160.0, 120.0 def get_depth(): view p.computeViewMatrix(cam_pos, [0.5, 0.0, 0.0], [0, 1, 0]) proj p.computeProjectionMatrixFOV(40, 1.0, 0.1, 5.0) _, _, rgb, depth, _ p.getCameraImage(320, 240, view, proj) return np.array(depth).reshape(240, 320, 4)[:, :, 3] # 推理取 Q 图最大值点反投影到三维空间 depth_img get_depth() # ggcnn_model 为训练好的网络输入 [1,1,224,224]输出 [1,4,224,224] q_map, angle_map, width_map ggcnn_model.infer(depth_img) u, v np.unravel_index(np.argmax(q_map), q_map.shape) Z depth_img[v, u] X (u - cx) * Z / fx Y (v - cy) * Z / fy target_3d [X, Y, Z] # 再乘上相机到基座的变换矩阵这段代码里最关键的是深度值 Z 的单位。Pybullet 的深度图默认在近远裁剪面之间是非线性映射用projectionMatrixFOV求得深度后需要做一次线性还原否则反投影出来的三维坐标会整体偏移。处理方式是直接用 far×near / (far - depth × (far - near)) 还原真实深度。另一个细节是物体放在桌面上时Q 图最大值通常会落在物体顶面中心附近这和康奈尔数据集里标注集中在物体中上部的分布是一致的。夹爪控制用calculateInverseKinematics解算六个关节角然后把末端沿抓取轴方向下移一个固定距离再闭合夹爪。抓取角度不是让末端直接旋转到该角度而是把深度图像素的角度换算成基座坐标系绕 Z 轴的偏航角令末端先对准角度再垂直下探。Kinova 的夹爪是欠驱动结构闭合指令给到位后要等待几百毫秒让指尖完全夹紧再执行抬起动作。4.3 Gazebo 侧等效流程深度话题到抓取点发布Gazebo 里的流程本质相同只是数据从话题来、控制从 ROS 走。相机用 depth 类型传感器插件发布/camera/depth/image_raw话题Python 节点订阅后转成 OpenCV 格式输入网络推理结果发布成PoseStamped给机械臂的 move_group 执行。下面是一个最小可用的相机配置片段gazebo referencecamera_link sensor typedepth namedepth_cam always_ontrue/always_on update_rate30/update_rate camera horizontal_fov1.05/horizontal_fov image width320/width height240/height /image clip near0.1/near far5.0/far /clip /camera /sensor /gazebo注意 depth 传感器的horizontal_fov单位是弧度1.05 接近 60 度配合 320×240 的分辨率每个像素对应的空间尺度比 Pybullet 里更大。近裁剪面 0.1、远裁剪面 5.0 的设置在常见桌面上足够物体离相机太近会被裁剪掉太远则深度精度下降。订阅侧的代码和 Pybullet 的区别只是数据来源import rospy from sensor_msgs.msg import Image def depth_callback(msg): # 转成 320x240 的 float 深度图单位米 depth np.frombuffer(msg.data, dtypenp.float32).reshape(240, 320) q_map, angle_map, width_map model.infer(depth) u, v np.unravel_index(np.argmax(q_map), q_map.shape) # 反投影到相机坐标系再经 TF 转到 base_link publish_grasp_pose(u, v, depth[v, u], angle_map[v, u]) rospy.Subscriber(/camera/depth/image_raw, Image, depth_callback) rospy.spin()Gazebo 里的深度图默认没有噪声训练时如果不加深度扰动模型在仿真里 Q 图会非常「锐利」但换到真实相机直接性能崩。建议在训练增强里加入高斯噪声和随机深度缺失块让模型不再依赖干净深度轮廓。5. 避坑清单深度图失真、坐标变换与仿真不同步的五条记录5.1 深度图全黑或者全是同一个值裁剪面设置不对现象相机话题能收到图但深度图要么全黑要么固定输出一个常数Q 图推理结果完全随机。 原因深度相机的 near/far 裁剪面和物体距离不匹配。物体在 0.5 米处near 却设了 2.0物体整个被裁剪掉far 设太小也会把背景截断深度图变成一大块同一个值。 解决先打印深度图的最大最小值确认范围再调整 near/far。桌面上抓取场景我习惯 near0.1、far5.0并且把物体放在相机前方 0.3-1.0 米区间内。在 Pybullet 里computeProjectionMatrixFOV的 near/far 同样要核对。5.2 训练 loss 正常下降但抓取角度总是偏 90 度翻转增强没同步角度标签现象康奈尔验证集上 Q 图很准中心点落在物体上但仿真执行时夹爪角度和物体长轴方向差 90 度左右。 原因做水平翻转增强时只翻了深度图和 Q 图角度标签没做对应变换。水平翻转后抓取角度应该变成补角sin/cos 编码需要重新计算否则模型学到的是「翻转后角度不变」的错误映射。 解决把所有增强操作封装成同一个函数图像和标签同步变换。翻转时角度取负旋转时角度加旋转量。写完增强代码后单独跑一个脚本打印翻转前后某一点的 sin/cos 编码值做核对这一步能省掉后面一整天的排查时间。5.3 Gazebo 里夹爪空抓碰撞体和摩擦系数没对齐现象机械臂按 Q 图位置下去了夹爪也闭合了但抬起来时物体留在桌面。 原因Gazebo 里 URDF 的碰撞体和视觉模型不一致夹爪指尖没有碰撞体或者摩擦系数默认为 0导致夹爪和物体之间没有有效接触力或者接触力小到不足以克服重力。 解决检查 URDF 里 finger tip link 是否含有碰撞体给指尖设置mu11.0 mu21.0摩擦系数。闭合夹爪后不要立即抬起先等待 0.3-0.5 秒让接触稳定再执行提升动作。这个坑在 Pybullet 里不明显因为 Bullet 的默认接触参数和 Gazebo 的 ODE 不一样同一套 URDF 两个仿真器行为会有差异。5.4 Pybullet 里抓取过程卡成幻灯片逐帧推理拖垮物理循环现象相机图像每帧都送进网络推理推理耗时 30ms加上物理仿真时间步整个闭环只有 5-10 FPS机械臂动作一顿一顿。 原因GG-CNN 虽然轻量但逐帧推理仍然吃掉了大部分算力物理仿真被阻塞。抓取本质上不需要每帧都重新选点相机固定时场景变化很慢。 解决把推理频率降下来比如 10Hz 推理一次机械臂执行期间用上次的抓取点。更稳的做法是把推理放到独立线程物理主循环只读取最近一次推理结果两个线程之间用锁保护共享变量。这样闭环能稳定跑到 30Hz 以上且不会出现机械臂抖动。5.5 康奈尔验证 90% 但仿真抓取成功率只有 40%训练和部署的深度分布不一致现象模型在康奈尔测试集上 loss 很低像素级抓取精度看着很好但放进 Pybullet 或 Gazebo 里成功率骤降。 原因康奈尔是真实相机拍摄深度图有噪声、有缺失、物体表面反射造成局部空洞仿真深度图干净得离谱边缘锐利、表面平滑。模型在干净图上预测出的 Q 图非常自信但这些「自信」来自训练时见过的噪声模式一旦部署深度图的统计特性变了预测退化。 解决训练阶段在深度图上加高斯噪声、随机像素缺失、边缘模糊模拟真实相机退化。另外可以在仿真里给深度相机加噪声模型Gazebo 里有现成的噪声插件Pybullet 里手动对深度图加 sigma0.01 的高斯噪声再喂给网络。对齐训练和部署的深度分布比调网络结构对成功率的影响大得多。6. 把抓取成功率跑出来从热区分析到机械臂实拍的验证方式模型训练完、仿真也能动之后最容易被忽略的是「到底抓得准不准」的量化评测。我习惯写一个自动评测脚本每次随机摆放物体位置和姿态跑 N 次抓取记录成功次数。成功标准定义为夹爪闭合后提升物体质心高度变化超过阈值且物体没有在移动过程中掉落。刚写完模型时我都是肉眼盯着看觉得「好像挺准」后来发现同一个模型在不同随机种子下成功率可能差 20 个百分点不量化根本没法对比。def evaluate(n_trials20): success 0 for i in range(n_trials): reset_scene() # 随机摆位 q_map, angle_map, width_map inference() u, v np.unravel_index(np.argmax(q_map), q_map.shape) if q_map[u, v] 0.5: continue # Q 值太低主动放弃算一次失败 lift_height try_grasp(u, v) if lift_height 0.02: success 1 return success / n_trials评测结果不要只看平均成功率要分开记录「物体姿态变化大不大」「抓取中心是否总偏向某个方向」。更好的做法是保存每次抓取的 Q 图、实际抓取点和成功与否失败时把 Q 图热区打出来——如果失败样本的 Q 图最大值总是出现在物体边缘而不是中心说明标签高斯核的 sigma 调太小了如果失败集中出现在特定角度区间说明角度编码在那一带梯度不够。调参优先按失败样本的热区特征走而不是盲目加大训练轮数。那个血泪经验是有一次在 Gazebo 里成功率已经跑到 90%把同一套模型和 URDF 搬进 Pybullet 后掉到 55%排查到最后发现是两边的默认摩擦系数不一样——Gazebo 默认 1.0Pybullet 默认 0.5。从那以后我每次换仿真平台第一件事就是对齐物理参数表摩擦系数、碰撞体、夹爪闭合时间。资源包里附带的仿真配置已经按这套经验校准过但你自己换物体模型时务必重新走一遍这个检查清单。希望这些路径和坑位能帮你在 GG-CNN 的抓取闭环上少绕几圈。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑