Files
hivecore_robot_arm/include/rm_define.h
2025-10-24 11:12:14 +08:00

1035 lines
41 KiB
C
Raw Permalink 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.

#ifndef RM_DEFINE_H
#define RM_DEFINE_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stdbool.h>
#include <stdarg.h>
#define ARM_DOF 7
#define M_PI 3.14159265358979323846
#define RM_MOVE_NBLOCK 0 ///<机械臂运动设置,非阻塞模式
#define RM_MOVE_MULTI_BLOCK 1 ///<机械臂运动设置,多线程阻塞模式
static inline int RM_MOVE_SINGLE_BLOCK(int timeout){return timeout;} ///<机械臂运动设置,单线程阻塞模式超时时间
/**
* @brief 线程模式
* @ingroup Init_Class
*/
typedef enum {
RM_SINGLE_MODE_E, ///< 单线程模式,单线程非阻塞等待数据返回
RM_DUAL_MODE_E, ///< 双线程模式,增加接收线程监测队列中的数据
RM_TRIPLE_MODE_E, ///< 三线程模式在双线程模式基础上增加线程监测UDP接口数据
}rm_thread_mode_e;
/**
* @brief 机械臂型号
*/
typedef enum{
RM_MODEL_RM_65_E, ///< RM_65
RM_MODEL_RM_75_E, ///< RM_75
RM_MODEL_RM_63_I_E, ///< RML_63I(已弃用)
RM_MODEL_RM_63_II_E, ///< RML_63II
RM_MODEL_RM_63_III_E, ///< RML_63III
RM_MODEL_ECO_65_E, ///< ECO_65
RM_MODEL_ECO_62_E, ///< ECO_62
RM_MODEL_GEN_72_E, ///< GEN_72
RM_MODEL_ECO_63_E, ///< ECO63
RM_MODEL_UNIVERSAL_E, ///< 通用型
RM_MODEL_ZM7L_E, ///< ZM7L,
RM_MODEL_ZM7R_E, ///< ZM7R,
RM_MODEL_RXL75_E, ///< 人型机器人左臂
RM_MODEL_RXR75_E, ///< 人型机器人右臂
}rm_robot_arm_model_e;
/**
* @brief 机械臂末端力传感器版本
* @ingroup Algo
*/
typedef enum{
RM_MODEL_RM_B_E, ///< 标准版
RM_MODEL_RM_ZF_E, ///< 一维力版
RM_MODEL_RM_SF_E, ///< 六维力版
RM_MODEL_RM_ISF_E, ///< 一体化六维力版
}rm_force_type_e;
/**
* @brief 事件类型
* @ingroup Init_Class
*/
typedef enum
{
RM_NONE_EVENT_E, ///< 无事件
RM_CURRENT_TRAJECTORY_STATE_E, ///< 当前轨迹到位
RM_PROGRAM_RUN_FINISH_E, ///< 在线编程运行结束
} rm_event_type_e;
/**
* @brief 事件信息
* @ingroup Init_Class
*/
typedef struct
{
int handle_id; ///< 返回消息的机械臂id
rm_event_type_e event_type; ///< 事件类型,包含无事件、当前轨迹到位、在线编程运行结束
bool trajectory_state; ///< 当前轨迹到位状态
int device; ///< 到位设备0关节 1夹爪 2灵巧手 3升降机构 4扩展关节 其他:保留
int trajectory_connect; ///< 是否连接下一条轨迹0全部到位1连接下一条轨迹
int program_id; ///< 运行结束的在线编程程序id
}rm_event_push_data_t;
/**
* @brief 机械臂当前规划类型
*
*/
typedef enum
{
RM_NO_PLANNING_E, ///< 无规划
RM_JOINT_SPACE_PLANNING_E, ///< 关节空间规划
RM_CARTESIAN_LINEAR_PLANNING_E, ///< 笛卡尔空间直线规划
RM_CARTESIAN_ARC_PLANNING_E, ///< 笛卡尔空间圆弧规划
RM_SPLINE_CURVE_MOTION_PLANNING_E, ///< 样条曲线运动规划
RM_TRAJECTORY_REPLAY_PLANNING_E, ///< 示教轨迹复现规划
}rm_arm_current_trajectory_e;
typedef struct
{
int joint_speed; ///< 关节速度。
int lift_state; ///< 升降关节信息。1上报0关闭上报-1不设置保持之前的状态
int expand_state; ///< 扩展关节信息升降关节和扩展关节为二选一优先显示升降关节1上报0关闭上报-1不设置保持之前的状态
int hand_state; ///< 灵巧手状态。1上报0关闭上报-1不设置保持之前的状态(1.7.0版本无这个)
int arm_current_status; ///< 机械臂当前状态。1上报0关闭上报-1不设置保持之前的状态
int aloha_state; ///< aloha主臂状态是否上报。1上报0关闭上报-1不设置保持之前的状态
int plus_base; ///< 末端设备基础信息。1上报0关闭上报-1不设置保持之前的状态
int plus_state; ///< 末端设备实时信息。1上报0关闭上报-1不设置保持之前的状态
}rm_udp_custom_config_t;
/**
* @brief 机械臂主动上报接口配置
* @ingroup UdpConfig
*/
typedef struct {
int cycle; ///< 广播周期5ms的倍数
bool enable; ///< 使能,是否主动上报
int port; ///< 广播的端口号
int force_coordinate; ///< 系统外受力数据的坐标系,-1不支持力传感器 0为传感器坐标系 1为当前工作坐标系 2为当前工具坐标系
char ip[28]; ///< 自定义的上报目标IP地址
rm_udp_custom_config_t custom_config; ///< 自定义项内容
} rm_realtime_push_config_t;
/**
* @brief 四元数
*
*/
typedef struct
{
float w;
float x;
float y;
float z;
} rm_quat_t;
/**
* @brief 位置坐标
*
*/
typedef struct
{
float x; //* unit: m
float y;
float z;
} rm_position_t;
/**
* @brief 欧拉角
*
*/
typedef struct
{
float rx; //* unit: rad
float ry;
float rz;
} rm_euler_t;
/**
* @brief 机械臂位置姿态结构体
* @ingroup Algo
*/
typedef struct
{
rm_position_t position; ///< 位置单位m
rm_quat_t quaternion; ///< 四元数
rm_euler_t euler; ///< 欧拉角单位rad
}rm_pose_t;
/**
* @brief 坐标系名称
* 不超过10个字符
* @ingroup ToolCoordinateConfig
* @ingroup WorkCoordinateConfig
*/
typedef struct
{
char name[12];
}rm_frame_name_t;
/**
* @brief 坐标系
* @ingroup Algo
* @ingroup ToolCoordinateConfig
* @ingroup WorkCoordinateConfig
*/
typedef struct
{
char frame_name[12]; ///< 坐标系名称
rm_pose_t pose; ///< 坐标系位姿
float payload; ///< 坐标系末端负载重量单位kg
float x; ///< 坐标系末端负载质心位置单位mm
float y; ///< 坐标系末端负载质心位置单位mm
float z; ///< 坐标系末端负载质心位置单位mm
}rm_frame_t;
typedef struct{
char build_time[20]; ///< 编译时间
char version[20]; ///< 版本号
}rm_ctrl_version_t;
typedef struct{
char model_version[5]; ///< 动力学模型版本号
}rm_dynamic_version_t;
typedef struct{
char build_time[20]; ///<编译时间
char version[20]; ///< 版本号
}rm_planinfo_t;
typedef struct {
char version[20]; ///< 算法库版本号
}rm_algorithm_version_t;
typedef struct {
char build_time[20]; ///<编译时间
char version[20]; ///< 版本号
}rm_software_build_info_t;
/**
* @brief 机械臂软件信息
*
*/
typedef struct
{
char product_version[20]; ///< 机械臂型号
char robot_controller_version[10]; ///< 机械臂控制器版本,若为四代控制器,则该字段为"4.0"
rm_algorithm_version_t algorithm_info; ///< 算法库信息
rm_software_build_info_t ctrl_info; ///< ctrl 层软件信息
rm_dynamic_version_t dynamic_info; ///< 动力学版本(三代)
rm_software_build_info_t plan_info; ///< plan 层软件信息(三代)
rm_software_build_info_t com_info; ///< communication 模块软件信息(四代)
rm_software_build_info_t program_info; ///< 流程图编程模块软件信息(四代)
}rm_arm_software_version_t;
/**
* @brief 错误代码结构体
*
*/
typedef struct
{
uint8_t err_len; ///< 错误代码个数
int err[24]; ///< 错误代码数组
}rm_err_t;
/**
* @brief 机械臂当前状态
*
*/
typedef struct
{
rm_pose_t pose; ///< 机械臂当前位姿
float joint[ARM_DOF]; ///< 机械臂当前关节角度
rm_err_t err;
}rm_current_arm_state_t;
/**
* @brief 机械臂关节状态参数
*
*/
typedef struct
{
float joint_current[ARM_DOF]; ///< 关节电流单位mA精度0.001mA
bool joint_en_flag[ARM_DOF]; ///< 当前关节使能状态 1为上使能0为掉使能
uint16_t joint_err_code[ARM_DOF]; ///< 当前关节错误码
float joint_position[ARM_DOF]; ///< 关节角度单位°精度0.001°
float joint_temperature[ARM_DOF]; ///< 当前关节温度精度0.001℃
float joint_voltage[ARM_DOF]; ///< 当前关节电压精度0.001V
float joint_speed[ARM_DOF]; ///< 当前关节速度精度0.01RPM。
}rm_joint_status_t;
/**
* @brief 位置示教方向
*
*/
typedef enum
{
RM_X_DIR_E, ///< 位置示教x轴方向
RM_Y_DIR_E, ///< 位置示教y轴方向
RM_Z_DIR_E, ///< 位置示教z轴方向
}rm_pos_teach_type_e;
/**
* @brief 姿态示教方向
*
*/
typedef enum
{
RM_RX_ROTATE_E, ///< 姿态示教绕x轴旋转
RM_RY_ROTATE_E, ///< 姿态示教绕y轴旋转
RM_RZ_ROTATE_E, ///< 姿态示教绕z轴旋转
}rm_ort_teach_type_e;
/**
* @brief 数字IO配置结构体
* io_mode:模式0-通用输入模式、1-通用输出模式、2-输入开始功能复用模式、3-输入暂停功能复用模式、
* 4-输入继续功能复用模式、5-输入急停功能复用模式、6-输入进入电流环拖动复用模式
* 7-输入进入力只动位置拖动模式六维力版本可配置、8-输入进入力只动姿态拖动模式(六维力版本可配置)
* 9-输入进入力位姿结合拖动复用模式六维力版本可配置、10-输入外部轴最大软限位复用模式(外部轴模式可配置)
* 11-输入外部轴最小软限位复用模式外部轴模式可配置、12-输入初始位姿功能复用模式
* 13-输出碰撞功能复用模式、14-实时调速功能复用模式
* io_state:数字io状态0低 1高该成员在set时无效
* io_real_time_config_t:实时调速功能io配置
* speed:速度取值范围0-100 (当io_mode不为14时默认值为-1)
* mode :模式取值范围1或2 (当io_mode不为14时默认值为-1)
* 1表示单次触发模式单次触发模式下当IO拉低速度设置为speed参数值IO恢复高电平速度设置为初始值
* 2表示连续触发模式连续触发模式下IO拉低速度设置为speed参数值IO恢复高电平速度维持当前值
*/
typedef struct
{
int io_mode; // io_mode:模式0~14
struct
{
int speed; // speed:速度取值范围0-100
int mode; // mode :模式取值范围1或2
}io_real_time_config_t;
}rm_io_config_t;
/**
* @brief 数字IO状态获取结构体
* io_state:数字io状态0低 1高该成员在set时无效
* io_config:io配置结构体
*/
typedef struct
{
int io_state; // io_state:数字io状态0低 1高
rm_io_config_t io_config; // io_config:数字io配置结构体
}rm_io_get_t;
/**
* @brief 复合模式拖动示教参数
*
*/
typedef struct{
int free_axes[6]; ///< 自由驱动方向[x,y,z,rx,ry,rz]0-在参考坐标系对应方向轴上不可拖动1-在参考坐标系对应方向轴上可拖动
int frame; ///< 参考坐标系0-工作坐标系 1-工具坐标系。
int singular_wall; ///< 仅在六维力模式拖动示教中生效用于指定是否开启拖动奇异墙0表示关闭拖动奇异墙1表示开启拖动奇异墙若无配置参数默认启动拖动奇异墙
}rm_multi_drag_teach_t;
/**
* @brief 力位混合控制传感器枚举
*
*/
typedef enum{
RM_FP_OF_SENSOR_E = 0, ///<一维力
RM_FP_SF_SENSOR_E, ///<六维力
}rm_force_position_sensor_e;
/**
* @brief 力位混合控制模式枚举
*
*/
typedef enum{
RM_FP_BASE_COORDINATE_E = 0, ///<基坐标系力控
RM_FP_TOOL_COORDINATE_E, ///<工具坐标系力控
}rm_force_position_mode_e;
/**
* @brief 力位混合控制模式(单方向)力控方向枚举
*
*/
typedef enum{
RM_FP_X_E = 0, ///<沿X轴
RM_FP_Y_E, ///<沿Y轴
RM_FP_Z_E, ///<沿Z轴
RM_FP_RX_E, ///<沿RX姿态方向
RM_FP_RY_E, ///<沿RY姿态方向
RM_FP_RZ_E, ///<沿RZ姿态方向
}rm_force_position_dir_e;
/**
* @brief 力位混合控制参数
*
*/
typedef struct
{
int sensor; ///< 传感器0-一维力1-六维力
int mode; ///< 0-基坐标系力控1-工具坐标系力控;
int control_mode[6]; ///< 6个力控方向Fx Fy Fz Mx My Mz的模式 0-固定模式 1-浮动模式 2-弹簧模式 3-运动模 4-力跟踪模式 8-力跟踪+姿态自适应模式
float desired_force[6]; ///< 力控轴维持的期望力/力矩,力控轴的力控模式为力跟踪模式时,期望力/力矩设置才会生效 精度0.1N。
float limit_vel[6]; ///< 力控轴的最大线速度和最大角速度限制,只对开启力控方向生效。
}rm_force_position_t;
/**
* @brief 透传力位混合补偿参数
* 建议初始化方式,避免一些未知错误
* rm_force_position_move_t my_fp_move = (rm_force_position_move_t){ 0 };
*/
typedef struct
{
int flag; ///< 0-下发目标角度1-下发目标位姿
rm_pose_t pose; ///< 当前坐标系下的目标位姿,支持四元数/欧拉角表示姿态。位置精度0.001mm欧拉角表示姿态姿态精度0.001rad四元数方式表示姿态姿态精度0.000001
float joint[ARM_DOF]; ///< 目标关节角度单位°精度0.001°
int sensor; ///< 传感器0-一维力1-六维力
int mode; ///< 0-基坐标系力控1-工具坐标系力控;
bool follow; ///< 表示驱动器的运动跟随效果true 为高跟随false 为低跟随。
int control_mode[6]; ///< 6个力控方向的模式 0-固定模式 1-浮动模式 2-弹簧模式 3-运动模式 4-力跟踪模式 5-浮动+运动模式 6-弹簧+运动模式 7-力跟踪+运动模式 8-姿态自适应模式
float desired_force[6]; ///< 力控轴维持的期望力/力矩,力控轴的力控模式为力跟踪模式时,期望力/力矩设置才会生效 精度0.1N。
float limit_vel[6]; ///< 力控轴的最大线速度和最大角速度限制,只对开启力控方向生效。
int trajectory_mode; ///< 高跟随模式下0-完全透传模式、1-曲线拟合模式、2-滤波模式
int radio; ///< 曲线拟合模式0-100和滤波模式下的平滑系数数值越大效果越好滤波模式下取值范围0~1000曲线拟合模式下取值范围0~100
}rm_force_position_move_t;
/**
* @brief 角度透传模式结构体
* 建议初始化方式,避免一些未知错误
* rm_movej_canfd_mode_t my_j_canfd = (rm_movej_canfd_mode_t){ 0 };
*/
typedef struct
{
float* joint; // 关节角度(若为六轴机械臂,那么最后一个元素无效),单位°
float expand; // 扩展关节角度(若没有扩展关节,那么此成员值无效)
bool follow; // 跟随模式0-低跟随1-高跟随,若使用高跟随,透传周期要求不超过 10ms
int trajectory_mode; // 高跟随模式下0-完全透传模式、1-曲线拟合模式、2-滤波模式
int radio; // 曲线拟合模式和滤波模式下的平滑系数数值越大效果越好滤波模式下取值范围0~1000曲线拟合模式下取值范围0~100
}rm_movej_canfd_mode_t;
/**
* @brief 姿态透传模式结构体
* 建议初始化方式,避免一些未知错误
* rm_movep_canfd_mode_t my_p_canfd = (rm_movep_canfd_mode_t){ 0 };
*/
typedef struct
{
rm_pose_t pose; // 位姿 (优先采用四元数表达)
bool follow; // 跟随模式0-低跟随1-高跟随,若使用高跟随,透传周期要求不超过 10ms
int trajectory_mode; // 高跟随模式下0-完全透传模式、1-曲线拟合模式、2-滤波模式
int radio; // 曲线拟合模式和滤波模式下的平滑系数数值越大效果越好滤波模式下取值范围0~1000曲线拟合模式下取值范围0~100
}rm_movep_canfd_mode_t;
/**
* @brief 无线网络信息结构体
*
*/
typedef struct{
int channel; ///< 如果是 AP 模式,则存在此字段,标识 wifi 热点的物理信道号
char ip[16]; ///< IP 地址
char mac[18]; ///< MAC 地址
char mask[16]; ///< 子网掩码
char mode[5]; ///< ap 代表热点模式sta 代表联网模式off 代表未开启无线模式
char password[16]; ///< 密码
char ssid[32]; ///< 网络名称 (SSID)
}rm_wifi_net_t;
/**
* @brief 机械臂所有状态参数
*
*/
typedef struct
{
float joint_current[ARM_DOF]; ///< 关节电流单位mA
int joint_en_flag[ARM_DOF]; ///< 关节使能状态
float joint_temperature[ARM_DOF]; ///< 关节温度,单位℃
float joint_voltage[ARM_DOF]; ///< 关节电压单位V
int joint_err_code[ARM_DOF]; ///< 关节错误码
rm_err_t err; ///< 错误代码
}rm_arm_all_state_t;
/**
* @brief 夹爪状态
*
*/
typedef struct
{
int enable_state; ///< 夹爪使能标志0 表示未使能1 表示使能
int status; ///< 夹爪在线状态0 表示离线, 1表示在线
int error; ///< 夹爪错误信息低8位表示夹爪内部的错误信息bit5-7 保留bit4 内部通bit3 驱动器bit2 过流 bit1 过温bit0 堵转
int mode; ///< 当前工作状态1 夹爪张开到最大且空闲2 夹爪闭合到最小且空闲3 夹爪停止且空闲4 夹爪正在闭合5 夹爪正在张开6 夹爪闭合过程中遇到力控停止
int current_force; ///< 夹爪当前的压力单位g
int temperature; ///< 当前温度,单位℃
int actpos; ///< 夹爪开口度
}rm_gripper_state_t;
/**
* @brief 六维力传感器数据结构体
*
*/
typedef struct {
float force_data[6]; ///< 当前力传感器原始数据力的单位为N力矩单位为Nm。
float zero_force_data[6]; ///< 当前力传感器系统外受力数据力的单位为N力矩单位为Nm。
float work_zero_force_data[6]; ///< 当前工作坐标系下系统外受力原始数据力的单位为N力矩单位为Nm。
float tool_zero_force_data[6]; ///< 当前工具坐标系下系统外受力原始数据力的单位为N力矩单位为Nm。
} rm_force_data_t;
/**
* @brief 一维力传感器数据结构体
*
*/
typedef struct {
float Fz; ///< 原始数据
float zero_Fz; ///< 传感器坐标系下系统外受力数据力的单位为N力矩单位为Nm。
float work_zero_Fz; ///< 当前工作坐标系下系统外受力原始数据力的单位为N力矩单位为Nm。
float tool_zero_Fz; ///< 当前工具坐标系下系统外受力原始数据力的单位为N力矩单位为Nm。
} rm_fz_data_t;
/**
* @brief 外设数据读写参数结构体
*
*/
typedef struct {
int port; ///< 通讯端口0-控制器RS485端口1-末端接口板RS485接口3-控制器ModbusTCP设备
int address; ///< 数据起始地址
int device; ///< 外设设备地址
int num; ///< 要读的数据的数量
} rm_peripheral_read_write_params_t;
/**
* @brief 升降机构、扩展关节状态结构体
*
*/
typedef struct {
int pos; ///< 扩展关节角度,单位度,精度 0.001°(若为升降机构高度则单位mm精度1mm范围0 ~2300)
int current; ///< 驱动电流单位mA精度1mA
int err_flag; ///< 驱动错误代码,错误代码类型参考关节错误代码
int mode; ///< 当前状态0-空闲1-正方向速度运动2-正方向位置运动3-负方向速度运动4-负方向位置运动
} rm_expand_state_t;
/**
* @brief 文件下发
* @ingroup OnlineProgramming
*/
typedef struct {
char project_path[300]; ///< 下发文件路径文件名
int project_path_len; ///< 名称长度
int plan_speed; ///< 规划速度比例系数
int only_save; ///< 0-保存并运行文件1-仅保存文件,不运行
int save_id; ///< 保存到控制器中的编号
int step_flag; ///< 设置单步运行方式模式1-设置单步模式 0-设置正常运动模式
int auto_start; ///< 设置默认在线编程文件1-设置默认 0-设置非默认
int project_type; ///< 下发文件类型。0-在线编程文件1-拖动示教轨迹文件
// int err_line; ///< 若运行失败该参数返回有问题的工程行数err_line 为 0则代表校验数据长度不对
} rm_send_project_t;
/**
* @brief 在线编程存储信息
* @ingroup OnlineProgramming
*/
typedef struct {
int id; ///< 在线编程文件id
int size; ///< 文件大小
int speed; ///< 默认运行速度
char trajectory_name[32]; ///< 文件名称
}rm_trajectory_data_t;
/**
* @brief 查询在线编程列表
* @ingroup OnlineProgramming
*/
typedef struct
{
int page_num; // 页码
int page_size; // 每页大小
int list_size; //返回总数量
char vague_search[32]; // 模糊搜索
rm_trajectory_data_t trajectory_list[100]; // 符合的在线编程列表
}rm_program_trajectorys_t;
/**
* @brief 在线编程运行状态
* @ingroup OnlineProgramming
*/
typedef struct
{
int run_state; ///< 运行状态 0 未开始 1运行中 2暂停中
int id; ///< 运行轨迹编号
int edit_id; ///< 上次编辑的在线编程编号 id
int plan_num; ///< 运行行数
int total_loop; ///< 循环指令数量
int step_mode; ///< 单步模式1 为单步模式0 为非单步模式
int plan_speed; ///< 全局规划速度比例 1-100
int loop_num[100]; ///< 循环行数
int loop_cont[100]; ///< 对应循环次数
}rm_program_run_state_t;
/**
* @brief 流程图程序运行状态
*/
typedef struct
{
int run_state; ///< 运行状态 0 未开始 1运行中 2暂停中
int id; ///< 当前使能的文件id。
char name[32]; ///< 当前使能的文件名称。
int plan_speed; ///< 当前使能的文件全局规划速度比例 1-100。
int step_mode; ///< 单步模式0为空1为正常, 2为单步。
char modal_id[50]; ///< 运行到的流程图块的id。未运行则不返回
}rm_flowchart_run_state_t;
/**
* @brief 全局路点存储信息
* @ingroup OnlineProgramming
*/
typedef struct
{
char point_name[20]; ///< 路点名称
float joint[ARM_DOF]; ///< 关节角度
rm_pose_t pose; ///< 位姿信息
char work_frame[12]; ///< 工作坐标系名称
char tool_frame[12]; ///< 工具坐标系名称
char time[50]; ///< 路点新增或修改时间
}rm_waypoint_t;
/**
* @brief 全局路点列表
* @ingroup OnlineProgramming
*/
typedef struct{
int page_num; ///< 页码
int page_size; ///< 每页大小
int total_size; ///< 列表长度
char vague_search[32]; ///< 模糊搜索
int list_len; ///<返回符合的全局路点列表长度
rm_waypoint_t points_list[100]; ///< 返回符合的全局路点列表
}rm_waypoint_list_t;
/**
* @brief 几何模型长方体参数
* @ingroup Electronic_Fence
*/
typedef struct{
float x_min_limit; ///< 长方体基于世界坐标系 X 方向最小位置,单位 m
float x_max_limit; ///< 长方体基于世界坐标系 X 方向最大位置,单位 m
float y_min_limit; ///< 长方体基于世界坐标系 Y 方向最小位置,单位 m
float y_max_limit; ///< 长方体基于世界坐标系 Y 方向最大位置,单位 m
float z_min_limit; ///< 长方体基于世界坐标系 Z 方向最小位置,单位 m
float z_max_limit; ///< 长方体基于世界坐标系 Z 方向最大位置,单位 m
}rm_fence_config_cube_t;
/**
* @brief 几何模型点面矢量平面参数
* @ingroup Electronic_Fence
*/
typedef struct{
float x1, y1, z1; ///< 点面矢量平面三点法中的第一个点坐标,单位 m
float x2, y2, z2; ///< 点面矢量平面三点法中的第二个点坐标,单位 m
float x3, y3, z3; ///< 点面矢量平面三点法中的第三个点坐标,单位 m
}rm_fence_config_plane_t;
/**
* @brief 几何模型球体参数
* @ingroup Electronic_Fence
*/
typedef struct{
float x; ///< 表示球心在世界坐标系 X 轴的坐标,单位 m
float y; ///< 表示球心在世界坐标系 Y 轴的坐标,单位 m
float z; ///< 表示球心在世界坐标系 Z 轴的坐标,单位 m
float radius; ///< 表示半径,单位 m
}rm_fence_config_sphere_t;
/**
* @brief 几何模型参数
* @ingroup Electronic_Fence
*/
typedef struct{
int form; ///< 形状1 表示长方体2 表示点面矢量平面3 表示球体
char name[12]; ///< 电子围栏名称,不超过 10 个字节,支持字母、数字、下划线
rm_fence_config_cube_t cube; ///< 长方体参数
rm_fence_config_plane_t plan; ///< 点面矢量平面参数
rm_fence_config_sphere_t sphere; ///< 球体参数
}rm_fence_config_t;
/**
* @brief 几何模型名称结构体
* @ingroup Electronic_Fence
*/
typedef struct
{
char name[12]; ///< 几何模型名称,不超过10个字符
}rm_fence_names_t;
/**
* @brief 几何模型参数列表
* @ingroup Electronic_Fence
*/
typedef struct
{
rm_fence_config_t config[10];
}rm_fence_config_list_t;
/**
* @brief 包络球参数
*
*/
typedef struct{
char name[12]; ///< 工具包络球体的名称1-10 个字节,支持字母数字下划线
float radius; ///< 工具包络球体的半径,单位 m
float x; ///< 工具包络球体球心基于末端法兰坐标系的 X 轴坐标,单位 m
float y; ///< 工具包络球体球心基于末端法兰坐标系的 Y 轴坐标,单位 m
float z; ///< 工具包络球体球心基于末端法兰坐标系的 Z 轴坐标,单位 m
}rm_envelopes_ball_t;
/**
* @brief 包络球参数集合
*
*/
typedef struct{
rm_envelopes_ball_t balls[5];///< 包络参数列表,每个工具最多支持 5 个包络球,可以没有包络
int size; ///< 包络球数量
char tool_name[12];///< 控制器中已存在的工具坐标系名称,如果不存在该字段,则为临时设置当前包络参数
}rm_envelope_balls_list_t;
/**
* @brief 电子围栏/虚拟墙使能状态参数
*
*/
typedef struct
{
bool enable_state; ///< 电子围栏/虚拟墙使能状态true 代表使能false 代表禁使能
int in_out_side; ///< 0-机器人在电子围栏/虚拟墙内部1-机器人在电子围栏外部
int effective_region; ///< 0-电子围栏针对整臂区域生效1-虚拟墙针对末端生效
}rm_electronic_fence_enable_t;
/**
* @brief UDP主动上报机械臂信息力传感器数据结构体
*
*/
typedef struct {
float force[6]; ///< 当前力传感器原始数据0.001N或0.001Nm
float zero_force[6]; ///< 当前力传感器系统外受力数据0.001N或0.001Nm
int coordinate; ///< 系统外受力数据的坐标系0为传感器坐标系 1为当前工作坐标系 2为当前工具坐标系
} rm_force_sensor_t;
/***
* 扩展关节数据
*
*/
typedef struct {
float pos; ///< 当前角度 精度 0.001°,单位:°
int current; ///< 当前驱动电流单位mA精度1mA
int err_flag; ///< 驱动错误代码,错误代码类型参考关节错误代码
int en_flag; ///< 当前关节使能状态 1 为上使能0 为掉使能
int joint_id; ///< 关节id号
int mode; ///< 当前升降状态0-空闲1-正方向速度运动2-正方向位置运动3-负方向速度运动4-负方向位置运动
} rm_udp_expand_state_t;
/***
* 升降机构状态
*
*/
typedef struct {
int height; ///< 当前升降机构高度单位mm精度1mm
float pos; ///< 当前角度 精度 0.001°,单位:°
int current; ///< 当前驱动电流单位mA精度1mA
int err_flag; ///< 驱动错误代码,错误代码类型参考关节错误代码
int en_flag; ///< 当前关节使能状态 1 为上使能0 为掉使能
} rm_udp_lift_state_t;
/***
* 灵巧手状态
*
*/
typedef struct {
int hand_pos[6]; ///< 表示灵巧手位置
int hand_angle[6]; ///< 表示灵巧手角度
int hand_force[6]; ///< 表示灵巧手自由度力单位mN
int hand_state[6]; ///< 表示灵巧手自由度状态,由灵巧手厂商定义状态含义
int hand_err; ///< 表示灵巧手系统错误由灵巧手厂商定义错误含义例如因时状态码如下1表示有错误0表示无错误
} rm_udp_hand_state_t;
/***
*
* 轨迹连接配置
*/
typedef enum{
RM_TRAJECTORY_DISCONNECT_E = 0, ///<立即规划并执行轨迹,不连接后续轨迹
RM_TRAJECTORY_CONNECT_E ///<将当前轨迹与下一条轨迹一起规划
}rm_trajectory_connect_config_e;
/**
* @brief 机械臂当前状态
*
*/
typedef enum {
RM_IDLE_E, // 使能但空闲状态
RM_MOVE_L_E, // move L运动中状态
RM_MOVE_J_E, // move J运动中状态
RM_MOVE_C_E, // move C运动中状态
RM_MOVE_S_E, // move S运动中状态
RM_MOVE_THROUGH_JOINT_E, // 角度透传状态
RM_MOVE_THROUGH_POSE_E, // 位姿透传状态
RM_MOVE_THROUGH_FORCE_POSE_E, // 力控透传状态
RM_MOVE_THROUGH_CURRENT_E, // 电流环透传状态
RM_STOP_E, // 急停状态
RM_SLOW_STOP_E, // 缓停状态
RM_PAUSE_E, // 暂停状态
RM_CURRENT_DRAG_E, // 电流环拖动状态
RM_SENSOR_DRAG_E, // 六维力拖动状态
RM_TECH_DEMONSTRATION_E // 示教状态
} rm_udp_arm_current_status_e;
/***
* aloha主臂状态
*
*/
typedef struct {
int io1_state; ///< IO1状态手柄光电检测0为按键未触发1为按键触发。
int io2_state; ///< IO2状态手柄光电检测0为按键未触发1为按键触发。
} rm_udp_aloha_state_t;
/**
* 末端设备基础信息(末端生态协议支持)
*/
typedef struct{
char manu[10]; // 设备厂家
int type; // 设备类型 1两指夹爪 2五指灵巧手 3三指夹爪
char hv[10]; // 硬件版本
char sv[10]; // 软件版本
char bv[10]; // boot版本
int id; // 设备ID
int dof; // 自由度
int check; // 自检开关
int bee; // 蜂鸣器开关
bool force; // 力控支持
bool touch; // 触觉支持
int touch_num; // 触觉个数
int touch_sw; // 触觉开关
int hand; // 手方向 1 :左手 2 右手
int pos_up[12]; // 位置上限,单位:无量纲
int pos_low[12]; // 位置下限,单位:无量纲
int angle_up[12]; // 角度上限,单位0.01度
int angle_low[12]; // 角度下限,单位0.01度
int speed_up[12]; // 速度上限,单位:无量纲
int speed_low[12]; // 速度下限,单位:无量纲
int force_up[12]; // 力上限,单位0.001N
int force_low[12]; // 力下限,单位0.001N
} rm_plus_base_info_t;
// 单位:无量纲
/**
* 末端设备实时信息(末端生态协议支持)
*/
typedef struct{
int sys_state; // 系统状态:0正常1设备故障
int dof_state[12]; // 各自由度当前状态:0正在松开1正在闭合2位置到位停止3力控到位停止4触觉到位停止5电流保护停止6发生故障
int dof_err[12]; // 各自由度错误信息
int pos[12]; // 各自由度当前位置,单位:无量纲
int speed[12]; //各自由度当前速度,闭合正,松开负,单位:无量纲
int angle[12]; // 各自由度当前角度单位0.01度
int current[12]; // 各自由度当前电流单位mA
int normal_force[18]; // 自由度触觉三维力的法向力,1-6自由度触觉三维力的法向力*3
int tangential_force[18]; // 自由度触觉三维力的切向力
int tangential_force_dir[18]; // 自由度触觉三维力的切向力方向
uint32_t tsa[12]; // 自由度触觉自接近
uint32_t tma[12]; // 自由度触觉互接近
int touch_data[18]; // 触觉传感器原始数据(示例中有但未显示数据的JSON情况)
int force[12]; //自由度力矩,闭合正松开负单位0.001N
} rm_plus_state_info_t;
/**
* @brief udp主动上报机械臂信息
*
*/
typedef struct
{
int errCode; ///< 数据解析错误码,-3为数据解析错误代表推送的数据不完整或格式不正确
char arm_ip[16]; ///< 推送数据的机械臂的IP地址
rm_joint_status_t joint_status; ///< 关节状态
rm_force_sensor_t force_sensor; ///< 力数据(六维力或一维力版本支持)
rm_err_t err; ///< 错误码
rm_pose_t waypoint; ///< 当前路点信息
rm_udp_lift_state_t liftState; ///< 升降关节数据
rm_udp_expand_state_t expandState; ///< 扩展关节数据
rm_udp_hand_state_t handState; ///< 灵巧手数据
rm_udp_arm_current_status_e arm_current_status; ///< 机械臂状态
rm_udp_aloha_state_t aloha_state; ///< aloha主臂状态
int rm_plus_state; ///< 末端设备状态0-设备在线1-表示协议未开启2-表示协议开启但是设备不在线
rm_plus_base_info_t plus_base_info; ///< 末端设备基础信息
rm_plus_state_info_t plus_state_info; ///< 末端设备实时信息
}rm_realtime_arm_joint_state_t;
/**
* @brief 逆解参数
* @ingroup Algo
*/
typedef struct {
float q_in[ARM_DOF]; ///< 上一时刻关节角度,单位°
rm_pose_t q_pose; ///< 目标位姿
uint8_t flag; ///< 姿态参数类别0-四元数1-欧拉角
} rm_inverse_kinematics_params_t;
typedef struct {
int result; // 0成功1逆解失败-1上一时刻关节角度输入为空或超关节限位-2目标位姿四元数不合法 -3当前机器人非六自由度当前仅支持六自由度机器人
int num; // number of solutions
float q_ref[8]; // 参考关节角度,通常是当前关节角度, 单位 °
float q_solve[8][8]; // 关节角全解, 单位 °
} rm_inverse_kinematics_all_solve_t;
/**
* @brief 包络球描述数据结构
*/
typedef struct
{
float radius; // 球体半径单位m
float centrePoint[3]; // 球体中心位置单位m以法兰坐标系为参考坐标系
} rm_tool_sphere_t; // 工具包络球参数
/**
* @brief 旋转矩阵
* @ingroup Algo
*/
typedef struct
{
short irow;
short iline;
float data[4][4];
} rm_matrix_t;
/**
* @brief 机械臂事件回调函数
* @ingroup Init_Class
*/
typedef void (*rm_event_callback_ptr)(rm_event_push_data_t data);
/**
* @brief UDP机械臂状态主动上报回调函数
* @ingroup Init_Class
*/
typedef void (*rm_realtime_arm_state_callback_ptr)(rm_realtime_arm_joint_state_t data);
/**
* @brief 机械臂基本信息
* @ingroup Init_Class
*/
typedef struct
{
uint8_t arm_dof; ///< 机械臂自由度
rm_robot_arm_model_e arm_model; ///< 机械臂型号
rm_force_type_e force_type; ///< 末端力传感器版本
uint8_t robot_controller_version; ///< 机械臂控制器版本4四代控制器3三代控制器。
}rm_robot_info_t;
/**
* @brief 机械臂控制句柄
* @ingroup Init_Class
*/
typedef struct {
int id; ///< 句柄id连接成功id大于0连接失败返回-1
}rm_robot_handle;
typedef struct
{
float d[8]; //* unit: m
float a[8]; //* unit: m
float alpha[8]; //* unit: °
float offset[8]; //* unit: °
} rm_dh_t;
/**
* @brief 版本号结构体
* 不超过10个字符
* @ingroup ToolCoordinateConfig
* @ingroup WorkCoordinateConfig
*/
typedef struct {
char version[10];
} rm_version_t;
/**
* @brief 轨迹信息结构体
*/
typedef struct {
int point_num; ///< 轨迹点数量
char name[20]; ///< 轨迹名称
char create_time[20]; ///< 创建时间
}rm_trajectory_info_t;
/**
* @brief 轨迹列表结构体
* @ingroup OnlineProgramming
*/
typedef struct{
int page_num; ///< 页码
int page_size; ///< 每页大小
int total_size; ///< 列表长度
char vague_search[32]; ///< 模糊搜索
int list_len; ///<返回符合的轨迹列表长度
rm_trajectory_info_t tra_list[100]; ///< 返回符合的轨迹列表
}rm_trajectory_list_t;
/**
* @brief Modbus TCP主站信息结构体
*/
typedef struct {
char master_name[20]; // Modbus 主站名称最大长度15个字符不超过15个字符
char ip[16]; // TCP主站 IP 地址
int port; // TCP主站端口号
}rm_modbus_tcp_master_info_t;
/**
* @brief Modbus TCP主站列表结构体
*/
typedef struct{
int page_num; ///< 页码
int page_size; ///< 每页大小
int total_size; ///< 列表长度
char vague_search[32]; ///< 模糊搜索
int list_len; ///<返回符合的TCP主站列表长度
rm_modbus_tcp_master_info_t master_list[100]; ///< 返回符合的TCP主站列表
}rm_modbus_tcp_master_list_t;
/**
* @brief Modbus RTU读数据参数结构体
*/
typedef struct {
int address; ///< 数据起始地址
int device; ///< 外设设备地址
int type; ///< 0-控制器端modbus主机1-工具端modbus主机。
int num; ///< 要读的数据的数量数据长度不超过109
}rm_modbus_rtu_read_params_t;
/**
* @brief Modbus RTU写数据结构体
*/
typedef struct {
int address; ///< 数据起始地址
int device; ///< 外设设备地址
int type; ///< 0-控制器端modbus主机1-工具端modbus主机。
int num; ///< 要写的数据的数量最大不超过100
int data[120]; ///< 要写的数据数据长度不超过100
}rm_modbus_rtu_write_params_t;
/**
* @brief Modbus TCP读数据参数结构体
*/
typedef struct {
int address; // 数据起始地址
char master_name[20]; // Modbus 主站名称最大长度15个字符不超过15个字符master_name与IP二选一若有IP和port优先使用IP和port
char ip[16]; // 主机连接的 IP 地址master_name与IP二选一若有IP和port优先使用IP和port
int port; // 主机连接的端口号
int num; // 读取数据数量最大不超过100
}rm_modbus_tcp_read_params_t;
/**
* @brief Modbus TCP写数据结构体
*/
typedef struct {
int address; // 数据起始地址
char master_name[20]; // Modbus 主站名称最大长度15个字符不超过15个字符master_name与IP二选一若有IP和port优先使用IP和port
char ip[16]; // 主机连接的 IP 地址master_name与IP二选一若有IP和port优先使用IP和port
int port; // 主机连接的端口号
int num; // 写入数据数量最大不超过100
int data[120]; // 写入的数据数据长度不超过100
}rm_modbus_tcp_write_params_t;
#ifdef __cplusplus
}
#endif
#endif