jaka+realsense+aruco+手眼标定(python)

本文详细描述了作者在项目中重建手眼标定部分的过程,包括使用JAKA机械臂的末端位姿发布节点,Realsense驱动和Aruco库的安装,以及手眼标定包的配置和使用。作者分享了遇到的问题和解决方案,供其他开发者参考。

      第二次重建了项目的手眼标定部分……有很多第一次记录遗漏的地方,在此补充。

 一、JAKA机械臂末端位姿发布

      此次我是自己写的节点发布,建议一开始新建工作空间的时候就引入roscpp,rospy,std_msgs。

$ catkin_create_pkg package_name depend1 depend2 depend3
$ catkin_create_pkg roscpp  rospy  std_msgs

   发布末端位置前要先阅读JAKA官方说明手册中末端姿态读取部分,然后根据官方的说明写末端姿态发布节点。我的节点代码放在下面供大家参考:

#!/usr/bin/env python
# -*- coding:UTF-8 -*-
import jkrc
import rospy
import numpy as np
from geometry_msgs.msg import PoseStamped


def Path_Publish():  # 初始化节点
    rospy.init_node("publish_curunt_state")
    # 创建一个发布者,发布数据类型为PoseStamped
    pub = rospy.Publisher("/arm_pose", PoseStamped, queue_size=10)
    # 设置发布频率
    rate = rospy.Rate(10)
    while not rospy.is_shutdown():
        # 消息
        status = robot.get_tcp_position()
        rot_matrix = robot.rpy_to_rot_matrix([status[1][3], status[1][4], status[1][5]])
        qua_re
### Jaka 手眼标定非 ROS 实现 在手眼标定过程中,核心目标是计算相机坐标系与机器人底座坐标系之间的变换关系。对于Jaka机器人的手眼标定,可以采用经典的张正友标定法或其他基于矩阵运算的方法来实现这一过程[^1]。 以下是使用Python和OpenCV库实现的一个简单非ROS代码示例,用于完成手眼标定: ```python import numpy as np import cv2 def hand_eye_calibration(camera_poses, robot_poses): """ 使用Tsai-Lenz 方法进行手眼标定 参数: camera_poses (list): 相机到世界坐标的齐次变换矩阵列表 robot_poses (list): 机械臂末端到基座的齐次变换矩阵列表 返回: T_cam_robot (np.ndarray): 相机相对于机械臂基座的变换矩阵 """ A_list = [] B_list = [] for i in range(len(robot_poses)): R_c_i = camera_poses[i][:3, :3] t_c_i = camera_poses[i][:3, 3] R_e_i = robot_poses[i][:3, :3] t_e_i = robot_poses[i][:3, 3] A_list.append(np.hstack((R_c_i.T, -R_c_i.T @ t_c_i.reshape(3, 1)))) B_list.append(np.hstack((-R_e_i.T, R_e_i.T @ t_e_i.reshape(3, 1)))) A = np.vstack(A_list) B = np.vstack(B_list) _, _, Vt = np.linalg.svd(A.T @ B) X = Vt[-1].reshape(4, 4).T # 归一化处理 X /= X[3, 3] return X if __name__ == "__main__": # 假设已知数据 camera_poses = [ np.array([[0, -1, 0, 1], [0, 0, -1, 2], [1, 0, 0, 3], [0, 0, 0, 1]]), np.array([[0, -1, 0, 2], [0, 0, -1, 3], [1, 0, 0, 4], [0, 0, 0, 1]]) ] robot_poses = [ np.array([[1, 0, 0, 5], [0, 1, 0, 6], [0, 0, 1, 7], [0, 0, 0, 1]]), np.array([[1, 0, 0, 8], [0, 1, 0, 9], [0, 0, 1, 10], [0, 0, 0, 1]]) ] T_cam_robot = hand_eye_calibration(camera_poses, robot_poses) print("Hand-Eye Calibration Result:") print(T_cam_robot) ``` 上述代码实现了基于奇异值分解(SVD)手眼标定算法,适用于非ROS环境中的应用需求。通过输入一系列相机姿态和机器人末端执行器的姿态,该函数返回相机相对于机器人基座的变换矩阵。 #### 注意事项 - 上述代码假设已经获取了多组相机和机器人末端的位置信息。 - 数据采集阶段可以通过移动机械臂并记录其关节角度以及对应的图像特征点位置来获得这些信息。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值