我有一台固定在云台上的相机,我想要知道这个相机相对安装平台的旋转和平移量。其中云台是固定不动的,只有 pitch 、yaw 、和 roll 轴的运动。查了一下应该是用这个函数:
void calibrateHandEye(
InputArrayOfArrays R_gripper2base, // 云台 p y r 角度转换出来的旋转矩阵
InputArrayOfArrays t_gripper2base, // 输入的是 0 ,因为没有任何移动(并且想用云台平台当世界坐标中心点)
InputArrayOfArrays R_target2cam, // calibrateCamera 输出的 rvec
InputArrayOfArrays t_target2cam, // calibrateCamera 输出的 tvec
OutputArray R_cam2gripper,
OutputArray t_cam2gripper,
HandEyeCalibrationMethod method = CALIB_HAND_EYE_TSAI)
我现在是这样做的:
但是结果和实际相差巨大。因此想来 V 站看看有没有人有过这方面经验,能看出我的步骤里可能有什么问题……先在这里谢过各位了!
我个人感觉比较容易出问题的地方是第三步的转换,我是这样写的:
Eigen::Quaternionf euler2quaternionf(const float z, const float y, const float x)
{
const float cos_z = cos(z * 0.5f), sin_z = sin(z * 0.5f),
cos_y = cos(y * 0.5f), sin_y = sin(y * 0.5f),
cos_x = cos(x * 0.5f), sin_x = sin(x * 0.5f);
Eigen::Quaternionf quaternion(
cos_z * cos_y * cos_x + sin_z * sin_y * sin_x,
cos_z * cos_y * sin_x - sin_z * sin_y * cos_x,
sin_z * cos_y * sin_x + cos_z * sin_y * cos_x,
sin_z * cos_y * cos_x - cos_z * sin_y * sin_x
);
return quaternion;
}
先转换为四元数,再求旋转矩阵(用 Eigen 自带的方法)。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.