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

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

 一、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_result = robot.rot_matrix_to_quaternion(rot_matrix[1])
        status_msg = PoseStamped()
        status_msg.header.frame_id = "joint_0"
        status_msg.header.stamp = rospy.Time.now()
        status_msg.pose.position.x = status[1][0] * 0.001
        status_msg.pose.position.y = status[1][1] * 0.001
        status_msg.pose.position.z = status[1][2] * 0.001
        status_msg.pose.orientation.w = qua_result[1][0]
        status_msg.pose.orientation.x = qua_result[1][1]
        status_msg.pose.orientation.y = qua_result[1][2]
        status_msg.pose.orientation.z = qua_result[1][3]

        # 发布消息
        # rospy.loginfo("Publishing Plan...")
        pub.publish(status_msg)
        # 按照循环频率延时
        rate.sleep()


if __name__ == "__main__":
    robot = jkrc.RC("10.5.5.100")
    if robot is None:
        print("返回一个机器人对象失败")
    else:
        print("返回一个机器人对象")
        log_success = robot.login()  # 登录
    if log_success[0] != 0:
        print("登录失败")

    else:
        print("登录成功")
        power_success = robot.power_on()  # 上电
    if power_success[0] != 0:
        print("上电失败")

    else:
        print("上电成功")
        enable_success = robot.enable_robot()
        if enable_success[0] != 0:
            print("使能失败")
        else:
            print("使能成功")
        try:
            Path_Publish()
        except rospy.ROSInterruptException:
            pass

二、Realsense驱动和包的安装

  关于realsense的安装,网上有很多例子,可以查询自己的ubuntu版本后搜索相关安装教程,我的是20.04,参考的教程为:

Ubuntu20.04+RealSense D435i_ubuntu20.04安装d435i-CSDN博客

  但是实际上我的安装并不顺利,到下面一步都是没有问题的,看得到点云图(当然你要用手眼标定其实可能并不需要下面的库,下载aruco库就可以了,把realsense驱动装了就行应该??)。

   不过在编译相关库的时候出现了如下的报错:

   当时傻傻的按照提示用catkin_make_isolated和查看erro.log按照提示装thread,甚至花了80软妹币去淘宝找了个技术员(除了浪费我2小时啥都没解决。
  后面查了很多博客,发现这个默认下载的是ROS2版本,我要下载ROS1版本的,打开下面的地址版本选择ros1即可。

https://github.com/IntelRealSense/realsense-ros/blob/ros1-legacy/README.md#installation-instructions

值得一提的是,使用命令:

roslaunch realsense2_camera rs_camera.launch

时,并不会有弹窗,需要手动打开rviz订阅相关话题才能看到图像。

三、Aruco库安装和使用

安装aruco_ros库的时候我参考的博客:

aruco_ros使用-CSDN博客

但实际上我在编译的时候也出现了类似的问题二中的问题,联系上面的经历,我立马去换了个aruco的版本(ubuntu20对应的是noetic),下载完了即可。

四、鱼香ROS的手眼标定包

具体包的使用看:

基于ROS的机械臂手眼标定-基础使用_鱼香ros手眼标定-CSDN博客

实际上他需要开三个节点,机械臂末端位姿发布节点、aruco识别位姿发布节点和手眼标定计算节点,注意改一下话题设置、aruco码ID等配置,即可,在我上一篇的博客里面已经说明,就不多赘述了。

JAKA+aruco+realsense+眼在手外的手眼标定_jaka标定-CSDN博客

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是基于海康相机和jaka zu 3机械臂实现相机标定和手眼标定Python代码: 相机标定: ```python import cv2 import numpy as np # 定义标定板的规格 pattern_size = (7, 5) square_size = 25 # mm # 获取标定板角点的坐标 object_points = np.zeros((np.prod(pattern_size), 3), dtype=np.float32) object_points[:, :2] = np.indices(pattern_size).T.reshape(-1, 2) object_points *= square_size # 设置摄像头参数 camera_matrix = np.eye(3) dist_coeffs = np.zeros((4, 1)) # 获取标定板图像 image_files = ['image_1.jpg', 'image_2.jpg', 'image_3.jpg'] image_points = [] for file in image_files: img = cv2.imread(file) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 检测标定板角点 ret, corners = cv2.findChessboardCorners(gray, pattern_size, None) # 如果检测成功,添加角点坐标 if ret: image_points.append(corners) cv2.drawChessboardCorners(img, pattern_size, corners, ret) cv2.imshow('image', img) cv2.waitKey(500) # 进行相机标定 ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera( object_points, image_points, gray.shape[::-1], None, None) print('相机内参矩阵:\n', camera_matrix) print('畸变系数:\n', dist_coeffs) ``` 手眼标定: ```python import numpy as np import cv2 from jaka_sdk import * # 定义标定板的规格 pattern_size = (7, 5) square_size = 25 # mm # 获取标定板角点的坐标 object_points = np.zeros((np.prod(pattern_size), 3), dtype=np.float32) object_points[:, :2] = np.indices(pattern_size).T.reshape(-1, 2) object_points *= square_size # 设置相机和机械臂的变换关系 camera_to_base = np.array([ [0.707, 0.000, 0.707, 100], [0.000, 1.000, 0.000, 200], [-0.707, 0.000, 0.707, 300], [0.000, 0.000, 0.000, 1.000] ]) tool_to_flange = np.array([ [0.000, -1.000, 0.000, 0], [0.000, 0.000, -1.000, 0], [1.000, 0.000, 0.000, 100], [0.000, 0.000, 0.000, 1.000] ]) # 获取标定板图像和机械臂末端位置 image_files = ['image_1.jpg', 'image_2.jpg', 'image_3.jpg'] end_effector_poses = [] for file in image_files: img = cv2.imread(file) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 检测标定板角点 ret, corners = cv2.findChessboardCorners(gray, pattern_size, None) # 如果检测成功,添加角点坐标和机械臂末端位置 if ret: rvec, tvec = cv2.solvePnP(object_points, corners, camera_matrix, dist_coeffs) end_effector_poses.append(JakaRobot.get_forward_kinematics(tool_to_flange, rvec, tvec)) # 进行手眼标定 camera_to_end_effector = np.zeros((4, 4)) for i in range(len(end_effector_poses) - 1): A = np.linalg.inv(end_effector_poses[i]) B = end_effector_poses[i + 1] C = np.linalg.inv(camera_to_base) camera_to_end_effector += np.dot(np.dot(C, B), A) camera_to_end_effector /= len(end_effector_poses) - 1 print('相机到机械臂末端的变换矩阵:\n', camera_to_end_effector) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值