当前加入了机械臂状态接收和位置控制的链路
This commit is contained in:
+172
@@ -0,0 +1,172 @@
|
||||
# LBot API 版本更新日志
|
||||
|
||||
## 版本说明
|
||||
LBot API 是灵心巧手科技有限公司为机器人控制提供的开发接口,支持 C、C++、Python 等多种语言,接口说明文档参照doc文件夹 。本文档记录了各版本的更新内容。
|
||||
|
||||
---
|
||||
|
||||
## v1.0.5
|
||||
**更新日期:** 2026年4月30日
|
||||
|
||||
### API接口变更
|
||||
1. **R20灵巧手控制接口**
|
||||
- 新增接口:`lbot_l20_set_series_position`、`lbot_l20_set_all_position`
|
||||
- 功能描述:支持R20灵巧手的16自由度位置控制。
|
||||
|
||||
2. **位姿透传接口**
|
||||
- 新增接口:位姿透传控制功能`lbot_pose_follow`
|
||||
- 功能描述:支持实时位姿数据透传。
|
||||
|
||||
3. **关节跟随优化**
|
||||
- 修改 `lbot_joint_follow` 接口参数
|
||||
|
||||
### 🐛 问题修复
|
||||
- 修复已知测试问题
|
||||
- 优化接口稳定性
|
||||
|
||||
### 对应控制器版本
|
||||
- LBot Controller v1.1.1
|
||||
---
|
||||
|
||||
## v1.0.4
|
||||
**更新日期:** 2026年3月13日
|
||||
|
||||
### API接口变更
|
||||
1. 机械臂最大最小限位设置及获取功能
|
||||
- 新增接口:`lbot_set_joint_limit` 、`lbot_get_joint_limit`、`lbot_get_default_joint_limit`
|
||||
- 功能描述:允许用户设置和获取机械臂各关节的软限位值,增强了运动控制的安全性和灵活性。
|
||||
2. 机械臂关节温度上报功能
|
||||
- 结构体扩展:`lbot_arm_state_t`新增`joint_temperature`字段
|
||||
- 功能描述:通过状态回调机制,实时上报机械臂各关节的温度值,帮助用户监控机械臂运行状态,及时发现异常情况。
|
||||
|
||||
### 🚀 新功能使用示例
|
||||
|
||||
``` bash c
|
||||
// 设置左臂最大最小限位
|
||||
double upper_joint_limit[7] = {0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5};
|
||||
double lower_joint_limit[7] = {-0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5};
|
||||
bool success = lbot_set_joint_limit(handle, LBOT_LEFT_ARM, upper_joint_limit, lower_joint_limit);
|
||||
if (success) {
|
||||
printf("Left Arm Soft Limit Set: SUCCESS\n");
|
||||
} else {
|
||||
printf("Left Arm Soft Limit Set: FAILED - %s\n", lbot_get_last_error(handle));
|
||||
}
|
||||
// 获取软限位
|
||||
double retrieved_upper_joint_limit[7];
|
||||
double retrieved_lower_joint_limit[7];
|
||||
|
||||
success = lbot_get_joint_limit(handle, LBOT_LEFT_ARM, retrieved_upper_joint_limit, retrieved_lower_joint_limit);
|
||||
if (success) {
|
||||
printf("Left Arm Soft Limit Get: SUCCESS - Upper Limit: ");
|
||||
for (int i = 0; i < 7; i++) {
|
||||
printf("%.3f ", retrieved_upper_joint_limit[i]);
|
||||
}
|
||||
printf("\n");
|
||||
printf("Lower Limit: ");
|
||||
for (int i = 0; i < 7; i++) {
|
||||
printf("%.3f ", retrieved_lower_joint_limit[i]);
|
||||
}
|
||||
printf("\n");
|
||||
} else {
|
||||
printf("Left Arm Soft Limit Get: FAILED - %s\n", lbot_get_last_error(handle));
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## v1.0.3
|
||||
**更新日期:** 2026年1月25日
|
||||
|
||||
### 🚀 新功能
|
||||
- 所有API接口增加 `lbot_handle_t*` 句柄参数,支持多连接管理
|
||||
|
||||
### 📝 文档更新
|
||||
- 更新《机器人控制平台说明文档》至 v1.1.0
|
||||
- 更新《机械臂控制接口文档》至 v1.0.2
|
||||
- 完善API接口说明和使用示例
|
||||
|
||||
### 🔧 改进
|
||||
- 优化库文件组织结构
|
||||
- 改进跨平台编译配置
|
||||
|
||||
---
|
||||
---
|
||||
|
||||
## v1.0.2
|
||||
**更新日期:** 2026年1月8日
|
||||
|
||||
|
||||
### API接口变更
|
||||
1. 运动控制函数参数完善
|
||||
关节跟随控制
|
||||
``` bash c
|
||||
// v1.0.1 - 基础关节跟随接口
|
||||
bool lbot_left_joint_follow(const double joints[7]);
|
||||
bool lbot_right_joint_follow(const double joints[7]);
|
||||
|
||||
// v1.0.2 - 合并关节跟随接口;增加跟随模式参数,支持高低跟随模式选择
|
||||
bool lbot_joint_follow(lbot_arm_t arm, const double joints[7], bool follow);
|
||||
```
|
||||
2. 灵巧手控制接口
|
||||
更新L6灵巧手控制接口;
|
||||
新增L10灵巧手控制接口。
|
||||
``` bash c
|
||||
// l6 手控制接口
|
||||
bool lbot_l6_set_position(lbot_arm_t arm, const uint8_t position[6]);
|
||||
bool lbot_l6_set_velocity(lbot_arm_t arm, const uint8_t velocity[6]);
|
||||
bool lbot_l6_set_effort(lbot_arm_t arm, const uint8_t torque[6]);
|
||||
|
||||
// l10 手控制接口(10个自由度)
|
||||
bool lbot_l10_set_position(lbot_arm_t arm, const uint8_t position[10]);
|
||||
bool lbot_l10_set_velocity(lbot_arm_t arm, const uint8_t velocity[10]);
|
||||
bool lbot_l10_set_effort(lbot_arm_t arm, const uint8_t torque[10]);
|
||||
```
|
||||
---
|
||||
|
||||
|
||||
## v1.0.1
|
||||
**更新日期:** 2025年12月12日
|
||||
|
||||
### API接口变更
|
||||
1. 初始化函数优化
|
||||
``` bash c
|
||||
// v1.0.0 - 需要TCP和UDP参数
|
||||
bool lbot_init(const char* tcp_host, int tcp_port, const char* udp_host, int udp_port);
|
||||
// v1.0.1 - 简化初始化,只需TCP地址
|
||||
bool lbot_init(const char* tcp_host);
|
||||
影响: 简化了API初始化过程,移除了UDP连接。
|
||||
```
|
||||
2. 运动控制函数参数完善
|
||||
笛卡尔空间运动增加加速度参数
|
||||
``` bash c
|
||||
// v1.0.0 - 缺少加速度参数
|
||||
bool lbot_move_pose(lbot_arm_t arm, const lbot_position_t* position,
|
||||
const lbot_euler_t* euler, double speed, bool block);
|
||||
bool lbot_move_linear(lbot_arm_t arm, const lbot_position_t* position,
|
||||
const lbot_euler_t* euler, double speed, bool block);
|
||||
// v1.0.1 - 增加加速度控制
|
||||
bool lbot_move_pose(lbot_arm_t arm, const lbot_position_t* position,
|
||||
const lbot_euler_t* euler, double speed, double accel, bool block);
|
||||
bool lbot_move_linear(lbot_arm_t arm, const lbot_position_t* position,
|
||||
const lbot_euler_t* euler, double speed, double accel, bool block);
|
||||
```
|
||||
3. 紧急停止函数增强
|
||||
``` bash c
|
||||
// v1.0.0 - 全局紧急停止
|
||||
bool lbot_emergency_stop();
|
||||
// v1.0.1 - 指定机械臂紧急停止/恢复
|
||||
bool lbot_emergency_stop(lbot_arm_t arm, bool enable);
|
||||
```
|
||||
---
|
||||
|
||||
## 支持与反馈
|
||||
|
||||
**版权所有 © 2025-2026 灵心巧手科技有限公司**
|
||||
|
||||
- 技术支持:请联系灵心巧手科技有限公司
|
||||
- 问题反馈:通过官方渠道提交问题报告
|
||||
- 文档更新:本文档随版本更新同步维护
|
||||
|
||||
---
|
||||
|
||||
**最后更新:** 2026年4月29日
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,491 @@
|
||||
/**
|
||||
* @file lbot_api.h
|
||||
* @brief LBot机器人控制API接口
|
||||
* @date 2026.1.19
|
||||
* @copyright 灵心巧手科技有限公司
|
||||
*/
|
||||
#ifndef LBOT_API_H
|
||||
#define LBOT_API_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// 跨平台导出宏
|
||||
#ifdef _WIN32
|
||||
#ifdef LBOT_API_EXPORTS
|
||||
#define LBOT_API __declspec(dllexport)
|
||||
#else
|
||||
#define LBOT_API __declspec(dllimport)
|
||||
#endif
|
||||
#else
|
||||
#define LBOT_API __attribute__((visibility("default")))
|
||||
#endif
|
||||
|
||||
#include "lbot_types.h"
|
||||
#include "lbot_version.h"
|
||||
|
||||
// ==============================================
|
||||
// API初始化和清理函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 初始化LBot API连接
|
||||
* @param tcp_host TCP服务器地址格式:"192.168.10.21"
|
||||
* @return lbot_handle_t 连接句柄,连接成功句柄ID>0,失败返回NULL
|
||||
*/
|
||||
LBOT_API lbot_handle_t *lbot_init(const char* tcp_host);
|
||||
|
||||
/**
|
||||
* @brief 断开指定连接
|
||||
* @param handle 机械臂句柄
|
||||
* @return true 断开成功,false 断开失败
|
||||
*/
|
||||
LBOT_API bool lbot_disconnect(lbot_handle_t *handle);
|
||||
|
||||
/**
|
||||
* @brief 清理API资源,断开连接
|
||||
*/
|
||||
LBOT_API void lbot_cleanup();
|
||||
|
||||
/**
|
||||
* @brief 获取API版本信息
|
||||
* @return 版本字符串
|
||||
*/
|
||||
LBOT_API const char* lbot_get_api_version();
|
||||
// ==============================================
|
||||
// 系统信息获取函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 获取控制器信息
|
||||
* @param handle 机械臂句柄
|
||||
* @param robot_model 返回的机器人型号字符串(需要调用者释放)
|
||||
* @param controller_version 返回的控制器版本字符串(需要调用者释放)
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_controller_info(lbot_handle_t *handle, char** robot_model, char** controller_version);
|
||||
|
||||
// ==============================================
|
||||
// 状态监控和管理函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 启动状态监控
|
||||
* @param state_cb 状态回调函数,当机器人状态更新时调用
|
||||
* @param error_cb 错误回调函数,当发生错误时调用
|
||||
* @return true 启动成功,false 启动失败
|
||||
*/
|
||||
LBOT_API bool lbot_start_state_monitor(lbot_state_callback_t state_cb, lbot_error_callback_t error_cb);
|
||||
|
||||
/**
|
||||
* @brief 停止状态监控
|
||||
*/
|
||||
LBOT_API void lbot_stop_state_monitor();
|
||||
|
||||
/**
|
||||
* @brief 获取当前机器人完整状态,此接口需要在启动状态监控后才能调用
|
||||
* @param handle 机械臂句柄
|
||||
* @param state 返回的机器人状态结构体指针
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_current_state(lbot_handle_t *handle, lbot_full_state_t* state);
|
||||
|
||||
// ==============================================
|
||||
// 运动控制函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 关节空间运动
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param joints 7个关节的目标角度(弧度)
|
||||
* @param speed 运动速度(0.0~20.0)单位是rad/s, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param accel 加速度(0.0~20.0) 单位是rad/s^2, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param block 是否阻塞执行:true 等待运动完成,false 立即返回
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_move_joint(lbot_handle_t *handle, lbot_arm_t arm, const double joints[7], double speed, double accel, bool block);
|
||||
|
||||
/**
|
||||
* @brief 笛卡尔空间姿态运动(关节插值)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param position 目标位置(x, y, z,单位:米)
|
||||
* @param euler 机械臂末端目标欧拉角(roll, pitch, yaw,单位:弧度)
|
||||
* @param speed 机械臂末端运动速度(0.0~20.0)单位m/s, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param accel 机械臂末端加速度(0.0~20.0)单位m/s^2, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param block 是否阻塞执行:true 等待运动完成,false 立即返回
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_move_pose(lbot_handle_t *handle, lbot_arm_t arm, const lbot_position_t* position, const lbot_euler_t* euler,
|
||||
double speed, double accel, bool block);
|
||||
|
||||
/**
|
||||
* @brief 笛卡尔空间直线运动(直线插值)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param position 目标位置(x, y, z,单位:米)
|
||||
* @param euler 目标欧拉角(roll, pitch, yaw,单位:弧度)
|
||||
* @param speed 关节运动速度(0.0~20.0)单位是rad/s, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param accel 关节运动加速度(0.0~20.0) 单位是rad/s^2, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param block 是否阻塞执行:true 等待运动完成,false 立即返回
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_move_linear(lbot_handle_t *handle, lbot_arm_t arm, const lbot_position_t* position, const lbot_euler_t* euler,
|
||||
double speed, double accel, bool block);
|
||||
|
||||
// ==============================================
|
||||
// 关节跟随函数(用于遥操作)
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 关节跟随控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param joints 7个关节的目标角度(弧度)
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_joint_follow(lbot_handle_t *handle, lbot_arm_t arm, const double joints[7]);
|
||||
|
||||
/**
|
||||
* @brief 笛卡尔空间姿态跟随运动
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param pos 目标位置(x, y, z,单位:米)
|
||||
* @param eul 目标欧拉角(roll, pitch, yaw,单位:弧度)
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_pose_follow(lbot_handle_t *handle, lbot_arm_t arm, lbot_position_t pos, lbot_euler_t eul);
|
||||
// ==============================================
|
||||
// l6 手控制接口
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 设置L6手的位置控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param position 6个手指的目标位置(0~255)
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l6_set_position(lbot_handle_t *handle, lbot_arm_t arm, const uint8_t position[6]);
|
||||
|
||||
/**
|
||||
* @brief 设置L6手的速度控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param velocity 6个手指的目标速度(0~255)
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l6_set_velocity(lbot_handle_t *handle, lbot_arm_t arm, const uint8_t velocity[6]);
|
||||
|
||||
/**
|
||||
* @brief 设置L6手的力矩控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param torque 6个手指的目标力矩(0~255)
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l6_set_effort(lbot_handle_t *handle, lbot_arm_t arm, const uint8_t torque[6]);
|
||||
|
||||
// ==============================================
|
||||
// l10 手控制接口(10个自由度)
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 设置L10手的位置控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param position 10个手指的目标位置(0~255)
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l10_set_position(lbot_handle_t *handle, lbot_arm_t arm, const uint8_t position[10]);
|
||||
|
||||
/**
|
||||
* @brief 设置L10手的速度控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param velocity 10个手指的目标速度(0~255)
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l10_set_velocity(lbot_handle_t *handle, lbot_arm_t arm, const uint8_t velocity[10]);
|
||||
|
||||
/**
|
||||
* @brief 设置L10手的力矩控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param torque 10个手指的目标力矩(0~255)
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l10_set_effort(lbot_handle_t *handle, lbot_arm_t arm, const uint8_t torque[10]);
|
||||
|
||||
// ==============================================
|
||||
// r20 手控制接口
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 设置R20手各手指位置控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param cmd 目标位置命令
|
||||
* 拇指:data[0] 拇指指根(0~120)、data[1] 拇指指尖(0~150)、data[2] 拇指侧摆(0~180)、data[3] 拇指旋转(0~130)
|
||||
* 食指:data[0] 食指侧摆(-30~30)、data[1] 食指指根(0~180)、data[2] 食指指尖(0~180)
|
||||
* 中指:data[0] 中指侧摆(-30~30)、data[1] 中指指根(0~180)、data[2] 中指指尖(0~180)
|
||||
* 无名指:data[0] 无名指侧摆(-20~20)、data[1] 无名指指根(0~180)、data[2] 无名指指尖(0~180)
|
||||
* 小指:data[0] 小指侧摆(-20~20)、data[1] 小指指根(0~180)、data[2] 小指指尖(0~180)
|
||||
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l20_set_series_position(lbot_handle_t *handle, lbot_arm_t arm, const lbot_l20_series_cmd_t* cmd);
|
||||
/**
|
||||
* @brief 设置R20手所有自由度位置控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param cmd 目标位置命令, 16个自由度的目标位置(度),分别为:拇指指根(0~120)、
|
||||
* 拇指指尖(0~150)、拇指侧摆(0~180)、拇指旋转(0~130)、食指侧摆(-30~30)、
|
||||
* 食指指根(0~180)、食指指尖(0~180)、中指侧摆(-30~30)、中指指根(0~180)、
|
||||
* 中指指尖(0~180)、无名指侧摆(-20~20)、无名指指根(0~180)、无名指指尖(0~180)、
|
||||
* 小指侧摆(-20~20)、小指指根(0~180)、小指指尖(0~180)
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l20_set_all_position(lbot_handle_t *handle, lbot_arm_t arm, const int cmd[16]);
|
||||
|
||||
|
||||
// ==============================================
|
||||
// 运动学计算函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 正运动学计算
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param joints 7个关节角度(弧度)
|
||||
* @param position 返回的末端位置(x, y, z,单位:米)
|
||||
* @param euler 返回的末端欧拉角(roll, pitch, yaw,单位:弧度)
|
||||
* @return true 计算成功,false 计算失败
|
||||
*/
|
||||
LBOT_API bool lbot_forward_kinematics(lbot_handle_t *handle, lbot_arm_t arm, const double joints[7],
|
||||
lbot_position_t* position, lbot_euler_t* euler);
|
||||
|
||||
/**
|
||||
* @brief 逆运动学计算
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param initial_joints 初始关节角度(弧度),用于求解器迭代
|
||||
* @param position 目标位置(x, y, z,单位:米)
|
||||
* @param euler 目标欧拉角(roll, pitch, yaw,单位:弧度)
|
||||
* @param result_joints 返回的7个关节角度解(弧度)
|
||||
* @return true 求解成功,false 求解失败
|
||||
*/
|
||||
LBOT_API bool lbot_inverse_kinematics(lbot_handle_t *handle, lbot_arm_t arm, const double initial_joints[7],
|
||||
const lbot_position_t* position, const lbot_euler_t* euler,
|
||||
double result_joints[7]);
|
||||
|
||||
// ==============================================
|
||||
// 工具坐标系管理函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 设置工具坐标系
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 工具坐标系名称(最大32字符)
|
||||
* @param position 工具坐标系相对于法兰盘的位置偏移(x, y, z,单位:米)
|
||||
* @param euler 工具坐标系相对于法兰盘的欧拉角偏移(roll, pitch, yaw,单位:弧度)
|
||||
* @return true 设置成功,false 设置失败
|
||||
*/
|
||||
LBOT_API bool lbot_set_tool_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name,
|
||||
const lbot_position_t* position, const lbot_euler_t* euler);
|
||||
|
||||
/**
|
||||
* @brief 获取工具坐标系参数
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 工具坐标系名称
|
||||
* @param position 返回的工具坐标系位置偏移
|
||||
* @param euler 返回的工具坐标系欧拉角偏移
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_tool_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name,
|
||||
lbot_position_t* position, lbot_euler_t* euler);
|
||||
|
||||
/**
|
||||
* @brief 获取当前使用的工具坐标系
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 返回的当前工具坐标系名称(需要调用者释放)
|
||||
* @param position 返回的当前工具坐标系位置偏移
|
||||
* @param euler 返回的当前工具坐标系欧拉角偏移
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_current_tool_frame(lbot_handle_t *handle, lbot_arm_t arm,
|
||||
char** name,
|
||||
lbot_position_t* position,
|
||||
lbot_euler_t* euler);
|
||||
|
||||
/**
|
||||
* @brief 切换当前工具坐标系
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 要切换到的工具坐标系名称
|
||||
* @return true 切换成功,false 切换失败
|
||||
*/
|
||||
LBOT_API bool lbot_change_tool_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name);
|
||||
|
||||
/**
|
||||
* @brief 删除工具坐标系
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 要删除的工具坐标系名称
|
||||
* @return true 删除成功,false 删除失败
|
||||
*/
|
||||
LBOT_API bool lbot_delete_tool_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name);
|
||||
|
||||
/**
|
||||
* @brief 获取所有工具坐标系名称
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param names 返回的工具坐标系名称数组(需要调用lbot_free_string_array释放)
|
||||
* @param count 返回的工具坐标系数量
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_all_tool_frames(lbot_handle_t *handle, lbot_arm_t arm, char*** names, int* count);
|
||||
|
||||
// ==============================================
|
||||
// 工作坐标系管理函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 设置工作坐标系
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 工作坐标系名称(最大32字符)
|
||||
* @param position 工作坐标系相对于基坐标系的位置偏移(x, y, z,单位:米)
|
||||
* @param euler 工作坐标系相对于基坐标系的欧拉角偏移(roll, pitch, yaw,单位:弧度)
|
||||
* @return true 设置成功,false 设置失败
|
||||
*/
|
||||
LBOT_API bool lbot_set_work_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name,
|
||||
const lbot_position_t* position, const lbot_euler_t* euler);
|
||||
|
||||
/**
|
||||
* @brief 获取工作坐标系参数
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 工作坐标系名称
|
||||
* @param position 返回的工作坐标系位置偏移
|
||||
* @param euler 返回的工作坐标系欧拉角偏移
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_work_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name,
|
||||
lbot_position_t* position, lbot_euler_t* euler);
|
||||
|
||||
/**
|
||||
* @brief 切换当前工作坐标系
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 要切换到的工作坐标系名称
|
||||
* @return true 切换成功,false 切换失败
|
||||
*/
|
||||
LBOT_API bool lbot_change_work_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name);
|
||||
|
||||
/**
|
||||
* @brief 删除工作坐标系
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 要删除的工作坐标系名称
|
||||
* @return true 删除成功,false 删除失败
|
||||
*/
|
||||
LBOT_API bool lbot_delete_work_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name);
|
||||
|
||||
/**
|
||||
* @brief 获取所有工作坐标系名称
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param names 返回的工作坐标系名称数组(需要调用lbot_free_string_array释放)
|
||||
* @param count 返回的工作坐标系数量
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_all_work_frames(lbot_handle_t *handle, lbot_arm_t arm, char*** names, int* count);
|
||||
|
||||
// ==============================================
|
||||
// 系统功能函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 重新标定电机零位,设置当前位置为零位
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @return true 设置成功,false 设置失败
|
||||
*/
|
||||
LBOT_API bool lbot_set_zero(lbot_handle_t *handle, lbot_arm_t arm);
|
||||
|
||||
/**
|
||||
* @brief 使能/掉使能机械臂
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param enable true 使能,false 掉使能
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_enable_arm(lbot_handle_t *handle, lbot_arm_t arm, bool enable);
|
||||
|
||||
/**
|
||||
* @brief 紧急停止/恢复机械臂运行
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param enable true 紧急停止,false 恢复运行
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_emergency_stop(lbot_handle_t *handle, lbot_arm_t arm, bool enable);
|
||||
|
||||
/**
|
||||
* @brief 清除所有错误
|
||||
* @param handle 机械臂句柄
|
||||
* @return true 清除成功,false 清除失败
|
||||
*/
|
||||
LBOT_API bool lbot_clear_errors(lbot_handle_t *handle);
|
||||
|
||||
/**
|
||||
* @brief 设置机械臂关节限位
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param upper_joint_limit 最大关节限位参数
|
||||
* @param lower_joint_limit 最小关节限位参数
|
||||
* @return true 设置成功,false 设置失败
|
||||
*/
|
||||
LBOT_API bool lbot_set_joint_limit(lbot_handle_t *handle, lbot_arm_t arm, const double upper_joint_limit[7], const double lower_joint_limit[7]);
|
||||
/**
|
||||
* @brief 获取机械臂关节限位参数
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param upper_joint_limit 返回的最大关节限位参数
|
||||
* @param lower_joint_limit 返回的最小关节限位参数
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_joint_limit(lbot_handle_t *handle, lbot_arm_t arm, double upper_joint_limit[7], double lower_joint_limit[7]);
|
||||
/**
|
||||
* @brief 恢复默认关节限位参数
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param upper_joint_limit 返回的默认最大关节限位参数
|
||||
* @param lower_joint_limit 返回的默认最小关节限位参数
|
||||
* @return true 恢复成功,false 恢复失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_default_joint_limit(lbot_handle_t *handle, lbot_arm_t arm, double upper_joint_limit[7], double lower_joint_limit[7]);
|
||||
// ==============================================
|
||||
// 内存管理辅助函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 释放字符串数组内存
|
||||
* @param array 要释放的字符串数组
|
||||
* @param count 数组元素数量
|
||||
*/
|
||||
LBOT_API void lbot_free_string_array(char** array, int count);
|
||||
|
||||
// ==============================================
|
||||
// 工具函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 获取最后一次错误信息
|
||||
* @return 错误信息字符串指针
|
||||
*/
|
||||
LBOT_API const char* lbot_get_last_error(lbot_handle_t *handle);
|
||||
|
||||
/**
|
||||
* @brief 设置日志级别
|
||||
* @param level 日志级别:0-ERROR, 1-WARN, 2-INFO, 3-DEBUG
|
||||
*/
|
||||
LBOT_API void lbot_set_log_level(int level);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // LBOT_API_H
|
||||
@@ -0,0 +1,670 @@
|
||||
/**
|
||||
* @file lbot_api_cpp.h
|
||||
* @brief 灵心巧手机械臂控制API C++封装头文件
|
||||
* @date 2026.1.19
|
||||
* @copyright 灵心巧手科技有限公司
|
||||
*/
|
||||
#ifndef LBOT_API_CPP_H
|
||||
#define LBOT_API_CPP_H
|
||||
|
||||
#include "lbot_api.h"
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <functional>
|
||||
|
||||
/**
|
||||
* @brief 灵心巧手机械臂控制API C++封装类
|
||||
* @details 提供C++友好的接口封装,使用std::string和std::vector简化内存管理
|
||||
*/
|
||||
namespace lbot {
|
||||
|
||||
class LbotApi {
|
||||
public:
|
||||
// ==============================================
|
||||
// 构造函数和析构函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 构造函数
|
||||
*/
|
||||
LbotApi();
|
||||
|
||||
/**
|
||||
* @brief 析构函数,自动清理资源
|
||||
*/
|
||||
~LbotApi();
|
||||
|
||||
// ==============================================
|
||||
// API初始化和清理函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 初始化LBot API连接
|
||||
* @param tcp_host TCP服务器地址格式:"192.168.10.21"
|
||||
* @return lbot_handle_t 连接句柄,连接成功句柄ID>0,失败返回NULL
|
||||
*/
|
||||
LBOT_API lbot_handle_t *lbot_init(const char* tcp_host);
|
||||
|
||||
/**
|
||||
* @brief 断开指定连接
|
||||
* @param handle 机械臂句柄
|
||||
* @return true 断开成功,false 断开失败
|
||||
*/
|
||||
LBOT_API bool lbot_disconnect(lbot_handle_t *handle);
|
||||
|
||||
/**
|
||||
* @brief 清理API资源,断开连接
|
||||
*/
|
||||
LBOT_API void lbot_cleanup();
|
||||
|
||||
/**
|
||||
* @brief 获取API版本信息
|
||||
* @return 版本字符串
|
||||
*/
|
||||
LBOT_API std::string lbot_get_api_version();
|
||||
|
||||
// ==============================================
|
||||
// 系统信息获取函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 获取控制器信息
|
||||
* @param handle 机械臂句柄
|
||||
* @param robot_model 返回的机器人型号字符串
|
||||
* @param controller_version 返回的控制器版本字符串
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_controller_info(lbot_handle_t *handle, std::string& robot_model, std::string& controller_version);
|
||||
|
||||
// ==============================================
|
||||
// 状态监控和管理函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 启动状态监控
|
||||
* @param state_cb 状态回调函数,当机器人状态更新时调用
|
||||
* @param error_cb 错误回调函数,当发生错误时调用
|
||||
* @return true 启动成功,false 启动失败
|
||||
*/
|
||||
LBOT_API bool lbot_start_state_monitor(lbot_state_callback_t state_cb, lbot_error_callback_t error_cb);
|
||||
|
||||
/**
|
||||
* @brief 停止状态监控
|
||||
*/
|
||||
LBOT_API void lbot_stop_state_monitor();
|
||||
|
||||
/**
|
||||
* @brief 获取当前机器人完整状态,此接口需要在启动状态监控后才能调用
|
||||
* @param handle 机械臂句柄
|
||||
* @param state 返回的机器人状态结构体指针
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_current_state(lbot_handle_t *handle, lbot_full_state_t* state);
|
||||
|
||||
// ==============================================
|
||||
// 运动控制函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 关节空间运动
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param joints 7个关节的目标角度(弧度)
|
||||
* @param speed 运动速度(0.0~20.0)单位是rad/s, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param accel 加速度(0.0~20.0)单位是rad/s^2, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param block 是否阻塞执行:true 等待运动完成,false 立即返回
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_move_joint(lbot_handle_t *handle, lbot_arm_t arm, const double joints[7], double speed, double accel, bool block);
|
||||
|
||||
/**
|
||||
* @brief 关节空间运动(使用vector)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param joints 7个关节的目标角度(弧度)向量
|
||||
* @param speed 运动速度(0.0~20.0)单位是rad/s, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param accel 加速度(0.0~20.0)单位是rad/s^2, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param block 是否阻塞执行:true 等待运动完成,false 立即返回
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_move_joint(lbot_handle_t *handle, lbot_arm_t arm, const std::vector<double>& joints, double speed, double accel, bool block);
|
||||
|
||||
/**
|
||||
* @brief 笛卡尔空间姿态运动(关节插值)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param position 目标位置(x, y, z,单位:米)
|
||||
* @param euler 机械臂末端目标欧拉角(roll, pitch, yaw,单位:弧度)
|
||||
* @param speed 机械臂末端运动速度(0.0~20.0)单位m/s, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param accel 机械臂末端加速度(0.0~20.0)单位m/s^2, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param block 是否阻塞执行:true 等待运动完成,false 立即返回
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_move_pose(lbot_handle_t *handle, lbot_arm_t arm, const lbot_position_t* position, const lbot_euler_t* euler,
|
||||
double speed, double accel, bool block);
|
||||
|
||||
/**
|
||||
* @brief 笛卡尔空间姿态运动(使用向量)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param position 目标位置(x, y, z,单位:米)向量
|
||||
* @param euler 机械臂末端目标欧拉角(roll, pitch, yaw,单位:弧度)向量
|
||||
* @param speed 机械臂末端运动速度(0.0~20.0)单位m/s, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param accel 机械臂末端加速度(0.0~20.0)单位m/s^2, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param block 是否阻塞执行:true 等待运动完成,false 立即返回
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_move_pose(lbot_handle_t *handle, lbot_arm_t arm, const std::vector<double>& position, const std::vector<double>& euler,
|
||||
double speed, double accel, bool block);
|
||||
|
||||
/**
|
||||
* @brief 笛卡尔空间直线运动(直线插值)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param position 目标位置(x, y, z,单位:米)
|
||||
* @param euler 目标欧拉角(roll, pitch, yaw,单位:弧度)
|
||||
* @param speed 关节运动速度(0.0~20.0)单位是rad/s, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param accel 关节运动加速度(0.0~20.0)单位是rad/s^2, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param block 是否阻塞执行:true 等待运动完成,false 立即返回
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_move_linear(lbot_handle_t *handle, lbot_arm_t arm, const lbot_position_t* position, const lbot_euler_t* euler,
|
||||
double speed, double accel, bool block);
|
||||
|
||||
/**
|
||||
* @brief 笛卡尔空间直线运动(使用向量)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param position 目标位置(x, y, z,单位:米)向量
|
||||
* @param euler 目标欧拉角(roll, pitch, yaw,单位:弧度)向量
|
||||
* @param speed 关节运动速度(0.0~20.0)单位是rad/s, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param accel 关节运动加速度(0.0~20.0)单位是rad/s^2, 建议从(0.0~2.0)开始使用后续如有需要逐步提高
|
||||
* @param block 是否阻塞执行:true 等待运动完成,false 立即返回
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_move_linear(lbot_handle_t *handle, lbot_arm_t arm, const std::vector<double>& position, const std::vector<double>& euler,
|
||||
double speed, double accel, bool block);
|
||||
|
||||
// ==============================================
|
||||
// 关节跟随函数(用于遥操作)
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 关节跟随控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param joints 包含7个关节目标角度(弧度)的向量
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_joint_follow(lbot_handle_t *handle, lbot_arm_t arm, const std::vector<double>& joints);
|
||||
|
||||
// ==============================================
|
||||
// 姿态跟随函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 笛卡尔空间姿态跟随运动
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param pos 目标位置(x, y, z,单位:米)
|
||||
* @param eul 目标欧拉角(roll, pitch, yaw,单位:弧度)
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_pose_follow(lbot_handle_t *handle, lbot_arm_t arm, lbot_position_t pos, lbot_euler_t eul);
|
||||
|
||||
// ==============================================
|
||||
// L6手控制接口
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 设置L6手的位置控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param position 6个手指的目标位置(0~255)向量
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l6_set_position(lbot_handle_t *handle, lbot_arm_t arm, const std::vector<uint8_t>& position);
|
||||
|
||||
/**
|
||||
* @brief 设置L6手的速度控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param velocity 6个手指的目标速度(0~255)向量
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l6_set_velocity(lbot_handle_t *handle, lbot_arm_t arm, const std::vector<uint8_t>& velocity);
|
||||
|
||||
/**
|
||||
* @brief 设置L6手的力矩控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param torque 6个手指的目标力矩(0~255)向量
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l6_set_effort(lbot_handle_t *handle, lbot_arm_t arm, const std::vector<uint8_t>& torque);
|
||||
|
||||
// ==============================================
|
||||
// L10手控制接口(10个自由度)
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 设置L10手的位置控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param position 10个手指的目标位置(0~255)向量
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l10_set_position(lbot_handle_t *handle, lbot_arm_t arm, const std::vector<uint8_t>& position);
|
||||
|
||||
/**
|
||||
* @brief 设置L10手的速度控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param velocity 10个手指的目标速度(0~255)向量
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l10_set_velocity(lbot_handle_t *handle, lbot_arm_t arm, const std::vector<uint8_t>& velocity);
|
||||
|
||||
/**
|
||||
* @brief 设置L10手的力矩控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param torque 10个手指的目标力矩(0~255)向量
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l10_set_effort(lbot_handle_t *handle, lbot_arm_t arm, const std::vector<uint8_t>& torque);
|
||||
|
||||
// ==============================================
|
||||
// L20手控制接口(20个自由度)
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 设置R20手的串联位置控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param cmd 目标位置命令
|
||||
* 拇指:data[0] 拇指指根(0~120)、data[1] 拇指指尖(0~150)、data[2] 拇指侧摆(0~180)、data[3] 拇指旋转(0~130)
|
||||
* 食指:data[0] 食指侧摆(-30~30)、data[1] 食指指根(0~180)、data[2] 食指指尖(0~180)
|
||||
* 中指:data[0] 中指侧摆(-30~30)、data[1] 中指指根(0~180)、data[2] 中指指尖(0~180)
|
||||
* 无名指:data[0] 无名指侧摆(-20~20)、data[1] 无名指指根(0~180)、data[2] 无名指指尖(0~180)
|
||||
* 小指:data[0] 小指侧摆(-20~20)、data[1] 小指指根(0~180)、data[2] 小指指尖(0~180)
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l20_set_series_position(lbot_handle_t *handle, lbot_arm_t arm, const lbot_l20_series_cmd_t* cmd);
|
||||
|
||||
/**
|
||||
* @brief 设置R20手所有自由度位置控制
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param position 16个自由度的目标位置(度)向量
|
||||
* 目标位置命令, 16个自由度的目标位置(度),分别为:拇指指根(0~120)、
|
||||
* 拇指指尖(0~150)、拇指侧摆(0~180)、拇指旋转(0~130)、食指侧摆(-30~30)、
|
||||
* 食指指根(0~180)、食指指尖(0~180)、中指侧摆(-30~30)、中指指根(0~180)、
|
||||
* 中指指尖(0~180)、无名指侧摆(-20~20)、无名指指根(0~180)、无名指指尖(0~180)、
|
||||
* 小指侧摆(-20~20)、小指指根(0~180)、小指指尖(0~180)
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_l20_set_all_position(lbot_handle_t *handle, lbot_arm_t arm, const std::vector<int>& position);
|
||||
|
||||
// ==============================================
|
||||
// 运动学计算函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 正运动学计算
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param joints 7个关节角度(弧度)
|
||||
* @param position 返回的末端位置(x, y, z,单位:米)
|
||||
* @param euler 返回的末端欧拉角(roll, pitch, yaw,单位:弧度)
|
||||
* @return true 计算成功,false 计算失败
|
||||
*/
|
||||
LBOT_API bool lbot_forward_kinematics(lbot_handle_t *handle, lbot_arm_t arm, const double joints[7],
|
||||
lbot_position_t* position, lbot_euler_t* euler);
|
||||
|
||||
/**
|
||||
* @brief 正运动学计算(使用向量)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param joints 7个关节角度(弧度)向量
|
||||
* @param position 返回的末端位置(x, y, z,单位:米)向量
|
||||
* @param euler 返回的末端欧拉角(roll, pitch, yaw,单位:弧度)向量
|
||||
* @return true 计算成功,false 计算失败
|
||||
*/
|
||||
LBOT_API bool lbot_forward_kinematics(lbot_handle_t *handle, lbot_arm_t arm, const std::vector<double>& joints,
|
||||
std::vector<double>& position, std::vector<double>& euler);
|
||||
|
||||
/**
|
||||
* @brief 逆运动学计算
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param initial_joints 初始关节角度(弧度),用于求解器迭代
|
||||
* @param position 目标位置(x, y, z,单位:米)
|
||||
* @param euler 目标欧拉角(roll, pitch, yaw,单位:弧度)
|
||||
* @param result_joints 返回的7个关节角度解(弧度)
|
||||
* @return true 求解成功,false 求解失败
|
||||
*/
|
||||
LBOT_API bool lbot_inverse_kinematics(lbot_handle_t *handle, lbot_arm_t arm, const double initial_joints[7],
|
||||
const lbot_position_t* position, const lbot_euler_t* euler,
|
||||
double result_joints[7]);
|
||||
|
||||
/**
|
||||
* @brief 逆运动学计算(使用向量)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param initial_joints 初始关节角度(弧度)向量,用于求解器迭代
|
||||
* @param position 目标位置(x, y, z,单位:米)向量
|
||||
* @param euler 目标欧拉角(roll, pitch, yaw,单位:弧度)向量
|
||||
* @param result_joints 返回的7个关节角度解(弧度)向量
|
||||
* @return true 求解成功,false 求解失败
|
||||
*/
|
||||
LBOT_API bool lbot_inverse_kinematics(lbot_handle_t *handle, lbot_arm_t arm, const std::vector<double>& initial_joints,
|
||||
const std::vector<double>& position, const std::vector<double>& euler,
|
||||
std::vector<double>& result_joints);
|
||||
|
||||
// ==============================================
|
||||
// 工具坐标系管理函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 设置工具坐标系
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 工具坐标系名称(最大32字符)
|
||||
* @param position 工具坐标系相对于法兰盘的位置偏移(x, y, z,单位:米)
|
||||
* @param euler 工具坐标系相对于法兰盘的欧拉角偏移(roll, pitch, yaw,单位:弧度)
|
||||
* @return true 设置成功,false 设置失败
|
||||
*/
|
||||
LBOT_API bool lbot_set_tool_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name,
|
||||
const lbot_position_t* position, const lbot_euler_t* euler);
|
||||
|
||||
/**
|
||||
* @brief 设置工具坐标系(使用向量)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 工具坐标系名称(最大32字符)
|
||||
* @param position 工具坐标系相对于法兰盘的位置偏移(x, y, z,单位:米)向量
|
||||
* @param euler 工具坐标系相对于法兰盘的欧拉角偏移(roll, pitch, yaw,单位:弧度)向量
|
||||
* @return true 设置成功,false 设置失败
|
||||
*/
|
||||
LBOT_API bool lbot_set_tool_frame(lbot_handle_t *handle, lbot_arm_t arm, const std::string& name,
|
||||
const std::vector<double>& position, const std::vector<double>& euler);
|
||||
|
||||
/**
|
||||
* @brief 获取工具坐标系参数
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 工具坐标系名称
|
||||
* @param position 返回的工具坐标系位置偏移
|
||||
* @param euler 返回的工具坐标系欧拉角偏移
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_tool_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name,
|
||||
lbot_position_t* position, lbot_euler_t* euler);
|
||||
|
||||
/**
|
||||
* @brief 获取工具坐标系参数(使用向量)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 工具坐标系名称
|
||||
* @param position 返回的工具坐标系位置偏移向量
|
||||
* @param euler 返回的工具坐标系欧拉角偏移向量
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_tool_frame(lbot_handle_t *handle, lbot_arm_t arm, const std::string& name,
|
||||
std::vector<double>& position, std::vector<double>& euler);
|
||||
|
||||
/**
|
||||
* @brief 获取当前使用的工具坐标系
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 返回的当前工具坐标系名称
|
||||
* @param position 返回的当前工具坐标系位置偏移
|
||||
* @param euler 返回的当前工具坐标系欧拉角偏移
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_current_tool_frame(lbot_handle_t *handle, lbot_arm_t arm,
|
||||
std::string& name,
|
||||
lbot_position_t& position,
|
||||
lbot_euler_t& euler);
|
||||
|
||||
/**
|
||||
* @brief 获取当前使用的工具坐标系(使用向量)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 返回的当前工具坐标系名称
|
||||
* @param position 返回的当前工具坐标系位置偏移向量
|
||||
* @param euler 返回的当前工具坐标系欧拉角偏移向量
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_current_tool_frame(lbot_handle_t *handle, lbot_arm_t arm, std::string& name,
|
||||
std::vector<double>& position,
|
||||
std::vector<double>& euler);
|
||||
|
||||
/**
|
||||
* @brief 切换当前工具坐标系
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 要切换到的工具坐标系名称
|
||||
* @return true 切换成功,false 切换失败
|
||||
*/
|
||||
LBOT_API bool lbot_change_tool_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name);
|
||||
|
||||
/**
|
||||
* @brief 切换当前工具坐标系(使用string)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 要切换到的工具坐标系名称
|
||||
* @return true 切换成功,false 切换失败
|
||||
*/
|
||||
LBOT_API bool lbot_change_tool_frame(lbot_handle_t *handle, lbot_arm_t arm, const std::string& name);
|
||||
|
||||
/**
|
||||
* @brief 删除工具坐标系
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 要删除的工具坐标系名称
|
||||
* @return true 删除成功,false 删除失败
|
||||
*/
|
||||
LBOT_API bool lbot_delete_tool_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name);
|
||||
|
||||
/**
|
||||
* @brief 删除工具坐标系(使用string)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 要删除的工具坐标系名称
|
||||
* @return true 删除成功,false 删除失败
|
||||
*/
|
||||
LBOT_API bool lbot_delete_tool_frame(lbot_handle_t *handle, lbot_arm_t arm, const std::string& name);
|
||||
|
||||
/**
|
||||
* @brief 获取所有工具坐标系名称
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param names 返回的工具坐标系名称向量
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_all_tool_frames(lbot_handle_t *handle, lbot_arm_t arm, std::vector<std::string>& names);
|
||||
|
||||
// ==============================================
|
||||
// 工作坐标系管理函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 设置工作坐标系
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 工作坐标系名称(最大32字符)
|
||||
* @param position 工作坐标系相对于基坐标系的位置偏移(x, y, z,单位:米)
|
||||
* @param euler 工作坐标系相对于基坐标系的欧拉角偏移(roll, pitch, yaw,单位:弧度)
|
||||
* @return true 设置成功,false 设置失败
|
||||
*/
|
||||
LBOT_API bool lbot_set_work_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name,
|
||||
const lbot_position_t* position, const lbot_euler_t* euler);
|
||||
|
||||
/**
|
||||
* @brief 设置工作坐标系(使用向量)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 工作坐标系名称(最大32字符)
|
||||
* @param position 工作坐标系相对于基坐标系的位置偏移(x, y, z,单位:米)向量
|
||||
* @param euler 工作坐标系相对于基坐标系的欧拉角偏移(roll, pitch, yaw,单位:弧度)向量
|
||||
* @return true 设置成功,false 设置失败
|
||||
*/
|
||||
LBOT_API bool lbot_set_work_frame(lbot_handle_t *handle, lbot_arm_t arm, const std::string& name,
|
||||
const std::vector<double>& position, const std::vector<double>& euler);
|
||||
|
||||
/**
|
||||
* @brief 获取工作坐标系参数
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 工作坐标系名称
|
||||
* @param position 返回的工作坐标系位置偏移
|
||||
* @param euler 返回的工作坐标系欧拉角偏移
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_work_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name,
|
||||
lbot_position_t* position, lbot_euler_t* euler);
|
||||
|
||||
/**
|
||||
* @brief 获取工作坐标系参数(使用向量)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 工作坐标系名称
|
||||
* @param position 返回的工作坐标系位置偏移向量
|
||||
* @param euler 返回的工作坐标系欧拉角偏移向量
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_work_frame(lbot_handle_t *handle, lbot_arm_t arm, const std::string& name,
|
||||
std::vector<double>& position, std::vector<double>& euler);
|
||||
|
||||
/**
|
||||
* @brief 切换当前工作坐标系
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 要切换到的工作坐标系名称
|
||||
* @return true 切换成功,false 切换失败
|
||||
*/
|
||||
LBOT_API bool lbot_change_work_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name);
|
||||
|
||||
/**
|
||||
* @brief 切换当前工作坐标系(使用string)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 要切换到的工作坐标系名称
|
||||
* @return true 切换成功,false 切换失败
|
||||
*/
|
||||
LBOT_API bool lbot_change_work_frame(lbot_handle_t *handle, lbot_arm_t arm, const std::string& name);
|
||||
|
||||
/**
|
||||
* @brief 删除工作坐标系
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 要删除的工作坐标系名称
|
||||
* @return true 删除成功,false 删除失败
|
||||
*/
|
||||
LBOT_API bool lbot_delete_work_frame(lbot_handle_t *handle, lbot_arm_t arm, const char* name);
|
||||
|
||||
/**
|
||||
* @brief 删除工作坐标系(使用string)
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param name 要删除的工作坐标系名称
|
||||
* @return true 删除成功,false 删除失败
|
||||
*/
|
||||
LBOT_API bool lbot_delete_work_frame(lbot_handle_t *handle, lbot_arm_t arm, const std::string& name);
|
||||
|
||||
/**
|
||||
* @brief 获取所有工作坐标系名称
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param names 返回的工作坐标系名称向量
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_all_work_frames(lbot_handle_t *handle, lbot_arm_t arm, std::vector<std::string>& names);
|
||||
|
||||
// ==============================================
|
||||
// 系统功能函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 重新标定电机零位,设置当前位置为零位
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @return true 设置成功,false 设置失败
|
||||
*/
|
||||
LBOT_API bool lbot_set_zero(lbot_handle_t *handle, lbot_arm_t arm);
|
||||
|
||||
/**
|
||||
* @brief 使能/掉使能机械臂
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param enable true 使能,false 掉使能
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_enable_arm(lbot_handle_t *handle, lbot_arm_t arm, bool enable);
|
||||
|
||||
/**
|
||||
* @brief 紧急停止/恢复
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param enable true 紧急停止,false 恢复运行
|
||||
* @return true 指令发送成功,false 发送失败
|
||||
*/
|
||||
LBOT_API bool lbot_emergency_stop(lbot_handle_t *handle, lbot_arm_t arm, bool enable);
|
||||
|
||||
/**
|
||||
* @brief 清除所有错误
|
||||
* @param handle 机械臂句柄
|
||||
* @return true 清除成功,false 清除失败
|
||||
*/
|
||||
LBOT_API bool lbot_clear_errors(lbot_handle_t *handle);
|
||||
|
||||
/**
|
||||
* @brief 设置机械臂关节限位
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param upper_joint_limit 最大关节限位参数
|
||||
* @param lower_joint_limit 最小关节限位参数
|
||||
* @return true 设置成功,false 设置失败
|
||||
*/
|
||||
LBOT_API bool lbot_set_joint_limit(lbot_handle_t *handle, lbot_arm_t arm, const double upper_joint_limit[7], const double lower_joint_limit[7]);
|
||||
/**
|
||||
* @brief 获取机械臂关节限位参数
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param upper_joint_limit 返回的最大关节限位参数
|
||||
* @param lower_joint_limit 返回的最小关节限位参数
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_joint_limit(lbot_handle_t *handle, lbot_arm_t arm, double upper_joint_limit[7], double lower_joint_limit[7]);
|
||||
/**
|
||||
* @brief 获取机械臂默认关节限位参数
|
||||
* @param handle 机械臂句柄
|
||||
* @param arm 机械臂选择:LBOT_LEFT_ARM 或 LBOT_RIGHT_ARM
|
||||
* @param upper_joint_limit 返回的最大关节限位参数
|
||||
* @param lower_joint_limit 返回的最小关节限位参数
|
||||
* @return true 获取成功,false 获取失败
|
||||
*/
|
||||
LBOT_API bool lbot_get_default_joint_limit(lbot_handle_t *handle, lbot_arm_t arm, double upper_joint_limit[7], double lower_joint_limit[7]);
|
||||
|
||||
// ==============================================
|
||||
// 工具函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 获取最后一次错误信息
|
||||
* @return 错误信息字符串
|
||||
*/
|
||||
LBOT_API std::string lbot_get_last_error(lbot_handle_t *handle);
|
||||
|
||||
/**
|
||||
* @brief 设置日志级别
|
||||
* @param level 日志级别:0-ERROR, 1-WARN, 2-INFO, 3-DEBUG
|
||||
*/
|
||||
LBOT_API void lbot_set_log_level(int level);
|
||||
|
||||
// ==============================================
|
||||
// 内存管理辅助函数
|
||||
// ==============================================
|
||||
/**
|
||||
* @brief 释放字符串数组内存
|
||||
* @param array 要释放的字符串数组
|
||||
* @param count 数组元素数量
|
||||
*/
|
||||
LBOT_API void lbot_free_string_array(char** array, int count);
|
||||
|
||||
private:
|
||||
// 禁用拷贝构造和赋值操作
|
||||
LbotApi(const LbotApi&) = delete;
|
||||
LbotApi& operator=(const LbotApi&) = delete;
|
||||
};
|
||||
|
||||
} // namespace lbot
|
||||
|
||||
#endif // LBOT_API_CPP_H
|
||||
@@ -0,0 +1,99 @@
|
||||
/**
|
||||
* @file lbot_types.h
|
||||
* @brief 该文件定义了结构和枚举定义
|
||||
* @date 2026.1.19
|
||||
* @copyright 灵心巧手科技有限公司
|
||||
*/
|
||||
#ifndef LBOT_TYPES_H
|
||||
#define LBOT_TYPES_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
// 机械臂类型枚举
|
||||
typedef enum {
|
||||
LBOT_LEFT_ARM = 0,
|
||||
LBOT_RIGHT_ARM = 1
|
||||
} lbot_arm_t;
|
||||
|
||||
// 机械臂控制句柄
|
||||
typedef struct {
|
||||
uint64_t id; // 句柄ID,连接成功返回>0的值,0表示无效句柄
|
||||
}lbot_handle_t;
|
||||
|
||||
// 运动类型枚举
|
||||
typedef enum {
|
||||
LBOT_MOVE_JOINT = 0, // 关节空间运动
|
||||
LBOT_MOVE_POSE = 1, // 笛卡尔空间点到点
|
||||
LBOT_MOVE_LINEAR = 2 // 笛卡尔空间直线运动
|
||||
} lbot_move_type_t;
|
||||
|
||||
// 坐标系结构体
|
||||
typedef struct {
|
||||
double x, y, z;
|
||||
} lbot_position_t;
|
||||
|
||||
typedef struct {
|
||||
double x, y, z, w;
|
||||
} lbot_orientation_t;
|
||||
|
||||
typedef struct {
|
||||
double x, y, z;
|
||||
} lbot_euler_t;
|
||||
|
||||
// 关节状态结构体
|
||||
typedef struct {
|
||||
// 关节数据
|
||||
char name[7][32]; // 7个关节名称
|
||||
double joint_position[7]; // 7个关节位置
|
||||
double velocity[7]; // 7个关节速度
|
||||
double effort[7]; // 7个关节力矩
|
||||
double temperature[7]; // 7个关节温度
|
||||
|
||||
// 时间戳
|
||||
int32_t sec; // 秒
|
||||
uint32_t nanosec; // 纳秒
|
||||
char frame_id[64]; // 工作坐标系
|
||||
|
||||
// 末端状态
|
||||
lbot_position_t end_effector_position; // 末端位置
|
||||
lbot_euler_t euler; // 欧拉角
|
||||
lbot_orientation_t orientation; // 四元数姿态
|
||||
} lbot_arm_state_t;
|
||||
|
||||
// 机械臂完整状态结构体
|
||||
typedef struct {
|
||||
lbot_arm_state_t left_arm;
|
||||
lbot_arm_state_t right_arm;
|
||||
uint64_t system_timestamp; // 系统时间戳(纳秒)
|
||||
char arm_ip[16]; // 机械臂IP地址
|
||||
} lbot_full_state_t;
|
||||
|
||||
// 回调函数类型定义
|
||||
typedef void (*lbot_state_callback_t)(const lbot_full_state_t* state);
|
||||
typedef void (*lbot_error_callback_t)(int error_code, const char* error_msg);
|
||||
|
||||
|
||||
typedef enum {
|
||||
LBOT_FINGER_THUMB = 0, // 大拇指
|
||||
LBOT_FINGER_INDEX = 1, // 食指
|
||||
LBOT_FINGER_MID = 2, // 中指
|
||||
LBOT_FINGER_RING = 3, // 无名指
|
||||
LBOT_FINGER_LITTLE = 4 // 小指
|
||||
} lbot_finger_type_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t data[6]; // 单根手指各电机位置(指根、指尖、侧摆、旋转)
|
||||
lbot_finger_type_t finger; // 手指标识,0~4表示thumb,index,mid,ring,little
|
||||
} lbot_l20_series_cmd_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // LBOT_TYPES_H
|
||||
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* @file lbot_version.h
|
||||
* @brief 该文件指定API版本号
|
||||
* @date 2026.1.19
|
||||
* @copyright 灵心巧手科技有限公司
|
||||
*/
|
||||
#ifndef LBOT_VERSION_H
|
||||
#define LBOT_VERSION_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define SDK_VERSION ("1.0.5")
|
||||
#define SDK_BUILD_TIME ("2026.4.30")
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,67 @@
|
||||
cmake_minimum_required(VERSION 3.8)
|
||||
project(lbot_arm_driver)
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
add_compile_options(-Wall -Wextra -Wpedantic)
|
||||
endif()
|
||||
|
||||
# find dependencies
|
||||
find_package(ament_cmake REQUIRED)
|
||||
find_package(rclcpp REQUIRED)
|
||||
find_package(std_msgs REQUIRED)
|
||||
find_package(msgs REQUIRED)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
set(LBOT_SDK_DIR "${CMAKE_CURRENT_SOURCE_DIR}/C++")
|
||||
set(LBOT_SDK_INCLUDE_DIR "${LBOT_SDK_DIR}/include")
|
||||
|
||||
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64")
|
||||
set(LBOT_TARGET_ARCH "linux_x64")
|
||||
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "arm64")
|
||||
set(LBOT_TARGET_ARCH "linux_arm64")
|
||||
else()
|
||||
set(LBOT_TARGET_ARCH "linux_x64")
|
||||
endif()
|
||||
|
||||
set(LBOT_SDK_LIB_DIR "${LBOT_SDK_DIR}/libs/linux/${LBOT_TARGET_ARCH}")
|
||||
find_library(LBOT_API_CPP_LIBRARY NAMES lbot_api_cpp PATHS "${LBOT_SDK_LIB_DIR}" REQUIRED)
|
||||
|
||||
add_executable(arm_drivers src/arm_drivers.cpp)
|
||||
target_include_directories(arm_drivers PRIVATE
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include"
|
||||
"${LBOT_SDK_INCLUDE_DIR}"
|
||||
)
|
||||
target_link_libraries(arm_drivers "${LBOT_API_CPP_LIBRARY}")
|
||||
ament_target_dependencies(arm_drivers rclcpp std_msgs msgs)
|
||||
|
||||
set_target_properties(arm_drivers PROPERTIES
|
||||
BUILD_RPATH "${LBOT_SDK_LIB_DIR}"
|
||||
INSTALL_RPATH "$ORIGIN"
|
||||
)
|
||||
|
||||
install(TARGETS arm_drivers
|
||||
DESTINATION lib/${PROJECT_NAME}
|
||||
)
|
||||
|
||||
install(FILES
|
||||
"${LBOT_SDK_LIB_DIR}/liblbot_api_cpp.so"
|
||||
"${LBOT_SDK_LIB_DIR}/liblbot_api_cpp.so.1"
|
||||
"${LBOT_SDK_LIB_DIR}/liblbot_api_cpp.so.1.0.5"
|
||||
DESTINATION lib/${PROJECT_NAME}
|
||||
)
|
||||
|
||||
if(BUILD_TESTING)
|
||||
find_package(ament_lint_auto REQUIRED)
|
||||
# the following line skips the linter which checks for copyrights
|
||||
# comment the line when a copyright and license is added to all source files
|
||||
set(ament_cmake_copyright_FOUND TRUE)
|
||||
# the following line skips cpplint (only works in a git repo)
|
||||
# comment the line when this package is in a git repo and when
|
||||
# a copyright and license is added to all source files
|
||||
set(ament_cmake_cpplint_FOUND TRUE)
|
||||
ament_lint_auto_find_test_dependencies()
|
||||
endif()
|
||||
|
||||
ament_package()
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0"?>
|
||||
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
|
||||
<package format="3">
|
||||
<name>lbot_arm_driver</name>
|
||||
<version>0.0.0</version>
|
||||
<description>TODO: Package description</description>
|
||||
<maintainer email="wpz@todo.todo">wpz</maintainer>
|
||||
<license>TODO: License declaration</license>
|
||||
|
||||
<buildtool_depend>ament_cmake</buildtool_depend>
|
||||
|
||||
<depend>rclcpp</depend>
|
||||
<depend>std_msgs</depend>
|
||||
<depend>msgs</depend>
|
||||
|
||||
<test_depend>ament_lint_auto</test_depend>
|
||||
<test_depend>ament_lint_common</test_depend>
|
||||
|
||||
<export>
|
||||
<build_type>ament_cmake</build_type>
|
||||
</export>
|
||||
</package>
|
||||
@@ -0,0 +1,178 @@
|
||||
#include <array>
|
||||
#include <chrono>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
#include "lbot_api_cpp.h"
|
||||
#include "msgs/msg/dual_arm_state.hpp"
|
||||
#include "rclcpp/rclcpp.hpp"
|
||||
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
namespace
|
||||
{
|
||||
constexpr char kRobotIp[] = "192.168.10.21";
|
||||
|
||||
void state_callback(const lbot_full_state_t *) {}
|
||||
|
||||
void error_callback(int error_code, const char * error_msg)
|
||||
{
|
||||
RCLCPP_ERROR(rclcpp::get_logger("lbot_arm_driver"), "LBOT error %d: %s", error_code, error_msg);
|
||||
}
|
||||
|
||||
template<typename ArrayT>
|
||||
void copy7(ArrayT & dst, const double src[7])
|
||||
{
|
||||
for (size_t i = 0; i < 7; ++i) {
|
||||
dst[i] = src[i];
|
||||
}
|
||||
}
|
||||
|
||||
void fill_arm_state(
|
||||
const lbot_arm_state_t & src,
|
||||
std::array<double, 3> & end_position,
|
||||
std::array<double, 3> & end_euler,
|
||||
std::array<double, 4> & end_orientation,
|
||||
std::array<double, 7> & joint_position,
|
||||
std::array<double, 7> & joint_velocity,
|
||||
std::array<double, 7> & joint_current)
|
||||
{
|
||||
end_position = {
|
||||
src.end_effector_position.x,
|
||||
src.end_effector_position.y,
|
||||
src.end_effector_position.z,
|
||||
};
|
||||
end_euler = {src.euler.x, src.euler.y, src.euler.z};
|
||||
end_orientation = {
|
||||
src.orientation.x,
|
||||
src.orientation.y,
|
||||
src.orientation.z,
|
||||
src.orientation.w,
|
||||
};
|
||||
copy7(joint_position, src.joint_position);
|
||||
copy7(joint_velocity, src.velocity);
|
||||
copy7(joint_current, src.effort);
|
||||
}
|
||||
} // namespace
|
||||
|
||||
class LbotArmDriver : public rclcpp::Node
|
||||
{
|
||||
public:
|
||||
LbotArmDriver()
|
||||
: Node("lbot_arm_driver")
|
||||
{
|
||||
state_pub_ = create_publisher<msgs::msg::DualArmState>("lbot/dual_arm_state", 10);
|
||||
|
||||
handle_ = api_.lbot_init(kRobotIp);
|
||||
if (handle_ == nullptr || handle_->id == 0) {
|
||||
RCLCPP_ERROR(get_logger(), "Failed to connect LBOT arm at %s", kRobotIp);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!api_.lbot_start_state_monitor(state_callback, error_callback)) {
|
||||
RCLCPP_ERROR(get_logger(), "Failed to start LBOT state monitor: %s", api_.lbot_get_last_error(handle_).c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
feedback_timer_ = create_wall_timer(20ms, std::bind(&LbotArmDriver::publish_feedback, this));
|
||||
control_timer_ = create_wall_timer(5ms, std::bind(&LbotArmDriver::send_control, this));
|
||||
}
|
||||
|
||||
~LbotArmDriver() override
|
||||
{
|
||||
api_.lbot_stop_state_monitor();
|
||||
if (handle_ != nullptr && handle_->id != 0) {
|
||||
api_.lbot_disconnect(handle_);
|
||||
}
|
||||
api_.lbot_cleanup();
|
||||
}
|
||||
|
||||
private:
|
||||
struct ControlBuffer
|
||||
{
|
||||
std::array<double, 7> left_target_position{};
|
||||
std::array<double, 7> left_target_velocity{};
|
||||
std::array<double, 7> left_target_acceleration{};
|
||||
std::array<double, 7> right_target_position{};
|
||||
std::array<double, 7> right_target_velocity{};
|
||||
std::array<double, 7> right_target_acceleration{};
|
||||
double left_speed{0.0};
|
||||
double left_accel{0.0};
|
||||
double right_speed{0.0};
|
||||
double right_accel{0.0};
|
||||
};
|
||||
|
||||
void publish_feedback()
|
||||
{
|
||||
if (handle_ == nullptr || handle_->id == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
lbot_full_state_t feedback_buffer{};
|
||||
if (!api_.lbot_get_current_state(handle_, &feedback_buffer)) {
|
||||
RCLCPP_WARN_THROTTLE(
|
||||
get_logger(), *get_clock(), 1000, "Failed to get LBOT state: %s",
|
||||
api_.lbot_get_last_error(handle_).c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
msgs::msg::DualArmState msg;
|
||||
msg.header.stamp = now();
|
||||
msg.header.frame_id = "lbot_base";
|
||||
msg.system_timestamp = feedback_buffer.system_timestamp;
|
||||
msg.arm_ip = feedback_buffer.arm_ip;
|
||||
|
||||
fill_arm_state(
|
||||
feedback_buffer.left_arm,
|
||||
msg.left_end_position,
|
||||
msg.left_end_euler,
|
||||
msg.left_end_orientation,
|
||||
msg.left_joint_position,
|
||||
msg.left_joint_velocity,
|
||||
msg.left_joint_current);
|
||||
fill_arm_state(
|
||||
feedback_buffer.right_arm,
|
||||
msg.right_end_position,
|
||||
msg.right_end_euler,
|
||||
msg.right_end_orientation,
|
||||
msg.right_joint_position,
|
||||
msg.right_joint_velocity,
|
||||
msg.right_joint_current);
|
||||
|
||||
state_pub_->publish(msg);
|
||||
}
|
||||
|
||||
void send_control()
|
||||
{
|
||||
if (handle_ == nullptr || handle_->id == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
ControlBuffer control_buffer = control_buffer_;
|
||||
(void)control_buffer;
|
||||
|
||||
// 目标控制量订阅节点完成后,在这里把 control_buffer 写入 SDK。
|
||||
// 当前按需求暂时不向机器人发送控制指令。
|
||||
// api_.lbot_move_joint(
|
||||
// handle_, LBOT_LEFT_ARM, control_buffer.left_target_position.data(),
|
||||
// control_buffer.left_speed, control_buffer.left_accel, false);
|
||||
// api_.lbot_move_joint(
|
||||
// handle_, LBOT_RIGHT_ARM, control_buffer.right_target_position.data(),
|
||||
// control_buffer.right_speed, control_buffer.right_accel, false);
|
||||
}
|
||||
|
||||
lbot::LbotApi api_;
|
||||
lbot_handle_t * handle_{nullptr};
|
||||
ControlBuffer control_buffer_{};
|
||||
rclcpp::Publisher<msgs::msg::DualArmState>::SharedPtr state_pub_;
|
||||
rclcpp::TimerBase::SharedPtr feedback_timer_;
|
||||
rclcpp::TimerBase::SharedPtr control_timer_;
|
||||
};
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
rclcpp::init(argc, argv);
|
||||
rclcpp::spin(std::make_shared<LbotArmDriver>());
|
||||
rclcpp::shutdown();
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
cmake_minimum_required(VERSION 3.8)
|
||||
project(msgs)
|
||||
|
||||
find_package(ament_cmake REQUIRED)
|
||||
find_package(rosidl_default_generators REQUIRED)
|
||||
find_package(std_msgs REQUIRED)
|
||||
|
||||
rosidl_generate_interfaces(${PROJECT_NAME}
|
||||
"msg/DualArmState.msg"
|
||||
DEPENDENCIES std_msgs
|
||||
)
|
||||
|
||||
ament_export_dependencies(rosidl_default_runtime)
|
||||
ament_package()
|
||||
@@ -0,0 +1,18 @@
|
||||
std_msgs/Header header
|
||||
|
||||
uint64 system_timestamp
|
||||
string arm_ip
|
||||
|
||||
float64[3] left_end_position
|
||||
float64[3] left_end_euler
|
||||
float64[4] left_end_orientation
|
||||
float64[7] left_joint_position
|
||||
float64[7] left_joint_velocity
|
||||
float64[7] left_joint_current
|
||||
|
||||
float64[3] right_end_position
|
||||
float64[3] right_end_euler
|
||||
float64[4] right_end_orientation
|
||||
float64[7] right_joint_position
|
||||
float64[7] right_joint_velocity
|
||||
float64[7] right_joint_current
|
||||
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0"?>
|
||||
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
|
||||
<package format="3">
|
||||
<name>msgs</name>
|
||||
<version>0.0.0</version>
|
||||
<description>LBot arm bridge messages</description>
|
||||
<maintainer email="wpz@todo.todo">wpz</maintainer>
|
||||
<license>TODO: License declaration</license>
|
||||
|
||||
<buildtool_depend>ament_cmake</buildtool_depend>
|
||||
<build_depend>rosidl_default_generators</build_depend>
|
||||
<exec_depend>rosidl_default_runtime</exec_depend>
|
||||
<depend>std_msgs</depend>
|
||||
|
||||
<member_of_group>rosidl_interface_packages</member_of_group>
|
||||
|
||||
<export>
|
||||
<build_type>ament_cmake</build_type>
|
||||
</export>
|
||||
</package>
|
||||
@@ -0,0 +1,25 @@
|
||||
cmake_minimum_required(VERSION 3.8)
|
||||
project(onnx_handle_node)
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
add_compile_options(-Wall -Wextra -Wpedantic)
|
||||
endif()
|
||||
|
||||
# find dependencies
|
||||
find_package(ament_cmake REQUIRED)
|
||||
find_package(rclcpp REQUIRED)
|
||||
find_package(std_msgs REQUIRED)
|
||||
|
||||
if(BUILD_TESTING)
|
||||
find_package(ament_lint_auto REQUIRED)
|
||||
# the following line skips the linter which checks for copyrights
|
||||
# comment the line when a copyright and license is added to all source files
|
||||
set(ament_cmake_copyright_FOUND TRUE)
|
||||
# the following line skips cpplint (only works in a git repo)
|
||||
# comment the line when this package is in a git repo and when
|
||||
# a copyright and license is added to all source files
|
||||
set(ament_cmake_cpplint_FOUND TRUE)
|
||||
ament_lint_auto_find_test_dependencies()
|
||||
endif()
|
||||
|
||||
ament_package()
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0"?>
|
||||
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
|
||||
<package format="3">
|
||||
<name>onnx_handle_node</name>
|
||||
<version>0.0.0</version>
|
||||
<description>TODO: Package description</description>
|
||||
<maintainer email="wpz@todo.todo">wpz</maintainer>
|
||||
<license>TODO: License declaration</license>
|
||||
|
||||
<buildtool_depend>ament_cmake</buildtool_depend>
|
||||
|
||||
<depend>rclcpp</depend>
|
||||
<depend>std_msgs</depend>
|
||||
|
||||
<test_depend>ament_lint_auto</test_depend>
|
||||
<test_depend>ament_lint_common</test_depend>
|
||||
|
||||
<export>
|
||||
<build_type>ament_cmake</build_type>
|
||||
</export>
|
||||
</package>
|
||||
Reference in New Issue
Block a user