对应任务:“跑通项目的双足机器人的例子,如下图,并且编写一个脚本来向话题 /cmd_vel
发送数据控制机器人以指定的速度移动”。
启动该脚本后,可通过键盘按键向 /cmd_vel
话题发送消息控制 humanoid 仿真的运动方向:
- s: 前进
- w: 后退
- a: 向左
- d: 向右
- q: 左转
- e: 右转
代码使用了非阻塞输入,持续按下指定按键即可维持运动状态,无需回车。
对应任务:“自动切换步态的功能,即机器人在站立状态下向 /cmd_vel
发送不为 0 的速度可以自动向前走,同时发送为 0 的速度可以自动停止”。
启动脚本后,通过键盘输入速度数值可控制 humanoid 仿真的运动速度和步态:
- 输入任意非零速度:切换步态为
walk
,设置 x 方向速度为输入值(v > 0
前进,v < 0
后退)。 - 输入速度为
0
:切换步态为stance
,速度归零。
初始化状态下,步态为 stance
。
模型训练脚本,采用的 YOLO 版本为 YOLOv8,数据集为 handler
(训练集为 image_1~91.jpg
,验证集为 image_92~182.jpg
)。
通过图片检验 yolo_test_train1.py
训练所得模型的测试程序,测试对象为 image_92.jpg
。
检验 yolo_test_train1.py
训练所得模型对于视频内容的识别效果的测试程序,视频来源是电脑摄像头。程序会基于 YOLO 和卡尔曼滤波预测框选出 handler
,并用绿点标注预测中心;当检测目标被遮挡时,会基于卡尔曼滤波的预测,用红点继续标注预测的中心位置。
- 所有代码内对于文件的调用全部采用的是绝对路径。
humanoid_target_trajectories_publisher
控制/cmd_vel
话题的开启,是控制机器人行动速度必须开启的节点。- 通过全局检索发现,开启
humanoid_target_trajectories_publisher
的可执行文件位于humanoid_controllers
路径下,可通过开启新终端,source
之后运行$ rosrun humanoid_controllers humanoid_target_trajectories_publisher
手动开启该节点。
- 理解了话题和节点之间的关系,掌握了查询和开启话题对应节点的方法。
- 由于安装了
anaconda
环境导致出现大量依赖或包无法检测的问题,可以通过退出conda
环境解决大多数问题。 - 使用
catkin
工具进行catkin build
编译时一定不要忘记$ catkin config -DCMAKE_BUILD_TYPE=RelWithDebInfo
。 - 添加
cpp
和创建文件夹都需要重新编译,python
文件不需要编译。
- 初步了解
catkin
工具的使用,对编译工作空间的原理有了一定了解。
- 通过
legged_robot_sqp.launch
文件内容定位到开启步态控制终端的可执行文件,再根据其内容定位到发布消息的可执行程序GaitKeyboardPublisher.cpp
,通过阅读代码内容和关联查找确定步态消息发布的话题/humanoid_mpc_mode_schedule
和向该话题发布的消息格式,最后编写脚本根据输入直接向该话题发布消息即可。 - 期间遇到成功向
/humanoid_mpc_mode_schedule
话题发送步态信息并被接收,但仿真无反应,不进行步态切换的问题。通过rostopic list
查看发现/humanoid_mpc_mode_schedule
话题正常开启,通过echo
监控该话题发现消息被话题正常接收说明消息发布正常;通过查看legged_robot_sqp.launch
主程序运行终端发现消息未被仿真接收,说明接收异常,通过gpt
排查问题定位到接收消息的可执行文件GaitReceiver.cpp
,删除nodeHandle.subscribe()
内'this'
后的udp
部分后消息被仿真正常接收。
- 学会了如何定位达成某一控制目标需要的对应话题以及如何正确的向该话题发布消息,学习了
rostopic
相关指令的使用,积累了排查问题的经验和方法。
- 在
GitHub
上通过/code/commit
可以找到项目的历史分支,但是git clone
后存储到本地的版本仍为最新版本,需要在本地通过git commit
指令回退到指定历史版本。 - 同时推测问题 3 可能由未回退到指定历史版本导致。
- 初步了解了
git
的使用。
- 包装
dataset
的时候需要注意label
和image
的存放,images
和对应labels
需要放在相同的路径下,这样在.yaml
中提供images
路径后 YOLO 才可自动定位并匹配labels
,同时注意一定不要打错单词。
- 学习了如何使用 YOLO 训练自己的模型,了解了数据集、标注以及如何包装数据集。
- 在最开始版本的程序当检测对象脱离摄像头,其
_id
就会被 YOLO 检测自动忽略,导致即便添加了卡尔曼滤波也不会继续跟踪预测,只需单独处理,重新找到被忽略的对象并通过卡尔曼滤波对其位置持续预测即可。
- 学习了卡尔曼滤波的相关原理和程序实现。