1、统一标定板坐标系和机器人坐标系
标定板坐标系z轴指向下,机器人坐标系z轴向上,并且x轴和y轴方向也不一致,外参标定之后,如何经过变换统一?
Rgba = Rx(RotX) · Ry(RotY) · Rz(RotZ)
Rabg = Rz(RotZ) · Ry(RotY) · Rx(RotX)
如果是从右往左读,就是绕着原来的坐标系旋转
如果是从左往右读,就是按照新的坐标系旋转
下面三段代码都可以达到同样效果,将图1坐标系转换到图2坐标系。
#这一段无所谓'gba'还是'abg',因为只有一个角度
create_pose (0, 0, 0, 0, 0, 90, 'Rp+T', 'gba', 'point', Pose2)
pose_compose (PoseForCalibrationPlate, Pose2, PoseComposeT)
create_pose (0, 0, 0, 180, 0, 0, 'Rp+T', 'gba', 'point', Pose3)
pose_compose (PoseComposeT, Pose3, PoseCompose)
#先绕z轴旋转90,再绕新x轴转180
create_pose (0, 0, 0, 180, 0, 90, 'Rp+T', 'abg', 'point', Pose2)
pose_compose (PoseForCalibrationPlate, Pose2, PoseCompose)
#先绕z轴旋转90,再绕原来y轴转180
create_pose (0, 0, 0, 0, 180, 90, 'Rp+T', 'gba', 'point', Pose2)
pose_compose (PoseForCalibrationPlate, Pose2, PoseCompose)
#下面的矩阵变换等价于上面两段代码
hom_mat3d_identity(HomMat3DIdent)
hom_mat3d_rotate(HomMat3DIdent, 6.28318530718/4, 'z', 0, 0, 0, HomMat3DRotZ)
hom_mat3d_rotate(HomMat3DRotZ, 0, 'x', 0, 0, 0, HomMat3DRotYZ)
hom_mat3d_rotate(HomMat3DRotYZ, 6.28318530718/2, 'y',0, 0, 0, HomMat3DXYZ)
hom_mat3d_compose (HomMat3D, HomMat3DXYZ,HomMat3DCompose)
hom_mat3d_to_pose (HomMat3DCompose, PoseCompose)
hom_mat3d_identity(HomMat3DIdent)
hom_mat3d_rotate(HomMat3DIdent, 6.28318530718/4, 'z', 0, 0, 0, HomMat3DRotZ)
hom_mat3d_rotate(HomMat3DRotZ, 6.28318530718/2, 'y', 0, 0, 0, HomMat3DRotYZ)
hom_mat3d_rotate(HomMat3DRotYZ, 0, 'x', 0, 0, 0, HomMat3DXYZ)
hom_mat3d_compose (HomMat3D, HomMat3DXYZ,HomMat3DCompose)
hom_mat3d_to_pose (HomMat3DCompose, PoseCompose)
图1 外参标定的标定板坐标系
图2 目标坐标系
2、一定要去核验机器人的工具坐标系,
3、pose_compose()
#下面是halcon例程hand_eye_stationarycam_grasp_nut.hdev中的一行代码,从这行代码我们可以看到,在变换中,把初始pose放在左边,把变换pose放在右边。
pose_compose (CamInBasePose, GripperInCamPose, GripperInBasePose)
#同理hom_mat3d_compose 也是一样
hom_mat3d_compose (base_H_cam, cam_H_grasp, base_H_grasp)
4、create_pose 'abg'和‘gba’
5、机器人pose和halcon pose转换的问题