170 lines
8.0 KiB
C
170 lines
8.0 KiB
C
|
|
#ifndef COORDINATE_TRANSFORM_H
|
|||
|
|
#define COORDINATE_TRANSFORM_H
|
|||
|
|
|
|||
|
|
#include "CoordinateTypes.h"
|
|||
|
|
|
|||
|
|
namespace CCoordinateTransform
|
|||
|
|
{
|
|||
|
|
// ==================== 欧拉角与四元数互转 ====================
|
|||
|
|
|
|||
|
|
/// 欧拉角转四元数
|
|||
|
|
/// @param euler 欧拉角 (弧度制)
|
|||
|
|
/// @return 归一化的四元数
|
|||
|
|
CTQuaternionD eulerToQuaternion(const CTEulerAngles& euler);
|
|||
|
|
|
|||
|
|
/// 四元数转欧拉角
|
|||
|
|
/// @param q 四元数 (会自动归一化)
|
|||
|
|
/// @param order 欧拉角顺序
|
|||
|
|
/// @return 欧拉角 (弧度制)
|
|||
|
|
CTEulerAngles quaternionToEuler(const CTQuaternionD& q, CTEulerOrder order = CTEulerOrder::ZYX);
|
|||
|
|
|
|||
|
|
// ==================== 旋转矩阵与欧拉角互转 ====================
|
|||
|
|
|
|||
|
|
/// 欧拉角转旋转矩阵
|
|||
|
|
/// @param euler 欧拉角 (弧度制)
|
|||
|
|
/// @return 3x3旋转矩阵
|
|||
|
|
CTRotationMatrix eulerToRotationMatrix(const CTEulerAngles& euler);
|
|||
|
|
|
|||
|
|
/// 旋转矩阵转欧拉角
|
|||
|
|
/// @param R 3x3旋转矩阵
|
|||
|
|
/// @param order 欧拉角顺序
|
|||
|
|
/// @return 欧拉角 (弧度制)
|
|||
|
|
CTEulerAngles rotationMatrixToEuler(const CTRotationMatrix& R, CTEulerOrder order = CTEulerOrder::ZYX);
|
|||
|
|
|
|||
|
|
// ==================== 旋转矩阵与四元数互转 ====================
|
|||
|
|
|
|||
|
|
/// 四元数转旋转矩阵
|
|||
|
|
/// @param q 四元数
|
|||
|
|
/// @return 3x3旋转矩阵
|
|||
|
|
CTRotationMatrix quaternionToRotationMatrix(const CTQuaternionD& q);
|
|||
|
|
|
|||
|
|
/// 旋转矩阵转四元数
|
|||
|
|
/// @param R 3x3旋转矩阵
|
|||
|
|
/// @return 归一化的四元数
|
|||
|
|
CTQuaternionD rotationMatrixToQuaternion(const CTRotationMatrix& R);
|
|||
|
|
|
|||
|
|
// ==================== 三轴手眼转换 ====================
|
|||
|
|
|
|||
|
|
/// 三轴手眼转换:相机坐标 -> 机器人坐标
|
|||
|
|
/// 适用于三轴龙门架等只有XYZ平移和Z轴旋转的设备
|
|||
|
|
/// @param cameraPt 相机坐标系下的点
|
|||
|
|
/// @param robotPose 机器人当前位姿 (XYZ + Rz)
|
|||
|
|
/// @param handEye 三轴手眼标定矩阵
|
|||
|
|
/// @return 机器人基坐标系下的点
|
|||
|
|
CTVec3D threeAxisCameraToRobot(const CTVec3D& cameraPt,
|
|||
|
|
const CTRobotPose& robotPose,
|
|||
|
|
const CTThreeAxisCalibResult& handEye);
|
|||
|
|
|
|||
|
|
/// 三轴手眼转换:机器人坐标 -> 相机坐标
|
|||
|
|
/// @param robotPt 机器人基坐标系下的点
|
|||
|
|
/// @param robotPose 机器人当前位姿 (XYZ + Rz)
|
|||
|
|
/// @param handEye 三轴手眼标定矩阵
|
|||
|
|
/// @return 相机坐标系下的点
|
|||
|
|
CTVec3D threeAxisRobotToCamera(const CTVec3D& robotPt,
|
|||
|
|
const CTRobotPose& robotPose,
|
|||
|
|
const CTThreeAxisCalibResult& handEye);
|
|||
|
|
|
|||
|
|
/// 三轴手眼转换:计算抓取位姿
|
|||
|
|
/// @param cameraPt 相机坐标系下的目标点
|
|||
|
|
/// @param cameraAngle 相机坐标系下的目标角度 (弧度)
|
|||
|
|
/// @param robotPose 机器人当前位姿
|
|||
|
|
/// @param handEye 三轴手眼标定矩阵
|
|||
|
|
/// @param[out] targetPose 输出的目标抓取位姿
|
|||
|
|
void threeAxisCalcGraspPose(const CTVec3D& cameraPt,
|
|||
|
|
double cameraAngle,
|
|||
|
|
const CTRobotPose& robotPose,
|
|||
|
|
const CTThreeAxisCalibResult& handEye,
|
|||
|
|
CTRobotPose& targetPose);
|
|||
|
|
|
|||
|
|
// ==================== 六轴手眼转换 ====================
|
|||
|
|
|
|||
|
|
/// 六轴手眼转换 (Eye-in-Hand):相机坐标 -> 机器人坐标
|
|||
|
|
/// 相机安装在机器人末端执行器上
|
|||
|
|
/// @param cameraPt 相机坐标系下的点
|
|||
|
|
/// @param robotPose 机器人当前位姿 (完整6轴)
|
|||
|
|
/// @param handEye 六轴手眼标定矩阵 (相机到末端执行器)
|
|||
|
|
/// @return 机器人基坐标系下的点
|
|||
|
|
CTVec3D sixAxisEyeInHandCameraToRobot(const CTVec3D& cameraPt,
|
|||
|
|
const CTRobotPose& robotPose,
|
|||
|
|
const CTSixAxisCalibResult& handEye);
|
|||
|
|
|
|||
|
|
/// 六轴手眼转换 (Eye-in-Hand):机器人坐标 -> 相机坐标
|
|||
|
|
/// @param robotPt 机器人基坐标系下的点
|
|||
|
|
/// @param robotPose 机器人当前位姿
|
|||
|
|
/// @param handEye 六轴手眼标定矩阵
|
|||
|
|
/// @return 相机坐标系下的点
|
|||
|
|
CTVec3D sixAxisEyeInHandRobotToCamera(const CTVec3D& robotPt,
|
|||
|
|
const CTRobotPose& robotPose,
|
|||
|
|
const CTSixAxisCalibResult& handEye);
|
|||
|
|
|
|||
|
|
/// 六轴手眼转换 (Eye-to-Hand):相机坐标 -> 机器人坐标
|
|||
|
|
/// 相机固定在外部,观察机器人工作空间
|
|||
|
|
/// @param cameraPt 相机坐标系下的点
|
|||
|
|
/// @param cameraToBase 相机到机器人基座的标定矩阵
|
|||
|
|
/// @return 机器人基坐标系下的点
|
|||
|
|
CTVec3D sixAxisEyeToHandCameraToRobot(const CTVec3D& cameraPt,
|
|||
|
|
const CTSixAxisCalibResult& cameraToBase);
|
|||
|
|
|
|||
|
|
/// 六轴手眼转换 (Eye-to-Hand):相机坐标 -> 机器人坐标 (直接使用齐次矩阵)
|
|||
|
|
/// @param cameraPt 相机坐标系下的点
|
|||
|
|
/// @param cameraToBaseMatrix 相机到机器人基座的4x4齐次变换矩阵
|
|||
|
|
/// @return 机器人基坐标系下的点
|
|||
|
|
CTVec3D sixAxisEyeToHandCameraToRobot(const CTVec3D& cameraPt,
|
|||
|
|
const CTHomogeneousMatrix& cameraToBaseMatrix);
|
|||
|
|
|
|||
|
|
/// 六轴手眼转换 (Eye-to-Hand):机器人坐标 -> 相机坐标
|
|||
|
|
/// @param robotPt 机器人基坐标系下的点
|
|||
|
|
/// @param cameraToBase 相机到机器人基座的标定矩阵
|
|||
|
|
/// @return 相机坐标系下的点
|
|||
|
|
CTVec3D sixAxisEyeToHandRobotToCamera(const CTVec3D& robotPt,
|
|||
|
|
const CTSixAxisCalibResult& cameraToBase);
|
|||
|
|
|
|||
|
|
/// 六轴手眼转换:计算抓取位姿 (Eye-in-Hand)
|
|||
|
|
/// @param cameraPose 相机坐标系下的目标位姿
|
|||
|
|
/// @param robotPose 机器人当前位姿
|
|||
|
|
/// @param handEye 六轴手眼标定矩阵
|
|||
|
|
/// @param[out] targetPose 输出的目标抓取位姿
|
|||
|
|
void sixAxisEyeInHandCalcGraspPose(const CTCameraPose& cameraPose,
|
|||
|
|
const CTRobotPose& robotPose,
|
|||
|
|
const CTSixAxisCalibResult& handEye,
|
|||
|
|
CTRobotPose& targetPose);
|
|||
|
|
|
|||
|
|
/// 六轴手眼转换:计算抓取位姿 (Eye-to-Hand)
|
|||
|
|
/// @param cameraPose 相机坐标系下的目标位姿
|
|||
|
|
/// @param cameraToBase 相机到机器人基座的标定矩阵
|
|||
|
|
/// @param[out] targetPose 输出的目标抓取位姿
|
|||
|
|
void sixAxisEyeToHandCalcGraspPose(const CTCameraPose& cameraPose,
|
|||
|
|
const CTSixAxisCalibResult& cameraToBase,
|
|||
|
|
CTRobotPose& targetPose);
|
|||
|
|
|
|||
|
|
/// 六轴手眼转换:计算抓取位姿 (Eye-to-Hand) - 直接使用齐次矩阵
|
|||
|
|
/// @param cameraPose 相机坐标系下的目标位姿
|
|||
|
|
/// @param cameraToBaseMatrix 相机到机器人基座的4x4齐次变换矩阵
|
|||
|
|
/// @param eulerOrder 输出欧拉角的顺序 (默认XYZ,对应外旋ZYX即RZ-RY-RX)
|
|||
|
|
/// @param[out] targetPose 输出的目标抓取位姿
|
|||
|
|
void sixAxisEyeToHandCalcGraspPose(const CTCameraPose& cameraPose,
|
|||
|
|
const CTHomogeneousMatrix& cameraToBaseMatrix,
|
|||
|
|
CTEulerOrder eulerOrder,
|
|||
|
|
CTRobotPose& targetPose);
|
|||
|
|
|
|||
|
|
// ==================== 辅助函数 ====================
|
|||
|
|
|
|||
|
|
/// 角度转弧度
|
|||
|
|
inline double degToRad(double deg) { return deg * M_PI / 180.0; }
|
|||
|
|
|
|||
|
|
/// 弧度转角度
|
|||
|
|
inline double radToDeg(double rad) { return rad * 180.0 / M_PI; }
|
|||
|
|
|
|||
|
|
/// 归一化角度到 [-π, π]
|
|||
|
|
double normalizeAngle(double angle);
|
|||
|
|
|
|||
|
|
/// 计算两个四元数之间的角度差 (弧度)
|
|||
|
|
double quaternionAngleDiff(const CTQuaternionD& q1, const CTQuaternionD& q2);
|
|||
|
|
|
|||
|
|
/// 四元数球面线性插值 (SLERP)
|
|||
|
|
CTQuaternionD quaternionSlerp(const CTQuaternionD& q1, const CTQuaternionD& q2, double t);
|
|||
|
|
|
|||
|
|
} // namespace CCoordinateTransform
|
|||
|
|
|
|||
|
|
#endif // COORDINATE_TRANSFORM_H
|