手眼标定算法TSAI_LENZ,眼在手外python代码实现

本文介绍了如何使用Python实现手眼标定算法TSAI_LENZ,特别是在手在眼外的情况。通过提供手部和相机的旋转和平移参数,计算出相机相对于机械臂基座的位姿。代码中包含了矩阵运算、欧拉角转换、四元数等关键步骤,适合机器人和计算机视觉领域的读者参考。
摘要由CSDN通过智能技术生成

手眼标定算法TSAI_LENZ,眼在手外python代码实现(未整理)

大家好,我是小智,今天来给大家看一看手在眼外的代码实现。


#!/usr/bin/env python
# coding: utf-8
import transforms3d as tfs
import numpy as np
import math

def get_matrix_eular_radu(x,y,z,rx,ry,rz):
    rmat = tfs.euler.euler2mat(math.radians(rx),math.radians(ry),math.radians(rz))
    rmat = tfs.affines.compose(np.squeeze(np.asarray((x,y,z))), rmat, [1, 1, 1])
    return rmat
def skew(v):
    return np.array([[0,-v[2],v[1]],
                     [v[2],0,-v[0]],
                     [-v[1],v[0],0]])
def rot2quat_minimal(m):
    quat =  tfs.quaternions.mat2quat(m[0:3,0:3])
    return quat[1:]
    
def quatMinimal2rot(q):
    p = np.dot(q.T,q)
    w = np.sqrt(np.subtract(1,p[0][0]))
    return tfs.quaternions.quat2mat([w,q[0],q[1],q[2]])
    
def matrix_to_eular(m):
    rx,ry,rz = tfs.euler.mat2euler(m[0:3,0:3])
    pos = np.squeeze(m[0:3,3:4])
    return (pos,math.degrees(rx),math.degrees(ry),math.degrees(rz))

hand = [1.1988093940033604, -0.42405585264804424, 0.18828251788562061, 151.3390418721659, -18.612399542280507, 153.05074895025035,
        1.1684831621733476, -0.183273375514656, 0.12744868246620855, -161.57083804238462, 9.07159838346732, 89.1641128844487,
        1.1508343174145468, -0.22694301453461405, 0.26625166858469146, 177.8815855486261, 0.8991159570568988, 77.67286224959672]

camera = [-0.15656406,  0.39817136, -0.10895333, -30.001924122750374, -51.27397651897898, 133.8490357494246,
          -0.06447235,  0.3331049 ,  0.04547163, -100.40095519488565, -3.6171481205571285, -161.84865899823535,
          -0.0781028 ,  0.46670983,  0.00937285, -90.85557233822718, 4.779633769278795, 178.99700438780516]

Hgs,Hcs = [],[]
for i in range(0,len(hand),6):
    Hgs.append(get_matrix_eular_radu(hand[i],hand[i+1],hand[i+2],hand[i+3],hand[i+4],hand[i+5])) 
    
    m = get_matrix_eular_radu(camera[i],camera[i+1],camera[i+2],camera[i+3],camera[i+4],camera[i+5])
    m = np.linalg.inv(m)
    Hcs.append(m)
Hgijs = []
Hcijs = []
A = []
B = []
size = 0
for i in range(len(Hgs)):
    for j in range(i+1,len(Hgs)):
        size += 1
        Hgij = np.dot(np.linalg.inv(Hgs[j]),Hgs[i])
        Hgijs.append(Hgij)
        Pgij = np.dot(2,rot2quat_minimal(Hgij))
        
        Hcij = np.dot(Hcs[j],np.linalg.inv(Hcs[i]))
        Hcijs.append(Hcij)
        Pcij = np.dot(2,rot2quat_minimal(Hcij))
        
        A.append(skew(np.add(Pgij,Pcij)))
        B.append(np.subtract(Pcij,Pgij))
MA = np.asarray(A).reshape(size*3,3)
MB = np.asarray(B).reshape(size*3,1)
Pcg_  =  np.dot(np.linalg.pinv(MA),MB)
pcg_norm = np.dot(np.conjugate(Pcg_).T,Pcg_)
Pcg = np.sqrt(np.add(1,np.dot(Pcg_.T,Pcg_)))
Pcg = np.dot(np.dot(2,Pcg_),np.linalg.inv(Pcg))
Rcg = quatMinimal2rot(np.divide(Pcg,2)).reshape(3,3)

A = []
B = []
id = 0
for i in range(len(Hgs)):
    for j in range(i+1,len(Hgs)):
        Hgij = Hgijs[id]
        Hcij = Hcijs[id]
        A.append(np.subtract(Hgij[0:3,0:3],np.eye(3,3)))
        B.append(np.subtract(np.dot(Rcg,Hcij[0:3,3:4]),Hgij[0:3,3:4]))
        id += 1

MA = np.asarray(A).reshape(size*3,3)
MB = np.asarray(B).reshape(size*3,1)
Tcg = np.dot(np.linalg.pinv(MA),MB).reshape(3,)
#标记物在机械臂末端的位姿
marker_in_hand = tfs.affines.compose(Tcg,np.squeeze(Rcg),[1,1,1]) 

#手在眼外,标定机器人基座和相机之间的位置,这样我们就可以通过 标记物在相机的位置,相机在机械臂基坐标系的位置,求得物品在机械臂基坐标的位置
hand_in_marker = np.linalg.inv(marker_in_hand)
for i in range(len(Hgs)):
    marker_in_camera = np.linalg.inv(Hcs[i])
    base_in_hand = np.linalg.inv(Hgs[i])
    
    hand_in_camera = np.dot(marker_in_camera,hand_in_marker)
    base_in_camera = np.dot(hand_in_camera,base_in_hand)
    camera_in_base = np.linalg.inv(base_in_camera)
    print(camera_in_base)
#这里会输出多组数据,可以求一下均值
#这里求得的数据是相机在机械臂基坐标系中的位姿
作者介绍:

我是小鱼,机器人领域资深玩家,现深圳某独脚兽机器人算法工程师一枚

初中学习编程,高中开始学习机器人,大学期间打机器人相关比赛实现月入2W+(比赛奖金)

目前在输出机器人学习指南、论文注解、工作经验,欢迎大家关注小智,一起交流技术,学习机器人
在这里插入图片描述

  • 6
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
手眼标定通常需要使用机器视觉库和机器人控制库,比较复杂。以下是一个基本的手眼标定代码框架,需要根据具体情况进行修改和完善。 ```python import cv2 import numpy as np import robot_control_library as rcl # 机器人控制库 # 机器人运动和图像采集函数定义 def move_robot_to_pos(pos): # 将机器人移动到指定位置 pass def capture_image(): # 采集图像 pass # 标定相关参数定义 image_points = [] # 图像坐标点集 world_points = [] # 世界坐标点集 K = np.zeros((3, 3)) # 相机内参矩阵 D = np.zeros((1, 5)) # 畸变系数 R = np.zeros((3, 3)) # 旋转矩阵 T = np.zeros((3, 1)) # 平移向量 # 手眼标定函数定义 def hand_eye_calibration(image_points, world_points): # 手眼标定相关代码 pass # 主程序 if __name__ == '__main__': # 采集图像和运动机器人,生成图像坐标点集和世界坐标点集 for i in range(num_samples): move_robot_to_pos(pos[i]) image = capture_image() image_points.append(image_corners) world_points.append(world_corners) # 手眼标定,获取相机内参、畸变系数、旋转矩阵和平移向量等参数 K, D, R, T = hand_eye_calibration(image_points, world_points) # 将相机内参、畸变系数、旋转矩阵和平移向量保存到文件中,以备后续使用 np.savetxt('K.txt', K) np.savetxt('D.txt', D) np.savetxt('R.txt', R) np.savetxt('T.txt', T) ``` 注意,以上代码仅为一个基本的手眼标定代码框架,具体实现还需要根据具体情况进行修改和完善。
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值