6.4.6 动态跟随目标
简介
本示例演示在搭 载了 SpacemiT RISC-V 的实际机器人小车上,通过相机AI视觉检测人像并实现 navigation2 动态跟随。
SpacemiT RISC-V 中提供了四种方案实现机器人动态跟随人像目标:
对比项 | yolov6检测跟随 | nanotrack跟随 | bytetrack跟随 | yolov8pose跟随 |
---|---|---|---|---|
目标检测 | yolov6 | yolov6(仅初始化) | yolov8 | yolov8-pose |
人像跟踪 | / | nano-track | byte-track | / |
位置估计 | 人像框解算 | 人像框解算 | 人像框解算 | 关节点解算 |
动态跟随 | follow_point | follow_point | follow_point | follow_point |
运行负载 | 较低 | 中等 | 较高 | 中等 |
运行负载 | 较低 | 中等 | 较高 | 中等 |
准备工作
(1)SpacemiT 板子烧录 Bianbu ROS 系统镜像 。
(2)PC端安装 ros-humble、Bianbu Robot SDK。
使用介绍
配置 USB 相机传感器
插拔相机usb接口,输入以下命令对比查看新增端口号,即为该相机输入端口
ls /dev/video*
安装navigation2
sudo apt install ros-humble-navigation2
sudo apt install ros-humble-nav2-bringup
启动相机检测节点
输入以下命令打开usb相机,端口号替换为实际相机输入端口号。
source /opt/bros/humble/setup.bash
ros2 run jobot_usb_cam jobot_usb_cam_node_exe --ros-args -p video_device:=/dev/video20
PC端打开一个终端,输入以下命令查看相机图像:
source /opt/ros/humble/setup.bash
ros2 run rqt_image_view rqt_image_view
完成以上准备工作后,根据需求选择以下一种方案即可实现动态跟随人像目标。
以下操作如未特殊说明在PC端运行,均直接在SpaceMit板子上启动终端并运行相关命令。
目标检测、跟踪与位置解算
下述四种方案均可独立实现机器人动态跟随人像目标,可根据需求自行选择。
yolov6检测跟随
该方案通过yolov6检测人像目标获取人像框,通过像框像素值与预设参数解算人像目标位置,并使用navigation2-follow-point导航行为树实现动态跟随。
启动视觉推理节点
运行以下命令启动yolov6视觉推理节点,该节点会根据相机获取的图像信息,对人像目标进行持续检测和推理分类。
一个终端
source /opt/bros/humble/setup.bash
ros2 launch br_perception infer_video.launch.py config_path:='config/detection/yolov6.yaml' sub_image_topic:='/image_raw' publish_result_img:='true' result_topic:='/inference_result'
另一个终端
source /opt/bros/humble/setup.bash
ros2 launch br_visualization websocket_cpp.launch.py image_topic:='/result_img'
终端打印如下
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [websocket_cpp_node-1]: process started with pid [276081]
[websocket_cpp_node-1] Please visit in your browser: 10.0.90.219:8080
[websocket_cpp_node-1] [INFO] [1745548855.705411901] [websocket_cpp_node]: WebSocket Stream Node has started.
[websocket_cpp_node-1] [INFO] [1745548855.706897013] [websocket_cpp_node]: Server running on http://0.0.0.0:8080
[websocket_cpp_node-1] [INFO] [1745548856.281858684] [websocket_cpp_node]: WebSocket client connected.
查看websocket_cpp终端的"Please visit in your browser:",PC端打开浏览器访问10.0.90.219:8080
(不同的ip这个会变) 即可看到推理结果。
启动更新动态目标位置节点
打开一个新终端,运行以下命令启动更新动态跟随目标节点。
该节点会根据AI视觉检测模块获取的人像目标像素框,解算目标位置并更新机器人的导航目标点,同时可以在rviz2中可视化跟随目标。
source /opt/bros/humble/setup.bash
ros2 launch nav_goal_send goal_update_follow_point.launch.py
相机安装于小车的前部,并根据实际情况调整合适的仰角大小,要注意过小的仰角设置不利于yolo模型的人像检测。
打开参数配置文件/opt/bros/humble/share/nav_goal_send/config/params_follow_point.yaml
,查看参数如下:
pixel_w: 640 # 像素宽度
pixel_h: 480 # 像素高度
person_h: 1.7 # 人像身高
distance: 0.8 # 标定距离
width: 0.6 # 标定宽度
theta_h: 0.35 # 仰角高度
theta_d: 0.76 # 仰角距离
标定参数解释
标定距离distance:人像头顶与相机视野上侧重合时,人距离小车正前方x轴的距离
标定宽度width:在x=distance时,人朝小车y轴方向移动到人像与相机视野侧边重合,此时y轴方向的偏移宽度
仰角高度theta_h:用于标定相机下视场线仰角的参照物高度
仰角距离theta_d:将参照物在小车x轴方向移动,当相机视野下侧开始出现参照物时的距离
对于不同的相机安装位置和跟随目标,可以根据实际测量结果,通过修改上述参数配置文件来实现位置估计解算。
启动navigation2动态目标跟随
运行以 下命令,即可启动follow_point模式navigation2导航,该导航模式会持续跟随相机检测到的目标位置。
source /opt/bros/humble/setup.bash
ros2 launch br_navigation nav2_follow_point.launch.py
可以通过修改/opt/bros/humble/share/br_navigation/config/behavior_trees/follow_point.xml
行为树的参数distance
调整跟随距离,默认值为0.5m,即机器人跟随目标中心位置的最近距离。
<Sequence>
<GoalUpdater input_goal="{goal}" output_goal="{updated_goal}">
<RetryUntilSuccessful num_attempts="3" >
<ComputePathToPose goal="{updated_goal}" path="{path}" planner_id="GridBased"/>
</RetryUntilSuccessful>
</GoalUpdater>
<TruncatePath distance="0.5" input_path="{path}" output_path="{truncated_path}"/>
</Sequence>
nanotrack跟随
第二种跟随方案通过yolo模型检测到所需跟踪的人像后,发送给nanotrack模块进行初始化,之后进行人像跟踪并发布跟踪结果,通过人像框像素值与预设参数解算人像目标位置,并使用navigation2-follow-point导航行为树实现动态跟随。
视觉追踪节点初始化
nanotrack模型需要通过yolo检测的人像框进行初始化,同时只需要初始化一次,之后跟踪模块会自动跟踪该人像。
相机节点jobot_usb_cam启动后,首先运行以下命令启动yolo检测推理,获取初始化人像框信息:
source /opt/bros/humble/setup.bash
ros2 launch br_perception infer_video.launch.py config_path:='config/detection/yolov6.yaml' sub_image_topic:='/image_raw' publish_result_img:='true' result_topic:='/inference_result_for_nanotrack'
之后运行以下命令启动nanotrack视觉追踪节点:
source /opt/bros/humble/setup.bash
ros2 launch nanotrack_ros2 nanotrack.launch.py det_topic:='/inference_result_for_nanotrack' result_topic:='/inference_result'
yolo推理节点检测到可靠的人像信息后,会自动初始化nanotrack模块,当nanotrack节点窗口出现以下连续信息打印时,即表示模块初始化成功。
nanotrack模块初始化后,即可关闭yolov6检测推理,在终端内使用Ctrl+C关闭该节点。
注意:nanotrack为单目标跟踪模型,初始化后需要保证相机视野中有人像不丢失,否则可能会出现跟踪失败。
启动更新动态目标位置节点
打开一个新终端,运行以下命令启动更新动态跟随目标节点。
该节点会根据AI视觉检测模块获取的人像目标像素框,解算目标位置并更新机器人的导航目标点,同时可以在rviz2中可视化跟随目标。
source /opt/bros/humble/setup.bash
ros2 launch nav_goal_send goal_update_follow_point.launch.py
参考yolov6检测中的说明来调整跟随目标位置估计解算的参数配置,这里不再赘述。
启动navigation2动态目标跟随
运行以下命令,即可启动follow_point模式navigation2导航,该导航模式会持续 跟随相机检测到的目标位置。
source /opt/bros/humble/setup.bash
ros2 launch br_navigation nav2_follow_point.launch.py
参考yolov6检测中的说明来调整跟随距离参数配置,这里不再赘述。
bytetrack跟随
第三种方案为bytetrack跟踪,该方案在实现目标跟踪时需连续运行yolo人像推理检测模型,同时可以实现多目标跟踪。
启动yolov8检测+bytetrack跟踪节点
安装bytetrack检测所需的依赖
sudo apt install python3-scipy
sudo apt install python3-pip
sudo apt install python3-venv
创建一个虚拟环境,安装三方python包依赖
python3 -m venv ~/myenv
source ~/myenv/bin/activate
pip3 install lap cython_bbox
pip3 uninstall numpy
pip3 install numpy==1.26.4
配置环境变量
source /opt/bros/humble/setup.bash
export PYTHONPATH=~/myenv/lib/python3.12/site-packages:$PYTHONPATH
完成上述步骤并启动相机节点jobot_usb_cam后,在终端输入以下命令,即可一键启动yolov8n检测节点+bytetrack跟踪节点。
ros2 launch bytetrack_ros2 bytetrack.launch.py result_topic:='/inference_result'
bytetrack方案会同时检测并跟踪多个目标,每个目标都有自己的id识别信息。
注意:当人像信息在相机视野内丢失,再次出现时id会发生变化。
启动更新动态目标位置节点
打开一个新终端,运行以下命令启动更新动态跟随目标节点。
该节点会根据AI视觉检测模块获取的人像目标像素框,解算目标位置并更新机器人的导航目标点,同时可以在rviz2中可视化跟随目标。
source /opt/bros/humble/setup.bash
ros2 launch nav_goal_send goal_update_follow_point.launch.py
参考yolov6检测中的说明来调整跟随目标位置估计解算的参数配置,这里不再赘述。
启动navigation2动态目标跟随
运行以下命令,即可启动follow_point模式navigation2导航,该导航模式会持续跟随相机检测到的目标位置。
source /opt/bros/humble/setup.bash
ros2 launch br_navigation nav2_follow_point.launch.py