Q&A
- 重装相关的环境
机器出厂时会安装好相应的开发和运行环境。如果在使用过程中损坏了主机的运行环境有以下两种方法来恢复。注意:请定期,及时保存自己的代码,当环境损坏之后可能之前编辑的代码会丢失。
- 使用官方的 Clonezilla 镜像,直接恢复系统到出厂的状态
- 使用以下重装环境的方法,重新安装环境
安装依赖的相关环境
安装第三方依赖库 sudo apt-get install liblcm-dev libgflags-dev libgoogle-glog-dev liblmdb-dev , 如果出现网络问题,可以使用 https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ 清华大学的加速源进行替换。
drake
根据官方文档进行,我们发布的软件版本,需要指定安装 1.19.0-1 版本的 drake。
# ..先根据官方文档配置好 apt 源
sudo apt install drake-dev=1.19.0-1注意最后一步需要将 drake 安装路径添加到 PATH 环境变量中, 可以根据自己使用的终端类型配置到 ~/.bashrc 或 ~/.zshrc 中。
安装 mpc 依赖 cassie_alip_mpc
参考 https://github.com/UMich-BipedLab/cassie_alip_mpc 中的 Build Install Casadi by Source and Install 章节安装
3.1 clone: git clone https://github.com/UMich-BipedLab/cassie_alip_mpc.git
3.2 执行以下命令
cd external_packages/casadi
sudo apt-get install gcc g++ gfortran git cmake liblapack-dev pkg-config --install-recommends
mkdir build
cd build
cmake ..
sudo make install
编译报错找不到lcm, findpackage()不能找到
原因:可能是lcm库没有正确安装
解决方法:确认已经按照以下流程安装lcm库
# 安装一些依赖
sudo apt install build-essential libglib2.0-dev cmake default-jdk python-all-dev liblua5.1-dev golang doxygen
# 克隆仓库并编译安装
git clone https://github.com/lcm-proj/lcm.git
cd lcm/ && mkdir bulid && cd build
cmake .. && make -j8
sudo make install编译报错找不到lcm的某些模块, findpackage()能找到lcm

错误内容:
Target "kuavocontroller" links to target "Lcm::lcm-coretypes" but the target was not found. Perhaps a find_package() call is missing for an IMPORTED target, or an ALIAS target is missing? Target "kuavoController" links to target "lcm::lcn" but the target was not found. Perhaps a find_package() call is missing for an IMPORTED target,or an ALIAS target is missing?原因: drake 中也带一个 lcm , 可能是 drake 版本不对, 或者drake环境变量没有配置到终端环境里面
解决方法:
- 确认安装了正确的drake版本
sudo apt install drake-dev=1.19.0-1 - 确认按照 官方教程 配置环境变量
注意最后一步, 需要根据自己使用的终端类型(常用的bash或者zsh终端), 将下面内容放到对应的配置文件中, 如bash终端放到
~/.bashrc, zsh终端放到~/.zshrcexport PATH="/opt/drake/bin${PATH:+:${PATH}}"
export PYTHONPATH="/opt/drake/lib/python$(python3 -c 'import sys; print("{0}.{1}".format(*sys.version_info))')/site-packages${PYTHONPATH:+:${PYTHONPATH}}" - 重开一个终端或者source对应配置文件, 清空kuavo仓库的build目录, 再重新编译即可
- 确认安装了正确的drake版本
编译时出现找不到libmodbus.so

- 需要安装modbus库,
sudo apt install libmodbus-dev
imu读取超时较多,或者Ecmaster通讯超时
可能原因:imu松动,电机通讯线松动,电池电量低
解决方法:
- 检查imu和驱动器连接是否正常(所有指示灯正常)
- 检查电池电量(左右两个电池都需要在60V以上)
启动时报错
Scan bus mismatch for the first slave on bus之类
- 可能原因: 主机和第一个驱动器之间的通信异常
- 解决方法: 检查网线口的指示灯是否亮起, nuc和第一个驱动器之间的连接无松动
启动时报错
Slave mismatch after xxx, Auto-inc Address 0xfff3, port 1之类
- 可能原因: 机器人实际电机数和配置文件中的电机数对不上, 可能是机器人版本不对, 或者驱动器之间连接线掉落导致驱动器数不对
- 解决方法:
echo $ROBOT_VERSION打印检查当前机器人版本, 查看对应的配置文件中的电机数是否和实际一致, 不一致需要设置成正确的版本并重新编译程序- 数量一致的话检查报错中第xxx个之后的连接是否正常
启动时报错
LinkOsCreateContext(): open device '/dev/atemsys' failed!之类
- 可能原因: 内核模块
atemsys没有正确自动挂载或者无权限访问 - 解决方法:
- 程序和硬件交互必须使用sudo执行, 或者切换到root用户下运行, 否则将无法启动
- 使用sudo执行仍然报错, 则可能是内核模块异常
- 检查内核模块是否正确挂载,
lsmod | grep atemsys - 如果没有成功挂载, 则使用
sudo modprobe atemsys尝试手动挂载 - 如果仍然报错, 则检查内核版本是否正确,
uname -r, 正常应该是5.15.94-rt59, 如果不是则需要开机进入grub页面切换到这个版本的内核 - 如果grub列表中已经没有对应版本的内核(我们提供的指定内核的镜像才有这个内核模块), 请重新刷写nuc镜像, 或者联系售后人员重新提供内核模块进行安装
- 检查内核模块是否正确挂载,
运行时或者电机使能时报错,终端报错 xxx 电机 absent

可能原因:中间某两个驱动器之间的连接异常,可能是线束松动或者中间某个驱动器损坏(从几号驱动器开始报错离线则那个驱动器和前一个驱动器之间的连接异常)。
解决方法:检查驱动器之间的连接线是否正常,可以是使能之后摇动一下连接线看连接是否稳定
机器人反馈较弱, 查看log超时(1ms)很多
- 需要注意 12 代的NUC需要禁用掉所有E核, 否则会导致NUC性能降低, 影响计算时间(出厂时的nuc应该预先配置禁用E核)
- 通过htop确认, 12代的nuc正常禁用掉E核之后, 会只有8个核心, 如果没有禁用, 会有16个核心, 这时候需要进入bios设置

机器人启动
启动 kuavo 程序 参考文档:https://www.lejuhub.com/highlydynamic/kuavo_opensource/-/blob/dev/docs/base_useage.md
启动 kuavo-ros-control 程序 参考文档:https://www.lejuhub.com/highlydynamic/craic_code_repo/-/blob/dev/readme.md
注意事项:
kuavo-ros-control需要根据文档中开源选项进行编译和运行。
VR的启动设置
参考文档:
https://www.lejuhub.com/highlydynamic/kuavo_ros1_workspace/-/blob/dev/readme.md
https://www.lejuhub.com/highlydynamic/motion_capture_ik_packaged/-/blob/develop/README.md
simulation 开发的相关设置
KUAVO
目前 kuavo 使用的 simulation 是基于 drake 的仿真, 而可视化则是基于 rviz 。
- 安装 drake 参考文档: https://www.lejuhub.com/highlydynamic/kuavo_opensource/-/blob/dev/docs/question_and_answer.md
- 启动 drake 仿真参考文档:https://www.lejuhub.com/highlydynamic/kuavo_opensource/-/blob/dev/docs/base_useage.md#%E4%BB%BF%E7%9C%9F%E8%BF%90%E8%A1%8C
- rviz 可视化参考文档:https://www.lejuhub.com/highlydynamic/rviz_visualize/-/blob/master/README.md
KUAVO-ROS-CONTROL
kuavo-ros-control 使用的 simulation 是基于 mujoco 的仿真, 而可视化则是基于 rviz 。kuavo-ros-control 机器人程序非真实机器人的情况下会自动启动仿真和可视化。
注意事项:
- kuavo drake 仿真中不支持控制手指和头部关节,如果需要控制手指和头部关节,需要使用物理机器人。
- 控制机器人关节电机时 kuavo 可视化 rviz 中的 robotModel 不会更新,而 kuavo-ros-control 会更新。
KUAVO 单独控制上下肢关节电机
现在上肢总共有 28 个电机可以控制:
- 14 个手臂关节
- 12 个手指关节
- 2 个头部关节
手臂关节名称:
left_arm_joint_names = [
"l_arm_pitch",
"l_arm_roll",
"l_arm_yaw",
"l_forearm_pitch",
"l_hand_yaw",
"l_hand_pitch",
"l_hand_roll",
],
right_arm_joint_names = [
"r_arm_pitch",
"r_arm_roll",
"r_arm_yaw",
"r_forearm_pitch",
"r_hand_yaw",
"r_hand_pitch",
"r_hand_roll",
]
手指关节名称:
left_hand_joint_names = [
"l_thumb_proximal_yaw",
"l_thumb_distal_pitch",
"l_index_proximal_finger",
"l_middle_proximal_finger",
"l_ring_proximal_finger",
"l_pinky_proximal_finger",
],
right_hand_joint_names = [
"r_thumb_proximal_yaw",
"r_thumb_distal_pitch",
"r_index_proximal_finger",
"r_middle_proximal_finger",
"r_ring_proximal_finger",
"r_pinky_proximal_finger",
]
头部关节名称:
head_joint_names = [
"head_yaw",
"head_pitch",
]
控制关节电机:
读取关节电机状态:
读取手臂关节 API 文档:https://www.lejuhub.com/highlydynamic/kuavo_opensource/-/blob/dev/docs/ros_interfaces/pub_topics.md#robot_arm_q_v_tau
下肢不支持单独控制某个电机,现在控制下肢的方式有两种:
- 切换机器人状态机状态,
stand,squat,jump,walk实现机器人行走,蹲下,跳跃等动作, 切换状态机 API 文档 https://www.lejuhub.com/highlydynamic/kuavo_opensource/-/blob/dev/docs/ros_interfaces/services.md#setphase。 - 通过
ros话题发布控制机器人行走(目前仅支持速度控制, 并且需要在walk状态下),API 文档:https://www.lejuhub.com/highlydynamic/kuavo_opensource/-/blob/dev/docs/ros_interfaces/sub_topics.md#walkcommand - 程序内部会维护机器人平衡性,假如机器人行走不稳会自动切换到
stand状态。 - 读取机器人当前状态机状态 API 文档:https://www.lejuhub.com/highlydynamic/kuavo_opensource/-/blob/dev/docs/ros_interfaces/pub_topics.md#leju_robot_phase
注意事项:
- 下发和读取 API 中关节的单位不同,请根据 API 文档指引来下发关节值。
如何使用机器人头部的相机以及 API 调用?
相机连接运行于机器人头部的 NUC,在使用时头部 NUC 作为上位机,包含的功能包见kuavo_ros_application 仓库。您可以阅读仓库 README或功能包说明文档以了解上位机开发环境、ROS 主从机配置以及功能包使用。
您可以阅读如下文档以了解如何使用对应的功能包和开发示例:
注意事项
- 通常上位机已经具备功能包依赖的基础环境,如遇环境问题请您阅读上述的环境安装文档自行操作;
- 相机相关的功能包需运行在头部 NUC 上位机,在使用时请与躯干 NUC 配置好 ROS 主从机环境。
如何完成机器人走到目标点,并抓取物体?
机器人需要从 A 点走到 B 点,然后通过视觉相机作为输入信号,控制手部进行物体抓取动作。
可通过向walkCommand话题发送机器人的 x,y 轴速度和 yaw 角速度,控制机器人运动,话题详情见文档。
您可以在 B 点粘贴 Apriltag,通过相机识别到 tag 基于机器人的位置,利用
walkCommand话题控制机器人到达 B 点,缺点是需要确保相机在 A 点时能识别到 B 点的 tag。或若 B 点是基于 A 点的,比如 A 的正前方 2 m。那么您可以生成
nav_msgs/Path或Point表示的路径,利用 PID 或 MPC 控制算法通过话题walkCommand控制机器人沿着轨迹运动到达 B 点。或若您的机器人配备雷达导航功能,也可通过设置雷达起始点和目标点,让机器人导航到 B点,关于雷达导航的功能您可以阅读文档。
可通过kuavo_arm_traj话题和control_end_hand服务分别控制手臂运动和灵巧手抓取,话题/服务详情见订阅话题文档和服务文档。
您可以参考示例和文档, 利用视觉特征识别物体基于
torso躯干的位置,利用逆解得到末端执行器在抓取位置的关节值,控制手臂运动到该点完成抓取。您可以参考示例, 在物体表面平整处粘贴 Apriltag(比如瓶盖),然后通过相机识别到 tag 基于机器人
torso的位置,利用逆解得到末端执行器在抓取位置的关节值,控制手臂运动到该点完成抓取。您还可以利用贝塞尔曲线插值、三次样条曲线插值等方法优化生成更加平滑的手臂运动轨迹。
更多关于 Kuavo 的 ROS 话题和服务见话题文档。