👉SDK C/C++
本SDK开发包旨在为傲意灵巧手的二次开发提供便捷的C/C++接口与配套示例代码. 通过示例代码, 用户能够轻松实现对灵巧手的手指精准控制、设备状态监控、参数灵活配置等一系列核心功能, 助力开发者快速搭建应用、缩短开发周期.
👉下载SDK
-
方法一: 点击此链接下载
-
方法二: 访问ohand_serial_sdk_python github网址下载最新版本
-
方法三: 通过clone获取:
git clone https://github.com/oymotion/ohand_serial_sdk
👉示例简介
以下示例程序围绕傲意灵巧手核心功能开发需求设计,覆盖从基础控制到进阶配置的全场景应用. 每个示例均提供完整可运行的 C/C++ 代码,包含清晰的接口调用逻辑与流程注释,开发者可直接编译运行验证功能,也能基于示例代码快速适配自身应用场景.
1. custom_cmd_test
该示例程序支持UART与CAN端口与设备通讯, 支持客制化接口, 实现高速读写灵巧手相关控制参数功能. 适用于需要精细调整设备运行参数、实时获取核心控制数据的场景,为个性化功能开发提供底层参数操作支持.
2.grip_exec
该示例程序基于已定义的手势实现了对灵巧手的控制, 包含了完整的通讯建立和状态检查等功能.
3.set_id
该示例程序允许用户通过输入ID号来设置灵巧手的ID, 实现灵活的设备管理.
4.simple_control
该示例程序支持UART与CAN端口与设备通讯, 通过循环手势动作实现了双协议对灵巧手简单的控制. 代码轻量化、易理解,适合开发者快速熟悉双协议通讯流程,为复杂控制场景搭建基础框架.
👉开发包使用说明
Windows环境使用说明
1. 支持的编译器
-
MSVC版本: MSVC 2019/2022版本, 与Windows系统兼容性好,且支持最新的C语言标准, 能满足开发中的编译需求.
-
cmake 版本: 3.5及以上
-
c++ 版本: c++11及以上
2. 开发包说明
- 头文件: C语言开发包含以下头文件:
-
log.h: 日志模块头文件, 提供了日志级别控制函数
-
OHandGripExec.h: 定义了多种手势, 为已定义的手势控制提供了执行函数
-
OHandSerialAPI.h: 灵巧手接口头文件, 定义了灵巧手操作的相关函数
-
动态链接库(DLLs): 包含了控制灵巧手所需的函数和接口, 包含了以下两个版本:
-
debug: 适用Windows 64位编译器的调试版本,包含调试信息,适合开发阶段使用
-
release: 适用Windows 64位编译器的发布版本,经过优化,不含调试信息,适合部署运行
Linux环境使用说明
1. 支持的架构
-
x86: 标准的Intel和AMD处理器架构
-
ARM: 适用于ARM架构的处理器
2. 编译器
- GCC: GNU Compiler Collection(GCC)是Linux下广泛使用的开源编译器集合. 编译器要求GCC版本为11.4及以上版本, 以确保最佳的性能和兼容性
3. 系统版本
- Ubuntu 22.04: 基于Ubuntu 22.04的Linux系统, 包含了GCC 11版本及以上的编译器
4. 开发包说明
-
头文件: 与Windows头文件相同, 详情见Windows环境的开发包说明
-
库文件(.a文件): 包含了控制灵巧手所需的函数和接口
👉使用示例-MSVC
示例项目: simple_control, 环境准备:
-
项目路径位于d 盘分区下
-
Visual Studio community 2022 版本:
-
在安装时, 选择安装使用C++的桌面开发
-
MSVC 2022版本
1. 说明
本示例项目使用Microsoft Visual Studio C/C++开发, 旨在演示程序控制灵巧手的简单实现过程.
2. 安装serial库
点击此链接serial 或 serial(离线压缩包) 下载开源项目, 打开在目录下的visual_studio/visual_studio.sln, 然后编译. 将编译好的文件夹放于与该项目相同的分区下, 您的serial文件夹结构应该如下所示:
d:\serial
├─include
│ └─serial
│ │ serial.h
│ │ v8stdint.h
│ │
│ └─impl
│ unix.h
│ win.h
│
└─lib
├─Debug
│ serial.idb
│ serial.lib
│ serial.pdb
│
└─Release
serial.lib
serial.pdb
3. 安装PCAN-USB驱动
点击此链接PCAN-USB下载并安装PCAN-USB驱动.
4. 安装PCAN-Basic库
点击此链接PCAN-Basic下载并解压PCAN-Basic库. 将其置于与该项目相同的分区下, 路径应如下所示: d:\PCAN-Basic
5. 编译
在main.cpp中可通过宏定义PORT_TYPE来修改协议类型, 如:
-
RS485:
PORT_TYPE = PORT_TYPE_UART -
CAN:
PORT_TYPE = PORT_TYPE_CAN
打开命令行窗口, 执行以下操作:
-
进入项目目录并编译
cd path\to\project md build cd build cmake .. -
编译Debug版本
cmake --build . --config Debug
- 编译Release版本
cmake --build . --config Release
6. 运行
打开命令窗口, 执行以下操作:
- 进入Debug或Release目录
cd path\to\project\build\Debug
- 运行程序(serial), 将COMx替换为实际的串口号
simple_control COMx
- 运行程序(can), 将x替换为1-16的实际的can口号
simple_control x
👉接口说明
头文件保护与外部声明
防止头文件被重复包含,同时支持 C++ 编译器对 C 代码的兼容处理
#ifndef __HAND_SERIAL_API_H__
#define __HAND_SERIAL_API_H__
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif //__HAND_SERIAL_API_H__
基础类型定义
#ifndef NULL
#define NULL ((void*)0)
#endif
#ifndef BOOL
#define BOOL uint8_t
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
常量定义
#define MAX_THUMB_ROOT_POS 3
#define MAX_MOTOR_CNT 6
#define MAX_FORCE_ENTRIES 12 * 5 /* Max force entries for one finger */
-
MAX_THUMB_ROOT_POS: 大拇指根部旋转对应的最大挡位
-
MAX_MOTOR_CNT: 最大电机数量
-
MAX_FORCE_ENTRIES: 单根手指最大力传感器数据条目数
协议版本
协议主版本号
#define PROTOCOL_VERSION_MAJOR 3
枚举定义
typedef enum
{
HAND_PROTOCOL_UART,
HAND_PROTOCOL_I2C
} HAND_PROTOCOL;
- 定义手部设备支持的通信协议类型,包括 UART 和 I2C 两种
错误代码定义
1. 协议相关错误
#define ERR_PROTOCOL_WRONG_LRC 0x01
- ERR_PROTOCOL_WRONG_LRC: LRC校验错误
2. 命令相关错误
#define ERR_COMMAND_INVALID 0x11
#define ERR_COMMAND_INVALID_BYTE_COUNT 0x12
#define ERR_COMMAND_INVALID_DATA 0x13
-
ERR_COMMAND_INVALID: 无效命令
-
ERR_COMMAND_INVALID_BYTE_COUNT: 命令字节数无效
-
ERR_COMMAND_INVALID_DATA: 命令数据无效
3. 状态相关错误
#define ERR_STATUS_INIT 0x21
#define ERR_STATUS_CALI 0x22
#define ERR_STATUS_STUCK 0x23
-
ERR_STATUS_INIT: 初始化状态错误
-
ERR_STATUS_CALI: 校准状态错误
-
ERR_STATUS_STUCK: 电机卡住错误
4. 操作结果相关错误
#define ERR_OP_FAILED 0x31
#define ERR_SAVE_FAILED 0x32
-
ERR_OP_FAILED: 操作失败
-
ERR_SAVE_FAILED: 保存失败
设备操作返回值
#define HAND_RESP_HAND_ERROR 0xFF /* device error, error call back will be called with OHand error codes listed above */
#define HAND_RESP_SUCCESS 0x00
#define HAND_RESP_TIMER_FUNC_NOT_SET 0x01 /* local error, timer function not set, call HAND_SetTimerFunction(...) first */
#define HAND_RESP_INVALID_CONTEXT 0x02 /* local error, invalid context, NULL or send data function not set */
#define HAND_RESP_TIMEOUT 0x03 /* local error, time out when waiting node response */
#define HAND_RESP_INVALID_OUT_BUFFER_SIZE 0x04 /* local error, out buffer size not matched to returned data */
#define HAND_RESP_UNMATCHED_ADDR 0x05 /* local error, unmatched node id between returned and waiting */
#define HAND_RESP_UNMATCHED_CMD 0x06 /* local error, unmatched command between returned and waiting */
#define HAND_RESP_DATA_SIZE_TOO_BIG 0x07 /* local error, size of data to send exceeds the buffer size */
#define HAND_RESP_DATA_INVALID 0x08 /* local error, data content invalid */
-
HAND_RESP_HAND_ERROR: 设备错误, 需通过回调获取具体错误码
-
HAND_RESP_SUCCESS: 设备操作成功
-
HAND_RESP_TIMER_FUNC_NOT_SET: 定时器函数未设置, 需调用 HAND_SetTimerFunction ()设置回调函数
-
HAND_RESP_INVALID_CONTEXT: 无效上下文, 上下文为 NULL 或发送函数未设置
-
HAND_RESP_TIMEOUT: 超时错误, 等待节点响应超时
-
HAND_RESP_INVALID_OUT_BUFFER_SIZE: 输出缓冲区大小不匹配
-
HAND_RESP_UNMATCHED_ADDR: 节点地址不匹配
-
HAND_RESP_UNMATCHED_CMD: 命令不匹配
-
HAND_RESP_DATA_SIZE_TOO_BIG: 数据大小超限, 发送数据超过缓冲区大小
-
HAND_RESP_DATA_INVALID: 数据内容无效
自定义命令子命令
用于HAND_SetCustom(), 实现高速读写灵巧手相关控制参数功能
#define SUB_CMD_SET_SPEED (1 << 0)
#define SUB_CMD_SET_POS (1 << 1)
#define SUB_CMD_SET_ANGLE (1 << 2)
#define SUB_CMD_GET_POS (1 << 3)
#define SUB_CMD_GET_ANGLE (1 << 4)
#define SUB_CMD_GET_CURRENT (1 << 5)
#define SUB_CMD_GET_FORCE (1 << 6)
#define SUB_CMD_GET_STATUS (1 << 7)
创建上下文 HAND_CreateContext()
-
方法原型:
void *HAND_CreateContext( const void *ctx_private_data, HAND_PROTOCOL protocol, uint8_t address_master, void (*SendDataImpl)(uint8_t addr, uint8_t *data, uint8_t size, void *ctx), void (*RecvDataImpl)(void *ctx) ) -
参数说明:
参数 说明 ctx_private_data上下文私有数据(如串口实例地址) protocol通信协议(UART 或 I2C) address_master主节点地址 SendDataImpl发送数据函数指针 RecvDataImpl接收数据函数指针 -
返回值:
成功: 返回上下文指针
失败: 返回 NULL -
使用示例
void* port = NULL; void* hand_ctx = NULL; void* init(const char* port_name, uint32_t baudrate) { // 此处省略串口初始化代码 return port; } void send_data(uint8_t addr, uint8_t* data, uint8_t len, void* hand_ctx) { // 此处省略发数据逻辑 } void recv_data(void* hand_ctx) { // 此处省略收数据逻辑 } port = init(port_name, baud_rate); // 初始化串口 hand_ctx = HAND_CreateContext(port, HAND_PROTOCOL_UART, ADDRESS_MASTER, send_data, recv_data);
释放上下文指针 HAND_FreeContext()
-
方法原型:
void HAND_FreeContext(void *ctx) -
参数说明:
参数 说明 ctxOHAND上下文指针 -
使用示例
HAND_FreeContext(hand_ctx);
定时器设置HAND_SetTimerFunction()
-
方法原型:
void HAND_SetTimerFunction(uint32_t (*GetMilliSecondsImpl)(void), void (*DelayMilliSecondsImpl)(uint32_t ms)) -
参数说明:
参数 说明 GetMilliSecondsImpl获取毫秒数的函数指针 DelayMilliSecondsImpl毫秒级延迟函数指针 -
使用示例
uint32_t millis() { chrono::time_point<chrono::system_clock, chrono::milliseconds> tp = chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now()); auto tmp = chrono::duration_cast<chrono::milliseconds>(tp.time_since_epoch()); time_t timestamp = tmp.count(); static uint64_t startTime = (uint64_t)timestamp; return (uint32_t)(timestamp - startTime); } void delay(uint32_t millisecondsToWait) { this_thread::sleep_for(chrono::milliseconds(millisecondsToWait)); } HAND_SetTimerFunction(millis, delay);
获取时间戳HAND_GetTick()
-
方法原型:
uint32_t HAND_GetTick(void) -
使用示例
uint32_t current_tick = HAND_GetTick();
设置超时时间命令HAND_SetCommandTimeOut()
-
方法原型:
void HAND_SetCommandTimeOut(void *ctx, uint16_t timeout) -
参数说明:
参数 说明 ctxOHand 上下文指针 timeout超时时间(毫秒) -
使用示例
HAND_SetCommandTimeOut(hand_ctx, 255); // 设置超时时间为255毫秒
数据处理HAND_OnData()
-
方法原型:
void HAND_OnData(void *ctx, uint8_t data) -
作用: 将接收到的数据送入内部解析器, 应在接收函数(RecvDataImpl)或中断服务程序(ISR)中调用
-
参数说明:
参数 说明 ctxOHand 上下文指针 data接收到的字节数据 -
使用示例
// 假设使用端口为serial void RecvData(void *ctx) { uint8_t data = 0; auto port = *(serial::Serial**)hand_ctx; while (port->available() != 0) { port->read(&data, 1); HAND_OnData(hand_ctx, data); } }
获取协议版本HAND_GetProtocolVersion()
-
方法原型:
uint8_t HAND_GetProtocolVersion(void *ctx, uint8_t hand_id, uint8_t *major, uint8_t *minor, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id major设备主版本号 minor设备次版本号 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例
uint8_t major_ver, minor_ver; uint8_t remote_err; uint8_t used_id = 0x02; test_err = HAND_GetProtocolVersion(hand_ctx, used_id, &major_ver, &minor_ver, &remote_err);
获取固件版本GetFirmwareVersion()
-
方法原型:
uint8_t HAND_GetFirmwareVersion(void *ctx, uint8_t hand_id, uint8_t *major, uint8_t *minor, uint16_t *revision, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id major设备主版本号 minor设备次版本号 revision设备修订版本号 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例
uint8_t major_ver, minor_ver; uint8_t remote_err; uint8_t used_id = 0x02; uint16_t revision; test_err = HAND_GetFirmwareVersion(hand_ctx, used_id, &major_ver, &minor_ver, &revision, &remote_err);
获取硬件版本HAND_GetHardwareVersion()
-
方法原型:
uint8_t HAND_GetHardwareVersion(void *ctx, uint8_t hand_id, uint8_t *hw_type, uint8_t *hw_ver, uint16_t *boot_version, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id hw_type设备硬件类型 hw_ver设备硬件版本号 boot_version设备启动程序版本号 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例
uint8_t hw_type, hw_ver; uint8_t remote_err; uint8_t used_id = 0x02; uint16_t boot_version; test_err = HAND_GetHardwareVersion(hand_ctx, used_id, &hw_type, &hw_ver, &boot_version, &remote_err);
获取矫正数据HAND_GetCaliData()
-
方法原型:
uint8_t HAND_GetCaliData(void *ctx, uint8_t hand_id, uint16_t *end_pos, uint16_t *start_pos, uint8_t *motor_cnt, uint16_t *thumb_root_pos, uint8_t *thumb_root_pos_cnt, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id end_pos存储终点位置的数组 start_pos存储起点位置的数组 motor_cnt电机数量 thumb_root_pos拇指根部位置的挡位数组(0, 1, 2) thumb_root_pos_cnt拇指根部位置的挡位数量 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint16_t end_pos[NUM_MOTORS]; uint16_t start_pos[NUM_MOTORS]; uint8_t motor_cnt = NUM_MOTORS; uint16_t thumb_root_pos[3]; uint8_t thumb_root_pos_cnt = 3; test_err = HAND_GetCaliData(hand_ctx, used_id, end_pos, start_pos, &motor_cnt, thumb_root_pos, &thumb_root_pos_cnt, &remote_err);
获取手指PIDHAND_GetFingerPID()
-
方法原型:
uint8_t HAND_GetFingerPID(void *ctx, uint8_t hand_id, uint8_t finger_id, float *p, float *i, float *d, float *g, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id p比例系数 i积分系数 d微分系数 g增益系数 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; float p, i, d, g; for (int finger_index = 0; finger_index < NUM_MOTORS; finger_index++) { delay(100); test_err = HAND_GetFingerPID(hand_ctx, used_id, finger_index, &p, &i, &d, &g, &remote_err); }
获取手指电流限制值HAND_GetFingerCurrentLimit()
-
方法原型:
uint8_t HAND_GetFingerCurrentLimit(void *ctx, uint8_t hand_id, uint8_t finger_id, uint16_t *current_limit, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id current_limit电流限制值 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint16_t current_limit; for (int finger_index = 0; finger_index < NUM_MOTORS; finger_index++) { delay(100); test_err = HAND_GetFingerCurrentLimit(hand_ctx, used_id, finger_index, ¤t_limit, &remote_err); }
获取手指电流值HAND_GetFingerCurrent()
-
方法原型:
uint8_t HAND_GetFingerCurrent(void *ctx, uint8_t hand_id, uint8_t finger_id, uint16_t *current, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id current手指电流值 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint16_t current; for (int finger_index = 0; finger_index < NUM_MOTORS; finger_index++) { delay(100); test_err = HAND_GetFingerCurrent(hand_ctx, used_id, finger_index, ¤t, &remote_err); }
获取手指目标力值HAND_GetFingerForceTarget()
-
方法原型:
uint8_t HAND_GetFingerForceTarget(void *ctx, uint8_t hand_id, uint8_t finger_id, uint16_t *force_target, uint8_t *remote_err) -
作用: 获取指定手指的目标力值设置,该值用于力控模式下的闭环控制(即设备会自动调节电机输出以维持此目标力)
-
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id force_target手指目标力值 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint16_t force_target; for (int finger_index = 0; finger_index < NUM_MOTORS; finger_index++) { delay(100); test_err = HAND_GetFingerForceTarget(hand_ctx, used_id, finger_index, &force_target, &remote_err); }
获取手指力传感器数据HAND_GetFingerForce()
-
方法原型:
uint8_t HAND_GetFingerForce(void *ctx, uint8_t hand_id, uint8_t finger_id, uint8_t *force_entry_cnt, uint8_t *force, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id force_entry_cnt力数据条目数量 force存储力数据的变量地址,可存储多点力值,或法向力、切向力及方向 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
#define NUM_MOTORS 6 #define MAX_FORCE_ENTRIES 12 * 5 /* Max force entries for one finger */ uint8_t remote_err; uint8_t used_id = 0x02; uint8_t force[MAX_FORCE_ENTRIES] = { 0 }; uint8_t force_entry_count; for (int finger_index = 0; finger_index < NUM_MOTORS; finger_index++) { force_entry_count = force_entries[finger_index]; delay(100); test_err = HAND_GetFingerForce(hand_ctx, used_id, finger_index, &force_entry_count, force, &remote_err); }
获取手指绝对位置限制值HAND_GetFingerPosLimit()
-
方法原型:
uint8_t HAND_GetFingerPosLimit(void *ctx, uint8_t hand_id, uint8_t finger_id, uint16_t *low_limit, uint16_t *high_limit, uint8_t *remote_err) -
作用: 获取指定手指的绝对位置限制范围,用于约束手指的运动区间
-
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id low_limit位置下限值 high_limit位置上限值 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint16_t low_limit, high_limit; for (int finger_index = 0; finger_index < NUM_MOTORS; finger_index++) { delay(100); test_err = HAND_GetFingerPosLimit(hand_ctx, used_id, finger_index, &low_limit, &high_limit, &remote_err); }
获取手指绝对位置HAND_GetFingerPosAbs()
-
方法原型:
uint8_t HAND_GetFingerPosAbs(void *ctx, uint8_t hand_id, uint8_t finger_id, uint16_t *target_pos, uint16_t *current_pos, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id target_pos目标绝对位置 current_pos当前绝对位置 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint16_t target_pos, current_pos; for (int finger_index = 0; finger_index < NUM_MOTORS; finger_index++) { delay(100); test_err = HAND_GetFingerPosAbs(hand_ctx, used_id, finger_index, &target_pos, ¤t_pos, &remote_err); }
获取手指逻辑位置HAND_GetFingerPos()
-
方法原型:
uint8_t HAND_GetFingerPos(void *ctx, uint8_t hand_id, uint8_t finger_id, uint16_t *target_pos, uint16_t *current_pos, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id target_pos逻辑目标位置 current_pos逻辑当前位置 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint16_t target_pos, current_pos; for (int finger_index = 0; finger_index < NUM_MOTORS; finger_index++) { delay(100); test_err = HAND_GetFingerPos(hand_ctx, used_id, finger_index, &target_pos, ¤t_pos, &remote_err); }
获取手指角度HAND_GetFingerAngle()
-
方法原型:
uint8_t HAND_GetFingerAngle(void *ctx, uint8_t hand_id, uint8_t finger_id, int16_t *target_angle, int16_t *current_angle, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id target_angle目标角度值, 单位:实际角度×100 current_angle当前角度值, 单位:实际角度×100 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; int16_t target_angle, current_angle; for (int finger_index = 0; finger_index < NUM_MOTORS; finger_index++) { delay(100); test_err = HAND_GetFingerAngle(hand_ctx, used_id, finger_index, &target_angle, ¤t_angle, &remote_err); }
获取拇指根部挡位位置HAND_GetThumbRootPos()
-
方法原型:
uint8_t HAND_GetThumbRootPos(void *ctx, uint8_t hand_id, uint16_t *raw_encoder, uint8_t *pos, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id raw_encoder指根部原始编码器值, 范围:0~65535 pos拇指根部映射位置, 范围: 0~2三个挡位 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
uint8_t remote_err; uint8_t used_id = 0x02; uint16_t raw_encoder; uint8_t pos; test_err = HAND_GetThumbRootPos(hand_ctx, used_id, &raw_encoder, &pos, &remote_err);
获取所有手指绝对位置HAND_GetFingerPosAbsAll()
-
方法原型:
uint8_t HAND_GetFingerPosAbsAll(void *ctx, uint8_t hand_id, uint16_t *target_pos, uint16_t *current_pos, uint8_t *motor_cnt, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id target_pos所有手指目标绝对位置的数组/td> current_pos所有手指当前绝对位置的数组 motor_cnt电机数量 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint8_t motor_cnt = NUM_MOTORS; uint16_t raw_target_pos[NUM_MOTORS], raw_current_pos[NUM_MOTORS]; test_err = HAND_GetFingerPosAbsAll(hand_ctx, used_id, raw_target_pos, raw_current_pos, &motor_cnt, &remote_err);
获取所有手指逻辑位置HAND_GetFingerPosAll()
-
方法原型:
uint8_t HAND_GetFingerPosAll(void *ctx, uint8_t hand_id, uint16_t *target_pos, uint16_t *current_pos, uint8_t *motor_cnt, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id target_pos所有手指目标逻辑位置的数组/td> current_pos所有手指当前逻辑位置的数组 motor_cnt电机数量 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint16_t raw_target_pos[NUM_MOTORS], raw_current_pos[NUM_MOTORS]; uint8_t motor_cnt = NUM_MOTORS; test_err = HAND_GetFingerPosAll(hand_ctx, used_id, raw_target_pos, raw_current_pos, &motor_cnt, &remote_err);
获取所有手指角度HAND_GetFingerAngleAll()
-
方法原型:
uint8_t HAND_GetFingerAngleAll(void *ctx, uint8_t hand_id, int16_t *target_angle, int16_t *current_angle, uint8_t *motor_cnt, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id target_angle所有手指目标角度值的数组, 单位:实际角度×100/td> current_angle所有手指当前角度值的数组, 单位:实际角度×100 motor_cnt电机数量 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint8_t motor_cnt = NUM_MOTORS; int16_t raw_target_angle[NUM_MOTORS], raw_current_angle[NUM_MOTORS]; test_err = HAND_GetFingerAngleAll(hand_ctx, used_id, raw_target_angle, raw_current_angle, &motor_cnt, &remote_err);
获取自检等级HAND_GetSelfTestLevel()
-
方法原型:
uint8_t HAND_GetSelfTestLevel(void *ctx, uint8_t hand_id, uint8_t *self_test_level, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id self_test_level自检等级: 0.不自动自检, 1.自动部分自检, 2.自动全面自检 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
uint8_t remote_err; uint8_t used_id = 0x02; uint8_t self_test_level; test_err = HAND_GetSelfTestLevel(hand_ctx, used_id, &self_test_level, &remote_err);
获取蜂鸣器开关状态HAND_GetBeepSwitch()
-
方法原型:
uint8_t HAND_GetBeepSwitch(void *ctx, uint8_t hand_id, uint8_t *beep_switch, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id beep_switch蜂鸣器开关状态: 0.关, 1.开 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
uint8_t beep_switch; uint8_t remote_err; uint8_t used_id = 0x02; test_err = HAND_GetBeepSwitch(hand_ctx, used_id, &beep_switch, &remote_err);
获取uidHAND_GetUID()
-
方法原型:
uint8_t HAND_GetUID(void *ctx, uint8_t hand_id, uint32_t *uid_w0, uint32_t *uid_w1, uint32_t *uid_w2, uint8_t *remote_err) -
作用: 获取手部设备的 96 位唯一标识符(UID),用于设备身份识别、唯一性验证等场景
-
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id uid_w0设备UID第0个字 uid_w1设备UID第1个字 uid_w0设备UID第2个字 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
uint32_t uid_w0, uid_w1, uid_w2; test_err = HAND_GetUID(hand_ctx, used_id, &uid_w0, &uid_w1, &uid_w2, &test_remote_err);
获取工厂数据HAND_GetManufactureData()
-
方法原型:
uint8_t HAND_GetManufactureData(void *ctx, uint8_t hand_id, uint8_t *data, uint8_t *data_size, uint8_t *remote_err) -
作用: 获取手部设备的制造商数据,通常包含设备生产相关的信息(如生产批次、校验信息等)
-
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id data制造商数据 data_size制造商数据实际长度 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
uint8_t data_size = 26; uint8_t* data = (uint8_t*)malloc(data_size * sizeof(uint8_t)); test_err = HAND_GetManufactureData(hand_ctx, used_id, data, &data_size, &test_remote_err);
获取厂商idHAND_GetVendorID()
-
方法原型:
uint8_t HAND_GetVendorID(void *ctx, uint8_t hand_id, uint16_t *vendor_id, uint8_t *remote_err) -
作用: 获取手部设备的厂商 ID(Vendor ID),用于标识设备的生产厂商,通常为厂商专属的唯一标识符
-
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id vendor_id厂商ID remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
uint16_t vendor_id; test_err = HAND_GetVendorID(hand_ctx, used_id, &vendor_id, &test_remote_err);
获取手指力控PID参数HAND_GetForcePID()
-
方法原型:
uint8_t HAND_GetForcePID(void *ctx, uint8_t hand_id, uint8_t finger_id, float *p, float *i, float *d, float *g, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id p比例系数 i积分系数 d微分系数 g增益系数 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
#define NUM_FINGERS 5 uint8_t remote_err; uint8_t used_id = 0x02; float p, i, d, g; for (int fingerIndex = 0; fingerIndex < NUM_FINGERS; fingerIndex++) { delay(100); test_err = HAND_GetForcePID(hand_ctx, used_id, fingerIndex, &p, &i, &d, &g, &remote_err); }
重启设备HAND_Reset()
-
方法原型:
uint8_t HAND_Reset(void *ctx, uint8_t hand_id, uint8_t mode, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id mode重置模式(0: 启动到用户代码;1:启动到DFU模式) remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
uint8_t remote_err; uint8_t used_id = 0x02; uint8_t mode = 0; test_err = HAND_Reset(hand_ctx, used_id, 0, &remote_err);
设置idHAND_SetID()
-
方法原型:
uint8_t HAND_SetID(void *ctx, uint8_t hand_id, uint8_t new_id, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id new_id新的设备ID remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
使用示例:
uint8_t remote_err; uint8_t used_id = 0x02; uint8_t new_id = 0x03; test_err = HAND_SetID(hand_ctx, used_id, new_id, &remote_err);
进入矫正模式HAND_Calibrate()
-
方法原型:
uint8_t HAND_Calibrate(void *ctx, uint8_t hand_id, uint16_t key, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id key矫正密钥 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
注意: 此功能暂不对外开放, 需要使用此功能时请联系技术支持
获取电池电压HAND_GetBatteryVoltage()
-
方法原型:
uint8_t HAND_GetBatteryVoltage(void *ctx, uint8_t hand_id, uint16_t *voltage, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id voltage电池电压 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
注意: 此功能仅对仿生手有效, 灵巧手无此功能
获取开机次数HAND_GetUsageStat()
- 方法原型:
uint8_t HAND_GetUsageStat(void *ctx, uint8_t hand_id, uint32_t *total_use_time, uint32_t *total_open_times, uint8_t motor_cnt, uint8_t *remote_err) - 参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id total_use_time设备的总使用时间 total_open_times各电机的总开机次数 motor_cnt电机数量 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
注意: 此功能仅对仿生手有效, 灵巧手无此功能
关机HAND_PowerOff()
-
方法原型:
uint8_t HAND_PowerOff(void *ctx, uint8_t hand_id, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
注意: 此功能仅对仿生手有效, 灵巧手无此功能
设置矫正数据HAND_SetCaliData()
-
方法原型:
uint8_t HAND_SetCaliData(void *ctx, uint8_t hand_id, uint16_t *end_pos, uint16_t *start_pos, uint8_t motor_cnt, uint16_t *thumb_root_pos, uint8_t thumb_root_pos_cnt, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id end_pos各电机的终点位置校准数据 start_pos各电机的起点位置校准数据 motor_cnt电机数量 thumb_root_pos拇指根部的预设位置校准数据 thumb_root_pos_cnt拇指根部预设位置的数量 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
注意: 此功能暂不对外开放, 需要使用此功能时请联系技术支持
设置手指PID参数HAND_SetFingerPID()
-
方法原型:
uint8_t HAND_SetFingerPID(void *ctx, uint8_t hand_id, uint8_t finger_id, float p, float i, float d, float g, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id p比例系数 i积分系数 d微分系数 g增益系数 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; static const float _pidGains[][4] = { {250.00, 2.00, 250.00, 1.00}, {250.00, 2.00, 250.00, 1.00}, {250.00, 2.00, 250.00, 1.00}, {250.00, 2.00, 250.00, 1.00}, {250.00, 2.00, 250.00, 1.00}, {250.00, 2.00, 250.00, 1.00} }; for (int i = 0; i < NUM_MOTORS; i++){ err = HAND_SetFingerPID(hand_ctx, used_id, i, _pidGains[i][0], _pidGains[i][1], _pidGains[i][2], _pidGains[i][3], &remote_err); }
设置手指电流限制值HAND_SetFingerCurrentLimit()
-
方法原型:
uint8_t HAND_SetFingerCurrentLimit(void *ctx, uint8_t hand_id, uint8_t finger_id, uint16_t current_limit, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id current_limit电流限制值 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint16_t current_limit_set = 200; for (int finger_index = 0; finger_index < NUM_MOTORS; finger_index++) { test_err = HAND_SetFingerCurrentLimit(hand_ctx, used_id, finger_index, current_limit_set, &remote_err); }
设置手指力反馈目标值HAND_SetFingerForceTarget()
-
方法原型:
uint8_t HAND_SetFingerForceTarget(void *ctx, uint8_t hand_id, uint8_t finger_id, uint16_t force_target, uint8_t *remote_err) -
作用: 设置指定手指的目标力值设置,该值用于力控模式下的闭环控制(即设备会自动调节电机输出以维持此目标力)
-
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id force_target目标力值,单位为 mN remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint16_t force_target_set = 200; for (int finger_index = 0; finger_index < NUM_FINGERS; finger_index++) { test_err = HAND_SetFingerForceTarget(hand_ctx, used_id, finger_index, force_target_set, &remote_err); }
设置手指绝对位置限制值HAND_SetFingerPosLimit()
-
方法原型:
uint8_t HAND_SetFingerPosLimit(void *ctx, uint8_t hand_id, uint8_t finger_id, uint16_t low_limit, uint16_t high_limit, uint8_t *remote_err) -
作用: 设置指定手指的绝对位置限制范围,用于约束手指的运动区间
-
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id low_limit绝对位置的下限值 high_limit绝对位置的上限值 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint16_t low_limit_set = 3800, high_limit_set = 16000; for (int finger_index = 0; finger_index < NUM_MOTORS; finger_index++) { test_err = HAND_SetFingerPosLimit(hand_ctx, used_id, finger_index, low_limit_set, high_limit_set, &remote_err); }
启动手指(卡顿时)HAND_FingerStart()
-
方法原型:
uint8_t HAND_FingerStart(void *ctx, uint8_t hand_id, uint8_t finger_id_bits, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id_bits手指对应的位掩码 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; const uint8_t finger_ids[NUM_MOTORS] = { 1, 2, 4, 6, 8, 10 }; for (int i = 0; i < NUM_MOTORS; i++) { test_err = HAND_FingerStart(hand_ctx, used_id, finger_index, &remote_err); }
停止手指HAND_FingerStop()
-
方法原型:
uint8_t HAND_FingerStop(void *ctx, uint8_t hand_id, uint8_t finger_id_bits, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id_bits手指对应的位掩码 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; const uint8_t finger_ids[NUM_MOTORS] = { 1, 2, 4, 6, 8, 10 }; for (int i = 0; i < NUM_MOTORS; i++) { test_err = HAND_FingerStop(hand_ctx, used_id, finger_index, &remote_err); }
设置手指绝对位置HAND_SetFingerPosAbs()
-
方法原型:
uint8_t HAND_SetFingerPosAbs(void *ctx, uint8_t hand_id, uint8_t finger_id, uint16_t raw_pos, uint8_t speed, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id raw_pos手指的绝对位置 speed运动速度 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint8_t speed = 255; uint16_t abs_pos_set = 16000; for (int finger_index = 0; finger_index < NUM_MOTORS; finger_index++) { test_err = HAND_SetFingerPosAbs(hand_ctx, used_id, finger_index, abs_pos_set, speed, &remote_err); }
设置手指逻辑位置HAND_SetFingerPos()
-
方法原型:
uint8_t HAND_SetFingerPos(void *ctx, uint8_t hand_id, uint8_t finger_id, uint16_t pos, uint8_t speed, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id pos目标逻辑位置 speed运动速度 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint8_t speed = 255; uint16_t pos_set = 58000; for (int finger_index = 0; finger_index < NUM_MOTORS; finger_index++) { test_err = HAND_SetFingerPos(hand_ctx, used_id, finger_index, pos_set, speed, &remote_err); }
设置手指角度HAND_SetFingerAngle()
-
方法原型:
uint8_t HAND_SetFingerAngle(void *ctx, uint8_t hand_id, uint8_t finger_id, int16_t angle, uint8_t speed, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id angle目标角度值, 值为实际角度 * 100 speed运动速度 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
uint8_t remote_err; uint8_t used_id = 0x02; uint8_t speed = 255; uint16_t four_finger_angle_set = 12000; uint16_t thumb_angle_set = 1500; uint16_t thumb_root_angle_set = 6000; for (int finger_index = 0; finger_index < NUM_MOTORS; finger_index++) { if (finger_index >= 1 && finger_index <= 4) { test_err = HAND_SetFingerAngle(hand_ctx, used_id, finger_index, four_finger_angle_set, speed, &remote_err); } else if (finger_index == 0) { test_err = HAND_SetFingerAngle(hand_ctx, used_id, finger_index, thumb_angle_set, speed, &remote_err); } else { test_err = HAND_SetFingerAngle(hand_ctx, used_id, finger_index, thumb_root_angle_set, speed, &remote_err); } }
设置拇指根部位置HAND_SetThumbRootPos()
-
方法原型:
uint8_t HAND_SetThumbRootPos(void *ctx, uint8_t hand_id, uint8_t pos, uint8_t speed, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id pos拇指根部的目标位置,只能取 0、1 或 2 speed运动速度 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
uint8_t remote_err; uint8_t used_id = 0x02; uint8_t speed = 255; uint8_t pos_set = 1 test_err = HAND_SetThumbRootPos(hand_ctx, used_id, pos_set, speed, &remote_err);
设置所有手指绝对位置HAND_SetFingerPosAbsAll()
-
方法原型:
uint8_t HAND_SetFingerPosAbsAll(void *ctx, uint8_t hand_id, uint16_t *raw_pos, uint8_t *speed, uint8_t motor_cnt, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id raw_pos所有手指绝对位置数组 speed所有手指运动速度的数组 motor_cnt电机数量 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint8_t raw_speed[NUM_MOTORS] = { 100,100,100,100,100,100 }; uint16_t raw_pos_abs[NUM_MOTORS] = { 13000, 13000, 13000, 13000, 13000, 5000 }; uint8_t motor_cnt = NUM_MOTORS; test_err = HAND_SetFingerPosAbsAll(hand_ctx, used_id, raw_pos_abs, raw_speed, NUM_MOTORS, &remote_err);
设置所有手指逻辑位置HAND_SetFingerPosAll()
-
方法原型:
uint8_t HAND_SetFingerPosAll(void *ctx, uint8_t hand_id, uint16_t *pos, uint8_t *speed, uint8_t motor_cnt, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id pos所有手指目标逻辑位置的数组 speed所有手指运动速度的数组 motor_cnt电机数量 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint8_t motor_cnt = NUM_MOTORS; uint16_t raw_pos[NUM_MOTORS] = { 18000, 33000, 33000, 33000, 33000, 38000 }; test_err = HAND_SetFingerPosAll(hand_ctx, used_id, raw_pos, raw_speed, NUM_MOTORS, &remote_err);
设置所有手指角度HAND_SetFingerAngleAll()
-
方法原型:
uint8_t HAND_SetFingerAngleAll(void *ctx, uint8_t hand_id, int16_t *angle, uint8_t *speed, uint8_t motor_cnt, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id angle所有手指目标角度的数组 speed所有手指运动速度的数组 motor_cnt电机数量 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
#define NUM_MOTORS 6 uint8_t remote_err; uint8_t used_id = 0x02; uint8_t motor_cnt = NUM_MOTORS; int16_t raw_angle[NUM_MOTORS] = { 2000,12000,12000,12000,12000,5000 }; test_err = HAND_SetFingerAngleAll(hand_ctx, used_id, raw_angle, raw_speed, NUM_MOTORS, &remote_err);
自定义命令,高速读写HAND_SetCustom()
-
方法原型:
uint8_t HAND_SetCustom(void *ctx, uint8_t hand_id, uint8_t* data, uint8_t send_data_size, uint8_t *recv_data_size, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id data自定义命令的具体内容数据 send_data_size发送数据的长度 recv_data_size接收数据的长度 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
详情见此sdk中的示例项目custom_cmd_test
设置自检等级HAND_SetSelfTestLevel()
-
方法原型:
uint8_t HAND_SetSelfTestLevel(void *ctx, uint8_t hand_id, uint8_t self_test_level, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id self_test_level自检等级, 0: 不自动自检, 1: 部分自检, 2: 完整自检 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
uint8_t remote_err; uint8_t used_id = 0x02; uint8_t self_test_level_set = 2; test_err = HAND_SetSelfTestLevel(hand_ctx, used_id, self_test_level_set, &remote_err);
设置蜂鸣器开关HAND_SetBeepSwitch()
-
方法原型:
uint8_t HAND_SetBeepSwitch(void *ctx, uint8_t hand_id, uint8_t beep_on, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id beep_on蜂鸣器开关状态, 0: 关闭, 1: 打开 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
uint8_t remote_err; uint8_t used_id = 0x02; uint8_t beep_on = 1; test_err = HAND_SetBeepSwitch(hand_ctx, used_id, beep_on, &remote_err);
蜂鸣器发声HAND_Beep()
-
方法原型:
uint8_t HAND_Beep(void *ctx, uint8_t hand_id, uint16_t duration, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id duration持续时间, 单位: ms remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
uint8_t remote_err; uint8_t used_id = 0x02; uint16_t duration = 200; test_err = HAND_Beep(hand_ctx, used_id, duration, &remote_err);
设置按钮按下次数HAND_SetButtonPressedCnt()
-
方法原型:
uint8_t HAND_SetButtonPressedCnt(void *ctx, uint8_t hand_id, uint8_t pressed_cnt, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id pressed_cnt按钮按下的计数 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
注意: 此功能仅对仿生手有效, 灵巧手无此功能
触发初始化(条件: 自测模式为0)HAND_StartInit()
-
方法原型:
uint8_t HAND_StartInit(void *ctx, uint8_t hand_id, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
uint8_t remote_err; uint8_t used_id = 0x02; HAND_SetSelfTestLevel(hand_ctx, used_id, 0, &remote_err); test_err = HAND_StartInit(hand_ctx, used_id, &remote_err);
设置工厂数据HAND_SetManufactureData()
-
方法原型:
uint8_t HAND_SetManufactureData(void *ctx, uint8_t hand_id, uint8_t *data, uint8_t data_size, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id data制造商数据 data_size制造商数据的大小 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
注意: 此功能暂不对外开放, 需要使用此功能时请联系技术支持
设置手指力控PID参数HAND_SetFingerForcePID()
-
方法原型:
uint8_t HAND_SetFingerForcePID(void *ctx, uint8_t hand_id, uint8_t finger_id, float p, float i, float d, float g, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id finger_id手指id p比例系数 i积分系数 d微分系数 g增益系数 remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
#define NUM_FINGERS 5 uint8_t remote_err; uint8_t used_id = 0x02; float force_pid[][4] = { {200.00, 2.00, 98.00, 0.07}, {200.00, 2.00, 98.00, 0.07}, {200.00, 2.00, 98.00, 0.07}, {200.00, 2.00, 98.00, 0.07}, {200.00, 2.00, 98.00, 0.07}, }; for (int finger_index = 0; finger_index < NUM_FINGERS; finger_index++){ test_err = HAND_SetFingerForcePID(hand_ctx, used_id, finger_index, force_pid[finger_index][0], force_pid[finger_index][1],force_pid[finger_index][2], force_pid[finger_index][3], &remote_err); }
重置力传感器数据HAND_ResetForce()
-
方法原型:
uint8_t HAND_ResetForce(void *ctx, uint8_t hand_id, uint8_t *remote_err) -
参数说明:
参数 说明 ctxOHand 上下文指针 hand_id手部设备id remote_err远程错误代码 -
返回值:
成功: 返回HAND_RESP_SUCCESS
失败: 返回相应错误码 -
示例代码:
uint8_t remote_err; uint8_t used_id = 0x02; test_err = HAND_ResetForce(hand_ctx, used_id, &remote_err);