P5c-4 相机出图联调:桥接 d405/d435 到 ROS,并修掉两处静默的几何错误
相机链路(devices/sim/gazebo/config/cameras.yaml 是唯一真相)
- sim_cameras.py 纯逻辑:话题映射 / 深度换算 / 内参 / 视场一致性比对
- sim_camera_adapter.py 改光学系 frame_id、32FC1 米 → 16UC1 毫米、覆盖内参
- gazebo_sim.launch.py 桥接 + 适配器 + 世界相机的静态 TF(位姿从 world 解析)
本轮修掉两个**静默**的几何错误(都能出图、都能查到 TF,但点位是错的)
1. gz 发的 camera_info 是错的:恒为 fx=fy=277, cx=160, cy=120
(等于它的默认 60° 视场 + 半分辨率主点),而渲染用的是配置的 87° 视场。
照抄它做三维反投影,点会偏半米量级;单目预览完全正常。
用已知地面平面做最小二乘反解,得 fy=337.2 / cy=239.5,与
640/(2·tan(87°/2))=337.2、480/2=240 吻合(残差中位 0.2mm)。
改为由 sim_cameras.intrinsics() 按 cameras.yaml 的视场重算并覆盖。
代价:cameras.yaml 的 horizontal_fov 必须与 SDF 一致,启动时自动比对告警。
2. assembly.world 里 D435 的 rpy 写成 (0, 50°, 180°),
而 URDF 相机的视线是**本体 X 轴**、rpy 复合顺序又是 Rz·Ry·Rx,
于是"先俯 50° 再偏航 180°"把视线翻到了背面:相机背对台面、只看地面。
它不报错,而且几何自洽(点确实落在真实地面上),只查数值发现不了。
改为 (0, 50°, 0),并加回归测试锁住。
新增验收工具 + 测试
- scripts/check_sim_cameras.py 反投影深度、要求命中地面/台面才算通过。
"有图像"不是验收标准;实测 d435 台面 11.9%/地面 75.3%、d405 台面 37.8%。
- 97 项单测(新增 sim_cameras 22 项、sim_site 16 项)
顺带修掉一处"改了配置静默无效"
- sim.world 此前硬编码在 robot_description._WORLD_REL,而 site.yaml 与
manifest.yaml 都宣称改它就生效。现在真的读了:
优先级 --world > site.yaml:sim.world > 内置默认(相对路径按仓库根解析)。
- physics_enable / joint_prefix 仍未接线,但若其值与实际状态冲突,
启动时会告警(sim_site.unwired_warnings),不再静默忽略。
文档
- devices/sim/gazebo/README.md 重写:原文还写着"仿真不是 Gazebo"、
相机插件用 libgazebo_ros_camera.so,与实现早已不符。现分三部分:
哪个"仿真"是真的 / 现状与缺什么 / 五条静默失效的坑及怎么验。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -480,13 +480,19 @@ network:
|
||||
# 设计约束:仿真与真机共用同一套参数(servo.* / hole_detect.stage2.*),
|
||||
# 只有物理引擎自身的参数放在这里,避免「仿真调好的值搬到真机不生效」。
|
||||
sim:
|
||||
# ⚠️ 这一段目前**没有代码读取**(gazebo_sim_launcher 还没实现,见
|
||||
# devices/sim/gazebo/manifest.yaml 的进度段)。现在跑 `run_sim.sh` 得到的
|
||||
# 仍是 mock 驱动(假数据 + RViz),不是物理仿真。
|
||||
# 这一段由 arm_sim_gazebo.sim_site 真正读取(此前是"声明了但没人读",
|
||||
# 改了毫无反应也不报错)。三个键的接线状况**不一样**,务必看清:
|
||||
#
|
||||
# 之所以先把 world 填上:世界文件与机器人描述**已经做好并通过 sdformat 校验**,
|
||||
# 填在这里等于把"参数该从哪来"确定下来,等启动器一接上就自动生效,
|
||||
# 不用再改配置。路径相对仓库根。
|
||||
# world ✔ 已接线。优先级:命令行 --world > 这里 > 内置默认。
|
||||
# 相对路径按**仓库根**解析。
|
||||
# physics_enable ✘ 未接线。世界文件里的重力/步长是写死的。若这里写的值
|
||||
# 与世界的实际状态不符,启动时会打印告警(不再静默)。
|
||||
# joint_prefix ✘ 未接线。前缀由 urdf/arm.sim.urdf.xacro 的 arm_prefix
|
||||
# 决定,且 config/controllers.yaml 里硬编码了 sim_joint1..7。
|
||||
# 写了个不同的值会告警。要真改,三处必须一起改。
|
||||
#
|
||||
# 另外注意:`run_sim.sh` 走的是 mock 驱动(假数据 + RViz),**不是**物理仿真;
|
||||
# 物理仿真入口是 `scripts/run_sim_gz.sh`(Gazebo)。两者互不影响。
|
||||
platform: "gazebo"
|
||||
world: "devices/sim/gazebo/worlds/assembly.world"
|
||||
physics_enable: true
|
||||
|
||||
Reference in New Issue
Block a user