arm/User/component/arm_kinematics/arm6dof.h
2026-03-20 01:11:33 +08:00

130 lines
4.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************************
* @file arm.h
* @brief 6-DOF robotic arm kinematics control
******************************************************************************
*/
#ifndef ARM_H
#define ARM_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
/* 机器人尺寸参数结构体 */
typedef struct {
// 6个运动关节的DH参数
float theta;
float d;
float a;
float alpha;
float theta_offset;
float qmin;
float qmax;
float m; // 连杆质量 (kg)
float rc[3]; // 质心在 DH 连杆坐标系下的坐标 (m): {x, y, z}
// 由 URDF inertial/origin 经 Rz(-theta_offset) 旋转得到
} Arm6dof_DHParams_t;
typedef struct {
// MIT控制参数可选如不设置则使用默认值
float kp; // 位置刚度 (N·m/rad)默认值见Joint类
float kd; // 阻尼系数 (N·m·s/rad)默认值见Joint类
} Arm6dof_MotorMTICtrlParams_t;
typedef struct {
Arm6dof_DHParams_t DH_params[6];
Arm6dof_MotorMTICtrlParams_t motor_ctrl_params[6]; // 每个关节的MIT控制参数可选
struct {
float x, y, z; // 工具中心偏移 (m)
float roll, pitch, yaw; // 工具姿态偏移 (rad)
} tool_offset;
} Arm6dof_Params_t;
/* 末端位姿结构体 */
typedef struct {
float x, y, z; // 位置 (m)
float roll, pitch, yaw; // 姿态 (rad) - RPY欧拉角
} Arm6dof_Pose_t;
/* 关节角度结构体 */
typedef struct {
float q[6]; // 6个关节角度 (rad)
} Arm6dof_JointAngles_t;
/**
* @brief 机械臂控制类型枚举
* - REMOTE_CARTESIAN: 遥控器/PC端控制 - 目标末端位姿(笛卡尔空间)
* - CUSTOM_JOINT: 自定义控制器 - 目标六个关节角度
*/
typedef enum {
ARM_CTRL_REMOTE_CARTESIAN = 0, /* 遥控器控制 - 目标末端位姿(笛卡尔空间) */
ARM_CTRL_CUSTOM_JOINT, /* 自定义控制器 - 目标六个关节角度 */
} Arm_CtrlType_t;
/** 机械臂命令结构体 */
typedef struct {
bool enable; /* 使能开关 */
bool set_target_as_current; /* true: 将目标位姿同步为当前实际位姿 */
bool gripper_toggle; /* 夹爪状态切换置位(单帧脉冲) */
bool gripper_close; /* 夹爪目标状态true=夹紧, false=松开 */
Arm_CtrlType_t ctrl_type; /* 控制类型 */
Arm6dof_Pose_t target_pose; /* 目标末端位姿(世界坐标系,供调试观察) */
Arm6dof_JointAngles_t target_joints; /* 目标六个关节角度(自定义控制器模式) */
} Arm_CMD_t;
/**
* @brief 初始化机械臂运动学模型
* @param dh_params 6个关节的DH参数数组
* @note 必须先调用此函数再使用正/逆运动学
*/
void Arm6dof_Init(const Arm6dof_DHParams_t dh_params[6]);
/**
* @brief 正运动学:根据关节角度计算末端位姿
* @param q 输入的6个关节角度 (rad)
* @param pose 输出的末端位姿 (位置m, 姿态rad)
* @retval 0: 成功, -1: 失败(未初始化)
*/
int Arm6dof_ForwardKinematics(const Arm6dof_JointAngles_t* q, Arm6dof_Pose_t* pose);
/**
* @brief 逆运动学:根据末端位姿计算关节角度
* @param pose 输入的目标末端位姿 (位置m, 姿态rad)
* @param q_init 初始关节角度猜测值 (用于数值解迭代)
* @param q_result 输出的关节角度解 (rad)
* @param tol 收敛误差容限,位置分量单位为(m)建议0.001f(即1mm精度)
* @param max_iter 最大迭代次数默认10
* @retval 0: 成功, -1: 失败(未初始化或无解)
* @note 使用牛顿法数值求解,需要提供合理的初始猜测值
*/
int Arm6dof_InverseKinematics(const Arm6dof_Pose_t* pose, const Arm6dof_JointAngles_t* q_init,
Arm6dof_JointAngles_t* q_result, float tol, uint16_t max_iter);
/**
* @brief 获取指定关节的位姿 (用于可视化或调试)
* @param q 输入的6个关节角度 (rad)
* @param joint_num 关节编号 (1-6)
* @param pose 输出的该关节位姿
* @retval 0: 成功, -1: 失败
*/
int Arm6dof_GetJointPose(const Arm6dof_JointAngles_t* q, uint8_t joint_num, Arm6dof_Pose_t* pose);
/**
* @brief 设置机器人参数 (如果需要动态修改)
* @param params 新的机器人尺寸参数
*/
void Arm6dof_SetParams(const Arm6dof_Params_t* params);
/**
* @brief 计算重力补偿力矩(基于牛顿-欧拉逆动力学,速度和加速度为零)
* @param q 当前6个关节角度 (rad)
* @param gravity_torques 输出的6个关节重力补偿力矩 (N·mDH参数单位为m时)
* @retval 0: 成功, -1: 失败(未初始化)
*/
int Arm6dof_GravityCompensation(const Arm6dof_JointAngles_t* q, float gravity_torques[6]);
#ifdef __cplusplus
}
#endif
#endif // ARM_H