字段列表
本节介绍 wujihandpy 中所有可用的数据字段。Hand 层
该层包含整手设备唯一的通用字段,例如手性、固件版本等。handedness
该字段表示灵巧手的手性(左/右手,0 表示右手,1 表示左手)。- 类型:
uint8 - 读写属性:只读
firmware_version
该字段表示灵巧手固件的版本号。- 类型:
uint32 - 读写属性:只读
firmware_date
该字段表示灵巧手固件的编译日期。- 类型:
uint32 - 读写属性:只读
system_time
该字段表示灵巧手系统运行时间,单位为毫秒。- 类型:
uint32 - 读写属性:只读
temperature
该字段表示灵巧手手腕附近的当前温度,单位为摄氏度。- 类型:
float32 - 读写属性:只读
input_voltage
该字段表示灵巧手母线电压的实测值,单位为伏特。- 类型:
float32 - 读写属性:只读
Joint 层
该层包含每关节持有一个独立副本的字段,例如使能、目标位置等。joint_firmware_version
该字段记录关节驱动板固件的版本号。- 类型:
uint32 - 读写属性:只读
joint_firmware_date
该字段记录关节驱动板固件的编译日期。- 类型:
uint32 - 读写属性:只读
joint_control_mode
该字段用于设置关节的控制模式。- 类型:
uint16 - 读写属性:只写
说明:模式会自动切换,一般情况下不应修改该字段。
joint_sin_level
该字段用于设置关节驱动的正弦波激励档位。- 类型:
uint16 - 读写属性:只写
说明:该字段用于内部调试,一般情况下不应修改该字段。
joint_effort_limit
该字段用于设置关节允许的 effort 上限。- 类型:
float64 - 单位:安培 (A)
- 默认值:
1.5 - 合法范围:
0.0 ~ 3.5(超过 3.5 会被限制为 3.5) - 读写属性:读写
什么是 Effort?Effort 是电流空间的执行器作用量,经过滤波处理后输出。它不是实际测量的电流值,应将其理解为相对驱动强度,适用于负载监控和碰撞检测等场景。详见 joint_effort 字段。
joint_bus_voltage
该字段记录关节当前的母线电压实测值。- 类型:
float32 - 读写属性:只读
joint_temperature
该字段记录关节驱动板当前的温度,单位为摄氏度。- 类型:
float32 - 读写属性:只读
joint_reset_error
向该字段写入1 可清除关节上报的错误状态。
- 类型:
uint16 - 读写属性:只写
joint_error_code
该字段表示各关节的当前错误码,用于诊断运行状态。 值为0 时表示关节无异常。
- 类型:
uint32 - 读写属性:只读
joint_effort
该字段提供关节的实时 effort 反馈。- 类型:
float32 - 单位:安培 (A)
- 读写属性:只读
Effort 的含义Effort 是电流空间的执行器作用量 (actuation effort in current space),经过滤波处理后输出。
- 不是实际测量的电流值
- 不是电流环的直接输出
- 应将其理解为相对驱动强度,适用于负载监控和碰撞检测
- 碰撞检测:effort 突增表示关节受阻
- 输出监控:可通过
effort / effort_limit计算当前输出百分比
IController.get_joint_actual_effort() 访问。joint_enabled
该字段控制关节的使能和失能。- 类型:
bool - 默认值:
False - 合法范围:
True / False - 读写属性:只写
joint_actual_position
该字段提供关节的实际位置。- 类型:
float64 - 读写属性:只读
joint_target_position
写入该字段可下发关节的目标控制角度。若数值超出合法范围,会自动限幅至允许区间。- 类型:
float64 - 合法范围:
joint_lower_limit ~ joint_upper_limit - 读写属性:只写
joint_upper_limit
该字段记录关节的运行位置上限。- 类型:
float64 - 读写属性:只读
与 URDF 关节范围的区别各关节在加工时存在微小的精度误差,使每个关节的实际物理极限略有不同。
灵巧手在出厂时会对各关节的实际极限进行标定,结果写入
因此,这两个字段记录的是经标定的实际物理极限值,通常略大于 URDF 文件中定义的范围。URDF 文件中的关节范围是理论设计值,经过保守缩放以考虑加工误差,可用于仿真或神经网络训练。
而
灵巧手在出厂时会对各关节的实际极限进行标定,结果写入
joint_upper_limit 和 joint_lower_limit 字段。因此,这两个字段记录的是经标定的实际物理极限值,通常略大于 URDF 文件中定义的范围。URDF 文件中的关节范围是理论设计值,经过保守缩放以考虑加工误差,可用于仿真或神经网络训练。
而
joint_upper_limit 与 joint_lower_limit 表示实际测得的可运动范围。joint_lower_limit
该字段记录关节的运行位置下限。- 类型:
float64 - 读写属性:只读
API 列表
Hand 类
构造函数
-
__init__(serial_number=None, *, side=None, usb_pid=0x2000, usb_vid=0x0483, mask=None) -> None初始化灵巧手连接,支持通过序列号、左右手、USB ID 或设备掩码指定设备serial_number:USB 序列号字符串,精确指定一台设备side:"left"或"right",按手性选择设备,与serial_number互斥(详见 教程 - 筛选设备)
手指访问
finger(index) -> Finger获取指定索引的手指对象,索引范围 0-4
线程安全控制
disable_thread_safe_check() -> None禁用线程安全检查,允许在多线程环境中并发访问 Hand 对象
系统信息
固件信息
-
read_firmware_version(timeout=0.5) -> uint32同步读取固件版本号 -
read_firmware_version_async(timeout=0.5) -> Awaitable[uint32]异步读取固件版本号 -
read_firmware_version_unchecked(timeout=0.5) -> None非阻塞读取固件版本号 -
get_firmware_version() -> uint32获取缓存的固件版本号 -
read_firmware_date(timeout=0.5) -> uint32同步读取固件编译日期 -
read_firmware_date_async(timeout=0.5) -> Awaitable[uint32]异步读取固件编译日期 -
read_firmware_date_unchecked(timeout=0.5) -> None非阻塞读取固件编译日期 -
get_firmware_date() -> uint32获取缓存的固件编译日期 -
read_handedness(timeout=0.5) -> uint8同步读取左右手标识(0=右,1=左) -
read_handedness_async(timeout=0.5) -> Awaitable[uint8]异步读取左右手标识 -
read_handedness_unchecked(timeout=0.5) -> None非阻塞读取左右手标识 -
get_handedness() -> uint8获取缓存的左右手标识
系统状态
-
read_system_time(timeout=0.5) -> uint32同步读取系统运行时间(毫秒) -
read_system_time_async(timeout=0.5) -> Awaitable[uint32]异步读取系统运行时间 -
read_system_time_unchecked(timeout=0.5) -> None非阻塞读取系统运行时间 -
get_system_time() -> uint32获取缓存的系统运行时间 -
read_temperature(timeout=0.5) -> float32同步读取手掌温度(摄氏度) -
read_temperature_async(timeout=0.5) -> Awaitable[float32]异步读取手掌温度 -
read_temperature_unchecked(timeout=0.5) -> None非阻塞读取手掌温度 -
get_temperature() -> float32获取缓存的手掌温度 -
read_input_voltage(timeout=0.5) -> float32同步读取输入电压(伏特) -
read_input_voltage_async(timeout=0.5) -> Awaitable[float32]异步读取输入电压 -
read_input_voltage_unchecked(timeout=0.5) -> None非阻塞读取输入电压 -
get_input_voltage() -> float32获取缓存的输入电压
关节数据(批量读取,返回 数组)
位置数据
-
read_joint_actual_position(timeout=0.5) -> NDArray[float64]同步读取所有关节实际位置(弧度) -
read_joint_actual_position_async(timeout=0.5) -> Awaitable[NDArray[float64]]异步读取所有关节实际位置 -
read_joint_actual_position_unchecked(timeout=0.5) -> None非阻塞读取所有关节实际位置 -
get_joint_actual_position() -> NDArray[float64]获取缓存的所有关节实际位置 -
read_joint_upper_limit(timeout=0.5) -> NDArray[float64]同步读取所有关节上限位置(弧度) -
read_joint_upper_limit_async(timeout=0.5) -> Awaitable[NDArray[float64]]异步读取所有关节上限位置 -
read_joint_upper_limit_unchecked(timeout=0.5) -> None非阻塞读取所有关节上限位置 -
get_joint_upper_limit() -> NDArray[float64]获取缓存的所有关节上限位置 -
read_joint_lower_limit(timeout=0.5) -> NDArray[float64]同步读取所有关节下限位置(弧度) -
read_joint_lower_limit_async(timeout=0.5) -> Awaitable[NDArray[float64]]异步读取所有关节下限位置 -
read_joint_lower_limit_unchecked(timeout=0.5) -> None非阻塞读取所有关节下限位置 -
get_joint_lower_limit() -> NDArray[float64]获取缓存的所有关节下限位置
状态监控
-
read_joint_bus_voltage(timeout=0.5) -> NDArray[float32]同步读取所有关节母线电压(伏特) -
read_joint_bus_voltage_async(timeout=0.5) -> Awaitable[NDArray[float32]]异步读取所有关节母线电压 -
read_joint_bus_voltage_unchecked(timeout=0.5) -> None非阻塞读取所有关节母线电压 -
get_joint_bus_voltage() -> NDArray[float32]获取缓存的所有关节母线电压 -
read_joint_temperature(timeout=0.5) -> NDArray[float32]同步读取所有关节温度(摄氏度) -
read_joint_temperature_async(timeout=0.5) -> Awaitable[NDArray[float32]]异步读取所有关节温度 -
read_joint_temperature_unchecked(timeout=0.5) -> None非阻塞读取所有关节温度 -
get_joint_temperature() -> NDArray[float32]获取缓存的所有关节温度 -
read_joint_error_code(timeout=0.5) -> NDArray[uint32]同步读取所有关节错误码 -
read_joint_error_code_async(timeout=0.5) -> Awaitable[NDArray[uint32]]异步读取所有关节错误码 -
read_joint_error_code_unchecked(timeout=0.5) -> None非阻塞读取所有关节错误码 -
get_joint_error_code() -> NDArray[uint32]获取缓存的所有关节错误码
Effort 限制 数据
read_joint_effort_limit(timeout=0.5) -> NDArray[float64]同步读取所有关节 effort limit(安培)read_joint_effort_limit_async(timeout=0.5) -> Awaitable[NDArray[float64]]异步读取所有关节 effort limitread_joint_effort_limit_unchecked(timeout=0.5) -> None非阻塞读取所有关节 effort limitget_joint_effort_limit() -> NDArray[float64]获取缓存的所有关节 effort limit
固件信息
-
read_joint_firmware_version(timeout=0.5) -> NDArray[uint32]同步读取所有关节固件版本 -
read_joint_firmware_version_async(timeout=0.5) -> Awaitable[NDArray[uint32]]异步读取所有关节固件版本 -
read_joint_firmware_version_unchecked(timeout=0.5) -> None非阻塞读取所有关节固件版本 -
get_joint_firmware_version() -> NDArray[uint32]获取缓存的所有关节固件版本 -
read_joint_firmware_date(timeout=0.5) -> NDArray[uint32]同步读取所有关节固件编译日期 -
read_joint_firmware_date_async(timeout=0.5) -> Awaitable[NDArray[uint32]]异步读取所有关节固件编译日期 -
read_joint_firmware_date_unchecked(timeout=0.5) -> None非阻塞读取所有关节固件编译日期 -
get_joint_firmware_date() -> NDArray[uint32]获取缓存的所有关节固件编译日期
关节控制(支持单个值或 数组)
使能控制
write_joint_enabled(value, timeout=0.5) -> None同步设置所有关节使能状态write_joint_enabled(value_array, timeout=0.5) -> None同步批量设置各关节使能状态write_joint_enabled_async(value, timeout=0.5) -> Awaitable[None]异步设置所有关节使能状态write_joint_enabled_async(value_array, timeout=0.5) -> Awaitable[None]异步批量设置各关节使能状态write_joint_enabled_unchecked(value, timeout=0.5) -> None非阻塞设置所有关节使能状态write_joint_enabled_unchecked(value_array, timeout=0.5) -> None非阻塞批量设置各关节使能状态
位置控制
write_joint_target_position(value, timeout=0.5) -> None同步设置所有关节目标位置(弧度)write_joint_target_position(value_array, timeout=0.5) -> None同步批量设置各关节目标位置write_joint_target_position_async(value, timeout=0.5) -> Awaitable[None]异步设置所有关节目标位置write_joint_target_position_async(value_array, timeout=0.5) -> Awaitable[None]异步批量设置各关节目标位置write_joint_target_position_unchecked(value, timeout=0.5) -> None非阻塞设置所有关节目标位置write_joint_target_position_unchecked(value_array, timeout=0.5) -> None非阻塞批量设置各关节目标位置
模式控制
write_joint_control_mode(value, timeout=0.5) -> None同步设置所有关节控制模式write_joint_control_mode(value_array, timeout=0.5) -> None同步批量设置各关节控制模式write_joint_control_mode_async(value, timeout=0.5) -> Awaitable[None]异步设置所有关节控制模式write_joint_control_mode_async(value_array, timeout=0.5) -> Awaitable[None]异步批量设置各关节控制模式write_joint_control_mode_unchecked(value, timeout=0.5) -> None非阻塞设置所有关节控制模式write_joint_control_mode_unchecked(value_array, timeout=0.5) -> None非阻塞批量设置各关节控制模式
Effort 限制 配置
write_joint_effort_limit(value, timeout=0.5) -> None同步设置所有关节 effort limit(安培)write_joint_effort_limit(value_array, timeout=0.5) -> None同步批量设置各关节 effort limitwrite_joint_effort_limit_async(value, timeout=0.5) -> Awaitable[None]异步设置所有关节 effort limitwrite_joint_effort_limit_async(value_array, timeout=0.5) -> Awaitable[None]异步批量设置各关节 effort limitwrite_joint_effort_limit_unchecked(value, timeout=0.5) -> None非阻塞设置所有关节 effort limitwrite_joint_effort_limit_unchecked(value_array, timeout=0.5) -> None非阻塞批量设置各关节 effort limit
其他参数配置
-
write_joint_sin_level(value, timeout=0.5) -> None同步设置所有关节正弦波激励档位 -
write_joint_sin_level(value_array, timeout=0.5) -> None同步批量设置各关节正弦波激励档位 -
write_joint_sin_level_async(value, timeout=0.5) -> Awaitable[None]异步设置所有关节正弦波激励档位 -
write_joint_sin_level_async(value_array, timeout=0.5) -> Awaitable[None]异步批量设置各关节正弦波激励档位 -
write_joint_sin_level_unchecked(value, timeout=0.5) -> None非阻塞设置所有关节正弦波激励档位 -
write_joint_sin_level_unchecked(value_array, timeout=0.5) -> None非阻塞批量设置各关节正弦波激励档位 -
write_joint_reset_error(value, timeout=0.5) -> None同步重置所有关节错误 -
write_joint_reset_error(value_array, timeout=0.5) -> None同步批量重置各关节错误 -
write_joint_reset_error_async(value, timeout=0.5) -> Awaitable[None]异步重置所有关节错误 -
write_joint_reset_error_async(value_array, timeout=0.5) -> Awaitable[None]异步批量重置各关节错误 -
write_joint_reset_error_unchecked(value, timeout=0.5) -> None非阻塞重置所有关节错误 -
write_joint_reset_error_unchecked(value_array, timeout=0.5) -> None非阻塞批量重置各关节错误
实时控制器
realtime_controller(enable_upstream, filter) -> IController创建实时控制器,用于高频控制场景
Finger 类
关节访问
joint(index) -> Joint获取指定索引的关节对象,索引范围 0-3
关节数据(返回 4 元素数组)
位置数据
-
read_joint_actual_position(timeout=0.5) -> NDArray[float64]同步读取手指所有关节实际位置(弧度) -
read_joint_actual_position_async(timeout=0.5) -> Awaitable[NDArray[float64]]异步读取手指所有关节实际位置 -
read_joint_actual_position_unchecked(timeout=0.5) -> None非阻塞读取手指所有关节实际位置 -
get_joint_actual_position() -> NDArray[float64]获取缓存的手指所有关节实际位置 -
read_joint_upper_limit(timeout=0.5) -> NDArray[float64]同步读取手指所有关节上限位置(弧度) -
read_joint_upper_limit_async(timeout=0.5) -> Awaitable[NDArray[float64]]异步读取手指所有关节上限位置 -
read_joint_upper_limit_unchecked(timeout=0.5) -> None非阻塞读取手指所有关节上限位置 -
get_joint_upper_limit() -> NDArray[float64]获取缓存的手指所有关节上限位置 -
read_joint_lower_limit(timeout=0.5) -> NDArray[float64]同步读取手指所有关节下限位置(弧度) -
read_joint_lower_limit_async(timeout=0.5) -> Awaitable[NDArray[float64]]异步读取手指所有关节下限位置 -
read_joint_lower_limit_unchecked(timeout=0.5) -> None非阻塞读取手指所有关节下限位置 -
get_joint_lower_limit() -> NDArray[float64]获取缓存的手指所有关节下限位置
状态监控
-
read_joint_bus_voltage(timeout=0.5) -> NDArray[float32]同步读取手指所有关节母线电压(伏特) -
read_joint_bus_voltage_async(timeout=0.5) -> Awaitable[NDArray[float32]]异步读取手指所有关节母线电压 -
read_joint_bus_voltage_unchecked(timeout=0.5) -> None非阻塞读取手指所有关节母线电压 -
get_joint_bus_voltage() -> NDArray[float32]获取缓存的手指所有关节母线电压 -
read_joint_temperature(timeout=0.5) -> NDArray[float32]同步读取手指所有关节温度(摄氏度) -
read_joint_temperature_async(timeout=0.5) -> Awaitable[NDArray[float32]]异步读取手指所有关节温度 -
read_joint_temperature_unchecked(timeout=0.5) -> None非阻塞读取手指所有关节温度 -
get_joint_temperature() -> NDArray[float32]获取缓存的手指所有关节温度 -
read_joint_error_code(timeout=0.5) -> NDArray[uint32]同步读取手指所有关节错误码 -
read_joint_error_code_async(timeout=0.5) -> Awaitable[NDArray[uint32]]异步读取手指所有关节错误码 -
read_joint_error_code_unchecked(timeout=0.5) -> None非阻塞读取手指所有关节错误码 -
get_joint_error_code() -> NDArray[uint32]获取缓存的手指所有关节错误码
Effort 限制 数据
read_joint_effort_limit(timeout=0.5) -> NDArray[float64]同步读取手指所有关节 effort limit(安培)read_joint_effort_limit_async(timeout=0.5) -> Awaitable[NDArray[float64]]异步读取手指所有关节 effort limitread_joint_effort_limit_unchecked(timeout=0.5) -> None非阻塞读取手指所有关节 effort limitget_joint_effort_limit() -> NDArray[float64]获取缓存的手指所有关节 effort limit
固件信息
-
read_joint_firmware_version(timeout=0.5) -> NDArray[uint32]同步读取手指所有关节固件版本 -
read_joint_firmware_version_async(timeout=0.5) -> Awaitable[NDArray[uint32]]异步读取手指所有关节固件版本 -
read_joint_firmware_version_unchecked(timeout=0.5) -> None非阻塞读取手指所有关节固件版本 -
get_joint_firmware_version() -> NDArray[uint32]获取缓存的手指所有关节固件版本 -
read_joint_firmware_date(timeout=0.5) -> NDArray[uint32]同步读取手指所有关节固件编译日期 -
read_joint_firmware_date_async(timeout=0.5) -> Awaitable[NDArray[uint32]]异步读取手指所有关节固件编译日期 -
read_joint_firmware_date_unchecked(timeout=0.5) -> None非阻塞读取手指所有关节固件编译日期 -
get_joint_firmware_date() -> NDArray[uint32]获取缓存的手指所有关节固件编译日期
关节控制(支持单个值或 4 元素数组)
使能控制
write_joint_enabled(value, timeout=0.5) -> None同步设置手指所有关节使能状态write_joint_enabled(value_array, timeout=0.5) -> None同步批量设置手指各关节使能状态write_joint_enabled_async(value, timeout=0.5) -> Awaitable[None]异步设置手指所有关节使能状态write_joint_enabled_async(value_array, timeout=0.5) -> Awaitable[None]异步批量设置手指各关节使能状态write_joint_enabled_unchecked(value, timeout=0.5) -> None非阻塞设置手指所有关节使能状态write_joint_enabled_unchecked(value_array, timeout=0.5) -> None非阻塞批量设置手指各关节使能状态
位置控制
write_joint_target_position(value, timeout=0.5) -> None同步设置手指所有关节目标位置(弧度)write_joint_target_position(value_array, timeout=0.5) -> None同步批量设置手指各关节目标位置write_joint_target_position_async(value, timeout=0.5) -> Awaitable[None]异步设置手指所有关节目标位置write_joint_target_position_async(value_array, timeout=0.5) -> Awaitable[None]异步批量设置手指各关节目标位置write_joint_target_position_unchecked(value, timeout=0.5) -> None非阻塞设置手指所有关节目标位置write_joint_target_position_unchecked(value_array, timeout=0.5) -> None非阻塞批量设置手指各关节目标位置
模式控制
write_joint_control_mode(value, timeout=0.5) -> None同步设置手指所有关节控制模式write_joint_control_mode(value_array, timeout=0.5) -> None同步批量设置手指各关节控制模式write_joint_control_mode_async(value, timeout=0.5) -> Awaitable[None]异步设置手指所有关节控制模式write_joint_control_mode_async(value_array, timeout=0.5) -> Awaitable[None]异步批量设置手指各关节控制模式write_joint_control_mode_unchecked(value, timeout=0.5) -> None非阻塞设置手指所有关节控制模式write_joint_control_mode_unchecked(value_array, timeout=0.5) -> None非阻塞批量设置手指各关节控制模式
Effort 限制 配置
write_joint_effort_limit(value, timeout=0.5) -> None同步设置手指所有关节 effort limit(安培)write_joint_effort_limit(value_array, timeout=0.5) -> None同步批量设置手指各关节 effort limitwrite_joint_effort_limit_async(value, timeout=0.5) -> Awaitable[None]异步设置手指所有关节 effort limitwrite_joint_effort_limit_async(value_array, timeout=0.5) -> Awaitable[None]异步批量设置手指各关节 effort limitwrite_joint_effort_limit_unchecked(value, timeout=0.5) -> None非阻塞设置手指所有关节 effort limitwrite_joint_effort_limit_unchecked(value_array, timeout=0.5) -> None非阻塞批量设置手指各关节 effort limit
其他参数配置
-
write_joint_sin_level(value, timeout=0.5) -> None同步设置手指所有关节正弦波激励档位 -
write_joint_sin_level(value_array, timeout=0.5) -> None同步批量设置手指各关节正弦波激励档位 -
write_joint_sin_level_async(value, timeout=0.5) -> Awaitable[None]异步设置手指所有关节正弦波激励档位 -
write_joint_sin_level_async(value_array, timeout=0.5) -> Awaitable[None]异步批量设置手指各关节正弦波激励档位 -
write_joint_sin_level_unchecked(value, timeout=0.5) -> None非阻塞设置手指所有关节正弦波激励档位 -
write_joint_sin_level_unchecked(value_array, timeout=0.5) -> None非阻塞批量设置手指各关节正弦波激励档位 -
write_joint_reset_error(value, timeout=0.5) -> None同步重置手指所有关节错误 -
write_joint_reset_error(value_array, timeout=0.5) -> None同步批量重置手指各关节错误 -
write_joint_reset_error_async(value, timeout=0.5) -> Awaitable[None]异步重置手指所有关节错误 -
write_joint_reset_error_async(value_array, timeout=0.5) -> Awaitable[None]异步批量重置手指各关节错误 -
write_joint_reset_error_unchecked(value, timeout=0.5) -> None非阻塞重置手指所有关节错误 -
write_joint_reset_error_unchecked(value_array, timeout=0.5) -> None非阻塞批量重置手指各关节错误
Joint 类
关节数据(返回单个值)
位置数据
-
read_joint_actual_position(timeout=0.5) -> float64同步读取关节实际位置(弧度) -
read_joint_actual_position_async(timeout=0.5) -> Awaitable[float64]异步读取关节实际位置 -
read_joint_actual_position_unchecked(timeout=0.5) -> None非阻塞读取关节实际位置 -
get_joint_actual_position() -> float64获取缓存的关节实际位置 -
read_joint_upper_limit(timeout=0.5) -> float64同步读取关节上限位置(弧度) -
read_joint_upper_limit_async(timeout=0.5) -> Awaitable[float64]异步读取关节上限位置 -
read_joint_upper_limit_unchecked(timeout=0.5) -> None非阻塞读取关节上限位置 -
get_joint_upper_limit() -> float64获取缓存的关节上限位置 -
read_joint_lower_limit(timeout=0.5) -> float64同步读取关节下限位置(弧度) -
read_joint_lower_limit_async(timeout=0.5) -> Awaitable[float64]异步读取关节下限位置 -
read_joint_lower_limit_unchecked(timeout=0.5) -> None非阻塞读取关节下限位置 -
get_joint_lower_limit() -> float64获取缓存的关节下限位置
状态监控
-
read_joint_bus_voltage(timeout=0.5) -> float32同步读取关节母线电压(伏特) -
read_joint_bus_voltage_async(timeout=0.5) -> Awaitable[float32]异步读取关节母线电压 -
read_joint_bus_voltage_unchecked(timeout=0.5) -> None非阻塞读取关节母线电压 -
get_joint_bus_voltage() -> float32获取缓存的关节母线电压 -
read_joint_temperature(timeout=0.5) -> float32同步读取关节温度(摄氏度) -
read_joint_temperature_async(timeout=0.5) -> Awaitable[float32]异步读取关节温度 -
read_joint_temperature_unchecked(timeout=0.5) -> None非阻塞读取关节温度 -
get_joint_temperature() -> float32获取缓存的关节温度 -
read_joint_error_code(timeout=0.5) -> uint32同步读取关节错误码 -
read_joint_error_code_async(timeout=0.5) -> Awaitable[uint32]异步读取关节错误码 -
read_joint_error_code_unchecked(timeout=0.5) -> None非阻塞读取关节错误码 -
get_joint_error_code() -> uint32获取缓存的关节错误码
Effort 限制 数据
read_joint_effort_limit(timeout=0.5) -> float64同步读取关节 effort limit(安培)read_joint_effort_limit_async(timeout=0.5) -> Awaitable[float64]异步读取关节 effort limitread_joint_effort_limit_unchecked(timeout=0.5) -> None非阻塞读取关节 effort limitget_joint_effort_limit() -> float64获取缓存的关节 effort limit
固件信息
-
read_joint_firmware_version(timeout=0.5) -> uint32同步读取关节固件版本 -
read_joint_firmware_version_async(timeout=0.5) -> Awaitable[uint32]异步读取关节固件版本 -
read_joint_firmware_version_unchecked(timeout=0.5) -> None非阻塞读取关节固件版本 -
get_joint_firmware_version() -> uint32获取缓存的关节固件版本 -
read_joint_firmware_date(timeout=0.5) -> uint32同步读取关节固件编译日期 -
read_joint_firmware_date_async(timeout=0.5) -> Awaitable[uint32]异步读取关节固件编译日期 -
read_joint_firmware_date_unchecked(timeout=0.5) -> None非阻塞读取关节固件编译日期 -
get_joint_firmware_date() -> uint32获取缓存的关节固件编译日期
关节控制(单个值)
使能控制
write_joint_enabled(value, timeout=0.5) -> None同步设置关节使能状态write_joint_enabled_async(value, timeout=0.5) -> Awaitable[None]异步设置关节使能状态write_joint_enabled_unchecked(value, timeout=0.5) -> None非阻塞设置关节使能状态
位置控制
write_joint_target_position(value, timeout=0.5) -> None同步设置关节目标位置(弧度)write_joint_target_position_async(value, timeout=0.5) -> Awaitable[None]异步设置关节目标位置write_joint_target_position_unchecked(value, timeout=0.5) -> None非阻塞设置关节目标位置
模式控制
write_joint_control_mode(value, timeout=0.5) -> None同步设置关节控制模式write_joint_control_mode_async(value, timeout=0.5) -> Awaitable[None]异步设置关节控制模式write_joint_control_mode_unchecked(value, timeout=0.5) -> None非阻塞设置关节控制模式
Effort 限制 配置
write_joint_effort_limit(value, timeout=0.5) -> None同步设置关节 effort limit(安培)write_joint_effort_limit_async(value, timeout=0.5) -> Awaitable[None]异步设置关节 effort limitwrite_joint_effort_limit_unchecked(value, timeout=0.5) -> None非阻塞设置关节 effort limit
其他参数配置
-
write_joint_sin_level(value, timeout=0.5) -> None同步设置关节正弦波激励档位 -
write_joint_sin_level_async(value, timeout=0.5) -> Awaitable[None]异步设置关节正弦波激励档位 -
write_joint_sin_level_unchecked(value, timeout=0.5) -> None非阻塞设置关节正弦波激励档位 -
write_joint_reset_error(value, timeout=0.5) -> None同步重置关节错误 -
write_joint_reset_error_async(value, timeout=0.5) -> Awaitable[None]异步重置关节错误 -
write_joint_reset_error_unchecked(value, timeout=0.5) -> None非阻塞重置关节错误
IController 接口
上下文管理
__enter__() -> IController支持 with 语句的上下文管理器入口__exit__(arg0, arg1, arg2) -> None支持 with 语句的上下文管理器出口close() -> None手动关闭实时控制器
实时数据获取
get_joint_actual_position() -> NDArray[float64]实时获取所有关节实际位置(高频读取,返回 数组)get_joint_actual_effort() -> NDArray[float64]实时获取所有关节 effort(高频读取,返回 数组,单位:安培)
Effort 实时反馈
get_joint_actual_effort() 返回电流空间的执行器作用量 (actuation effort in current space),经过滤波处理。- 仅在实时控制器模式下可用
- 适用于碰撞检测和负载监控
- 可通过
effort / effort_limit计算输出百分比
实时数据设置
set_joint_target_position(value_array) -> None实时设置所有关节目标位置(高频写入,参数为 数组)
数组形状说明
- Hand 类批量操作:返回/接收形状为
{5, 4}的数组(5个手指 × 4个关节) - Finger 类批量操作:返回/接收形状为
{4}的数组(4个关节) - Joint 类操作:返回/接收标量值(单个关节)
- IController 操作:处理形状为
{5, 4}的数组,用于高频实时控制
操作模式说明
- 同步操作 (
read_*,write_*):阻塞操作,确保读/写成功 - 异步操作 (
*_async):返回 Awaitable 对象,支持 await 语法 - 非阻塞操作 (
*_unchecked):立即返回,不保证操作成功,适用于高频率场景 - 缓存获取 (
get_*):获取最近一次读取的数据,不阻塞
触觉感知手套
触觉感知手套(Tactile Sensing Glove)是 Wuji Hand 的选配触觉感知配件。SDK 通过TactileGlove 类提供设备连接和数据读取接口。
核心类
TactileHandedness
手型枚举:TactileHandedness.LEFT(0):左手TactileHandedness.RIGHT(1):右手
TactileFrame
单帧触觉数据,包含以下属性:
压力值语义:
- 范围:
[0.0, 1.0]——0.0表示无接触,1.0表示最大接触 NaN标记无效单元(不属于任何手指或手掌区域),处理时用numpy.isnan()跳过
TactileGlove
触觉感知手套设备的连接与数据读取。 构造函数:serial_number 为 USB 设备序列号。传 None 时自动发现总线上唯一的设备,若存在多台会抛出异常。设备连接
自动发现
指定设备
Context Manager
连接管理方法
connect() -> bool:连接设备,成功返回Truedisconnect() -> None:断开连接并停止流式读取is_connected() -> bool:查询连接状态get_handedness() -> TactileHandedness:返回设备手型
数据读取
阻塞读取
- 内部执行帧同步和 CRC 校验
- 超时抛出
RuntimeError - 连接断开抛出
RuntimeError
流式回调
- 回调在内部读取线程中调用,不可阻塞
- 通过
set_disconnect_callback(fn)注册断开回调以响应 USB 拔出,之后流式读取自动停止 start_streaming与read_frame互斥,不可同时使用- 所有阻塞操作释放 Python GIL
配置与诊断
异常处理
完整示例
覆盖TactileGlove 的完整工作流:自动发现与设备信息查询、主机/设备时钟同步、采样率配置、阻塞读取与流式回调、数据保存以及诊断计数器读取。reset_device / enter_bootloader 会断开当前连接(设备复位或进入 bootloader),仅在末尾以注释形式给出。
预期输出示例
与 Wuji Hand 联合使用
Hand 与 TactileGlove 使用独立的 USB 传输和线程,可在同一进程内并行使用,无需额外协调。帧回调在触觉手套的流式消费线程中触发,关节命令运行在调用它们的线程上。该模式适合用触觉反馈驱动运动控制的闭环场景,例如根据当前压力峰值动态缩放关节运动幅度。
参考示例:example/joint_with_tactile.py。
运行效果:
- 启动后终端打印
Squeeze the glove to dampen the motion. Ctrl-C to exit. - 关节使能后,F2–F5 四指以 100 Hz 实时循环做周期性弯曲–伸展,F1(拇指)保持不动
- 触觉手套压力峰值越大,关节运动幅度越小:松开手套时幅度最大(约 0.4 rad),用力按压时幅度趋近于 0
- 松手后幅度自动恢复
- Ctrl-C 退出时自动停止流式、关闭关节使能并断开手套
协议参考
本节面向需要自行解析触觉数据帧的高级开发者。使用 SDK 的TactileGlove 类时无需关注协议细节。
数据帧格式
触觉感知手套通过 USB CDC(虚拟串口)以最高 120 Hz 输出固定 3088 字节的数据帧。实际速率由set_sample_rate_hz(1–120 Hz)控制:
CRC16-CCITT
- 多项式:
0x1021,初始值:0xFFFF - 校验范围:字节
[2, 3086)(帧长度到时间戳,共 3084 字节) - 不含帧头和 CRC 字段本身
帧同步算法
- 逐字节扫描,匹配帧头
0xAA 0x55 - 读取字节 2–3,验证帧长度 == 3088
- 读取剩余字节,补齐完整帧
- 计算 CRC16 并比对
- CRC 失败:丢弃,从 header_position + 1 继续扫描
- CRC 成功:解析并交付帧
0xAA 0x55 可能出现在压力数据中(伪帧头),CRC 校验是区分真伪帧头的唯一可靠手段。参考实现
下面的 Python 片段不依赖 SDK,直接从原始字节流(例如通过pyserial 打开 CDC 串口)解析单帧,可作为自定义解析器的起点:
logging 模块
wujihandpy.logging 子模块用于在运行时配置 SDK 日志行为。默认行为、环境变量与排查建议见 入门 - 获取日志。
Level 枚举
函数
set_log_path
设置日志文件目录。必须在 logger 初始化之前调用(常见Hand 流程下即创建第一个 Hand 之前,flush() 或其他日志接口也会触发 logger 初始化),否则抛出 RuntimeError。
set_log_level
设置日志级别。可在任意时刻调用,立即生效。set_log_to_file
控制是否写入文件。仅在 logger 初始化时WUJI_LOG_TO_FILE 为 true 才会打开日志文件,初始化后调用此函数可临时关闭或恢复文件输出。若初始化时已被禁用,运行期调用 set_log_to_file(True) 不会重新启用文件输出。