本文档回答 LinkerHand-CPP-SDK 的常见问题。
A: 有两种安装方式:
方法一:使用安装脚本(推荐)
./script.sh
# 选择选项 [2]: Install SDK方法二:手动安装
mkdir build && cd build
cmake ..
make
sudo make install详细说明请参考 README.md。
A: 检查以下几点:
-
确认安装路径:
ls /usr/local/lib/linkerhand-cpp-sdk/
-
检查架构匹配:
uname -m # 查看系统架构 ls lib/x86_64/ # 或 lib/aarch64/
-
设置库路径:
export LD_LIBRARY_PATH=/usr/local/lib/linkerhand-cpp-sdk/x86_64:$LD_LIBRARY_PATH
-
更新动态链接库缓存:
sudo ldconfig
A:
- 操作系统: Linux (Ubuntu 18.04+ 推荐)
- 架构: x86_64、aarch64
- 编译器: GCC 7.0+ 或 Clang 5.0+
- CMake: 3.11+
A: 使用安装脚本:
./script.sh
# 选择选项 [3]: Uninstall SDK或手动删除:
sudo rm -rf /usr/local/include/linkerhand-cpp-sdk
sudo rm -rf /usr/local/lib/linkerhand-cpp-sdkA: 参考以下步骤:
-
创建项目文件:
// main.cpp #include "LinkerHandApi.h" #include <iostream> int main() { LinkerHandApi hand(LINKER_HAND::L10, HAND_TYPE::RIGHT); std::cout << "Version: " << hand.getVersion() << std::endl; return 0; }
-
创建 CMakeLists.txt:
cmake_minimum_required(VERSION 3.5) project(MyProject) # 查找库和头文件 find_library(LINKER_HAND_LIB linkerhand_cpp_sdk PATHS /usr/local/lib/linkerhand-cpp-sdk/x86_64) include_directories(/usr/local/include/linkerhand-cpp-sdk) add_executable(my_project main.cpp) target_link_libraries(my_project ${LINKER_HAND_LIB} pthread)
-
编译和运行:
mkdir build && cd build cmake .. make ./my_project
详细说明请参考 README.md。
A: 根据您的硬件配置选择:
- CAN 总线: 默认使用
COMM_CAN_0,如果有多个 CAN 接口可使用COMM_CAN_1 - ModBus: 使用
COMM_MODBUS进行 ModBus 通信 - EtherCAT: 使用
COMM_ETHERCAT进行 EtherCAT 工业以太网通信
// CAN0(默认)
LinkerHandApi hand(LINKER_HAND::L10, HAND_TYPE::RIGHT);
// CAN1
LinkerHandApi hand(LINKER_HAND::L10, HAND_TYPE::RIGHT, COMM_CAN_1);
// ModBus
LinkerHandApi hand(LINKER_HAND::L10, HAND_TYPE::RIGHT, COMM_MODBUS);
// EtherCAT
LinkerHandApi hand(LINKER_HAND::L10, HAND_TYPE::RIGHT, COMM_ETHERCAT);A: 根据不同的通信协议进行配置:
在 Linux 系统中配置 CAN 总线:
# 加载 CAN 模块
sudo modprobe can
sudo modprobe can_raw
sudo modprobe vcan # 虚拟 CAN(用于测试)
# 配置 CAN 接口
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up
# 查看 CAN 接口状态
ip link show can0
# 测试 CAN 通信
cansend can0 123#DEADBEEF
candump can0ModBus 配置取决于使用的接口类型(串口或网络):
- 串口 ModBus: 确保串口设备权限正确,通常需要将用户添加到
dialout组 - 网络 ModBus: 确保网络连接正常,ModBus TCP/IP 端口已开放
EtherCAT 需要配置 EtherCAT 主站:
- 确保 EtherCAT 主站软件已安装和配置
- 检查 EtherCAT 网络拓扑
- 验证 EtherCAT 从站设备已正确连接
A: 使用 fingerMove() 函数:
// 1. 设置速度和扭矩
std::vector<uint8_t> speed = {200, 200, 200, 200, 200};
std::vector<uint8_t> torque = {255, 255, 255, 255, 255};
hand.setSpeed(speed);
hand.setTorque(torque);
// 2. 设置关节位置(L10 示例)
std::vector<uint8_t> pose = {128, 128, 128, 128, 128, 128, 128, 128, 128, 128};
hand.fingerMove(pose);
// 3. 等待动作完成
std::this_thread::sleep_for(std::chrono::seconds(1));A: 使用相应的获取函数:
// 获取压力数据
auto force = hand.getForce();
// 获取温度
auto temperature = hand.getTemperature();
// 获取故障码
auto fault_code = hand.getFaultCode();
// 获取电流
auto current = hand.getCurrent();
// 获取关节状态
auto state = hand.getState();A:
- L6/O6: 6 个关节
- L7: 7 个关节
- L10: 10 个关节
- L20: 20 个关节
- L21: 25 个关节
- L25: 25 个关节
详细映射关系请参考 README.md 或 API 参考文档。
A:
fingerMove(): 使用 0-255 的数值范围,适用于快速控制fingerMoveArc(): 使用弧度制,适用于精确角度控制
// 使用 0-255 范围(L10)
std::vector<uint8_t> pose = {128, 128, 128, 128, 128, 128, 128, 128, 128, 128};
hand.fingerMove(pose);
// 使用弧度制(L10)
std::vector<double> pose_arc = {0.5, 0.3, 0.2, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
hand.fingerMoveArc(pose_arc);注意: fingerMoveArc() 仅支持 L10、L20、L21、L25 型号。
A:
- 范围: 0-255
- 速度: 值越大,运动速度越快
- 扭矩: 值越大,允许的最大扭矩越大
// 中等速度
std::vector<uint8_t> speed = {200, 200, 200, 200, 200};
// 最大扭矩
std::vector<uint8_t> torque = {255, 255, 255, 255, 255};A: getForce() 返回三维向量:
std::vector<std::vector<std::vector<uint8_t>>> force = hand.getForce();
// force[finger][sensor_type][data]
// finger: 0-4 (拇指、食指、中指、无名指、小指)
// sensor_type: 0-3 (法向压力、切向压力、切向方向、接近感应)
// data: 传感器数据矩阵示例:
auto force = hand.getForce();
for (size_t finger = 0; finger < force.size(); finger++) {
for (size_t sensor_type = 0; sensor_type < force[finger].size(); sensor_type++) {
// 处理数据...
}
}A:
setCurrent(): 仅 L20 支持setEnable()/setDisable(): 仅 L25 支持clearFaultCode(): 仅 L20 支持fingerMoveArc(): 仅 L10、L20、L21、L25 支持
详细支持矩阵请参考 API 参考文档。
A: 建议使用匹配的版本。如果遇到兼容性问题:
-
检查 SDK 版本:
std::string version = hand.getVersion(); std::cout << "SDK Version: " << version << std::endl; -
查看 更新日志(如果存在)了解版本变更
-
联系技术支持获取兼容性信息
A: 当前版本主要支持 Linux 系统。Windows 支持情况:
- 当前状态: 主要支持 Linux
- Windows: 可能需要额外的配置和编译
- 建议: 使用 Linux 系统(Ubuntu 18.04+ 推荐)
如有 Windows 支持需求,请联系技术支持。
A:
- GCC: 7.0 或更高版本
- Clang: 5.0 或更高版本
建议使用较新的编译器版本以获得更好的兼容性。
A: 响应时间取决于多个因素:
- 系统负载: 系统负载高时响应会变慢
- 网络延迟: EtherCAT 网络延迟
建议:
- 在动作后添加适当的延时:
std::this_thread::sleep_for(std::chrono::milliseconds(100)) - 避免过于频繁的 API 调用
- 使用多线程处理传感器数据
A: 以下建议可以提高性能:
-
降低轮询频率:
// 从 10ms 改为 100ms std::this_thread::sleep_for(std::chrono::milliseconds(100));
-
使用多线程:
std::thread sensor_thread([&hand]() { while (running) { auto force = hand.getForce(); // 处理数据... } });
-
批量处理操作:
- 减少不必要的 API 调用
- 缓存不需要实时更新的数据
-
优化通信:
- 优化通信参数
A: 可能的原因和解决方案:
-
轮询频率过高:
// 增加延时 std::this_thread::sleep_for(std::chrono::milliseconds(100));
-
阻塞操作:
- 使用异步操作
- 避免在循环中进行阻塞调用
-
资源泄漏:
- 检查资源是否正确释放
- 使用 RAII 原则管理资源
A: 可以通过以下方式获取支持:
-
文档:
-
在线资源:
-
GitHub Issues:
- 提交问题报告
- 查看已有问题和解决方案
A: 欢迎贡献!请参考以下步骤:
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
详细说明请参考 README.md。
A: 在 GitHub Issues 中报告 Bug 时,请提供:
- 错误信息: 完整的错误信息或日志
- 系统信息:
- 操作系统和版本
- 系统架构(x86_64/aarch64)
- SDK 版本
- 设备信息:
- 设备型号(L6/L7/L10/L20/L21/L25)
- 固件版本(如果知道)
- 复现步骤: 详细的步骤说明
- 相关代码: 能够复现问题的代码片段
A: 是的,项目提供了示例代码:
- 位置:
examples/目录 - 示例:
toolset_example.cpp- 工具集示例action_group_show_l10.cpp- L10 动作组示例
运行示例:
cd build
./toolset_example
./action_group_show_l10详细说明请参考 示例代码文档。
A: 更新步骤:
-
拉取最新代码:
git pull origin main
-
重新编译和安装:
./script.sh # 选择选项 [2]: Install SDK -
或手动更新:
cd build cmake .. make sudo make install
如有其他问题,请参考 故障排查指南 或联系技术支持。