当前位置: 首页 > news >正文

手眼标定公式

相机像素 → 手眼矩阵 → 机器人 base_link 坐标 → 实时 Servo 控制全部公式

一、先明确当前的坐标系(完全对应)

  • 手眼标定后统一坐标系:base_link
  • Servo 接收指令坐标系:base_link
  • 相机输出:通常是2D 像素 (u, v)3D 相机坐标 (Xc, Yc, Zc)
  • 最终发给机器人:base_link 下的微小偏移 dx, dy, dz

二、手眼标定核心变换公式

假设你已经做完手眼标定,得到:

  • 相机内参矩阵K
  • 手眼变换矩阵T_cam2base(相机 → base_link)或T_cam2gripper + T_gripper2base(眼在手上)

1. 相机 3D 点 → 机器人 base_link 点

plaintext

P_base = T_cam2base * P_cam

其中:

  • P_cam = [Xc, Yc, Zc, 1] 相机坐标系下焊缝点
  • P_base = [Xb, Yb, Zb, 1] 机器人基坐标系下点

2. 得到偏移量(给 Servo 用)

plaintext

dx = Xb - X_ref dy = Yb - Y_ref dz = Zb - Z_ref
  • X_ref/Y_ref/Z_ref:示教基准点(base_link 下)
  • dx/dy/dz:就是发给 Servo 的速度指令

三、完整可运行代码(视觉→Servo 全套)

相机数据填进去就能跑。

#!/usr/bin/env python3 import rospy import numpy as np from geometry_msgs.msg import Twist # ============================================== # 1. 填入你的手眼标定矩阵(相机 → base_link) # ============================================== # 示例:4x4 变换矩阵,单位:米 T_cam2base = np.array([ [1, 0, 0, 0.0], [0, 1, 0, 0.0], [0, 0, 1, 0.5], # 相机在Z方向0.5m高处 [0, 0, 0, 1.0] ]) # ============================================== # 2. 示教基准点(base_link下的标准焊缝点) # ============================================== X_ref = 0.5 # 基准X Y_ref = 0.0 # 基准Y Z_ref = 0.3 # 基准Z # ============================================== # 3. 安全速度限制(和你的servo配置匹配) # ============================================== MAX_LIN_VEL = 0.15 # m/s MAX_ANG_VEL = 0.2 # rad/s class VisionToServo: def __init__(self): rospy.init_node('vision_servo_bridge') self.pub = rospy.Publisher( '/servo_server/delta_twist_cmds', Twist, queue_size=1 ) self.rate = rospy.Rate(30) rospy.loginfo("✅ 视觉→Servo 节点启动完成") def cam_to_base(self, Xc, Yc, Zc): """相机3D坐标 → base_link坐标""" p_cam = np.array([Xc, Yc, Zc, 1.0]) p_base = T_cam2base @ p_cam return p_base[0], p_base[1], p_base[2] def limit(self, v, max_v): return max(-max_v, min(v, max_v)) def run(self, Xc, Yc, Zc): # 1. 相机坐标 → 机器人base_link Xb, Yb, Zb = self.cam_to_base(Xc, Yc, Zc) # 2. 计算偏移量 dx = Xb - X_ref dy = Yb - Y_ref dz = Zb - Z_ref # 3. 限幅 dx = self.limit(dx, MAX_LIN_VEL) dy = self.limit(dy, MAX_LIN_VEL) dz = self.limit(dz, MAX_LIN_VEL) # 4. 发布Twist指令 twist = Twist() twist.linear.x = dx twist.linear.y = dy twist.linear.z = dz twist.angular.x = 0.0 twist.angular.y = 0.0 twist.angular.z = 0.0 self.pub.publish(twist) self.rate.sleep() # 打印调试 print(f"偏移 dx={dx:.3f} dy={dy:.3f} dz={dz:.3f}") if __name__ == '__main__': vs = VisionToServo() while not rospy.is_shutdown(): # ========================================== # 这里替换成你的相机实时输出:Xc,Yc,Zc # ========================================== X_camera = 0.01 # 相机X Y_camera = 0.005 # 相机Y Z_camera = 0.0 # 相机Z vs.run(X_camera, Y_camera, Z_camera)

四、如果你只有 2D 相机(无深度)

像素 → 基坐标简化公式:

plaintext

Xb = a * u + b Yb = c * v + d Zb = 固定高度

a,b,c,d是你做像素标定得到的比例系数。


五、和现有 Servo 配置的严格对应

YAML 里的关键项:

yaml

robot_link_command_frame: base_link cartesian_command_in_topic: ~/delta_twist_cmds command_in_type: "unitless" 或 speed_units 都兼容
  • 代码发布话题:/servo_server/delta_twist_cmds
  • 指令坐标系:base_link
  • 单位:m/s
  • 平滑、限幅、安全 ✅
http://www.cnnetsun.cn/news/1888979.html

相关文章:

  • 收藏!2026 AI应用开发学习路线(小白/程序员必看):Java+Python双buff,避开弯路快速上岸
  • C++高性能定时器:从标准库到跨平台框架的实现与选型
  • 【AIAgent安全架构黄金法则】:20年专家首曝3大权限失控漏洞与7层防御落地指南
  • QT上位机实战:串口通信与动态波形可视化开发指南
  • PPTist:在浏览器中打造专业级演示文稿的全栈解决方案
  • Blender 3MF插件终极指南:5分钟实现3D打印工作流无缝对接
  • 基于STK的BDS3星座仿真与亚太区域GDOP性能深度评估
  • AI绘画小白必看:SD1.5 Archive 镜像一键部署与基础使用全攻略
  • 5分钟掌握网易云音乐插件安装:BetterNCM Installer终极指南
  • Markdown Viewer:浏览器中的免费终极Markdown阅读神器
  • 网站国产化改造,如何做到软件成本几乎为零?
  • 终极指南:如何用ParsecVDisplay零成本扩展你的Windows虚拟显示器
  • 【AIAgent法律助手开发实战指南】:SITS2026真实项目拆解,3大合规陷阱+5步交付法,法务与开发者必存
  • 如何让Windows 10/11完美运行经典游戏:DDrawCompat兼容性修复完整指南
  • 163MusicLyrics:一站式歌词获取神器,免费搞定网易云QQ音乐歌词下载与格式转换
  • 3步极速瘦身:让老旧电脑流畅运行Windows 11的终极方案
  • 噪声系数测试之Y因子(三):测试过程中的关键注意事项
  • 开源AI工作站实战:Pixel Fashion Atelier在二次元IP商业化中的应用
  • LinkSwift:2025年最全能的网盘直链下载助手完全指南
  • 我们自研了一套中文EDA工具链:从“女娲”语言到GDSII版图全流程(macOS ARM64版已可试用,私信获取)
  • 如何用WeChatMsg永久保存你的微信聊天记忆:免费工具完整指南
  • 别再盲目调batch_size了!:多模态微调中图像分辨率×文本长度×梯度累积的3维耦合公式(附PyTorch可复现代码模板)
  • 别再只盯着能量密度了!聊聊磷酸铁锂和三元锂在储能项目里的真实选型逻辑
  • Omni-Vision Sanctuary 自动化办公实战:Python 脚本生成与 Excel 复杂报表处理
  • 【仅限首批200位架构师】AIAgent测试契约协议(Test Contract Protocol)v1.2内部文档首次公开
  • 编码神器Claude Code:Windows 安装 Claude Code(火山方舟)
  • 嵌入式开发常识:电阻触摸屏与电容触摸屏的核心区别
  • 我把多模型联调拆成一条流水线 向量引擎 api key中转站 实测手记
  • halcon中difference区域相减的用法总结
  • 如何快速上手Retrieval-based Voice Conversion:面向新手的完整语音转换教程