当前加入了机械臂状态接收和位置控制的链路

This commit is contained in:
2026-09-16 14:31:40 +08:00
parent 15745492d7
commit 0093ba6845
21 changed files with 13747 additions and 0 deletions
+172
View File
@@ -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
+491
View File
@@ -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.
+67
View File
@@ -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()
+22
View File
@@ -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>
+178
View File
@@ -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;
}
+14
View File
@@ -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()
+18
View File
@@ -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
+20
View File
@@ -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>
+25
View File
@@ -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()
+21
View File
@@ -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>