预约通道
内容课程
在AI操控机器人系列第一期的手势控制教程中,身为地平线资深程序员的奶爸,使用地平线发布的机器人开发平台TogetherROS软件栈,搭建了手势操控机器人。
当孩子的小伙伴们还是带个手套或者使用遥控器指挥机器人跑跑时,手势控制这么AI的机器人让小朋友得意了很长一段时间。(点击一下,内容回顾)
可是好景不长,小朋友对待玩具都是喜新厌旧的,这就给我提了新的需求,小小年纪就展现了当产品经理的潜力。
“能不能让机器人跟在我后面跑,就像咱们家狗狗那样呢?”
为了体现老爸的厉害,这个人体跟随机器人必须搞起(其实是机器人开发平台里面丰富的算法让我这么有底气)。
一、功能介绍
大家先看一下最终实现的功能。
![](https://developer.horizon.ai/api/v1/static/fileData/20220729-160515_20220729160638.gif)
从跟随效果来看,当人移动时,机器人能够迅速跟随人移动,得益于地平线旭日®️X3派(以下简称X3派)上5Tops算力的BPU可以实现低延迟(30ms左右)、高帧率(满帧30fps)、远距离(>8m)、低系统负载(4核CPU只占用了单核<40%)的算法推理能力。
开始码代码前,先来简单分析一下人体跟随机器人需要具备哪些基本模块。
传感
对于人体跟随这类基于视觉的AI算法应用,首先需要有视觉传感器来捕捉图像数据。
感知
获取到传感器发布的图像后,通过视觉算法进行推理,检测到人体,实现感知的能力。
交互
检测到人体之后,需要定义并实现对应不同人体检测结果的功能应用,如人体在机器人的右边需要控制机器人向右转动。
控制
根据“交互”模块输出的控制指令,实现对机器人的机械控制。
机器人本体
当然还需要一个具备运动能力的机器人本体,接收控制指令并控制电机运动,实现最终的机器人跟随人体的效果。
地平线发布的机器人平台TogetherROS软件栈内置了丰富易用的机器人开发组件,包含搭建一个智能机器人应用(如人体跟随机器人和第一期的机器人手势控制)所涉及到的所有功能模块,完全开源免费,并允许开发者二次开发,接下来开始搞起。
二、准备工作
准备搭建机器人人体跟随应用案例的硬件设备和软件包。
硬件
硬件包括:
①X3派
![](https://developer.horizon.ai/api/v1/static/fileData/1_20220729161946.png)
②F37 MIPI摄像头
![](https://developer.horizon.ai/api/v1/static/fileData/2_20220729161958.png)
③机器人
![](https://developer.horizon.ai/api/v1/static/fileData/3_20220729162015.png)
X3派和TogetherROS适配了本末双足机器人和小R科技的麦轮小车。这边为了让孩子觉得机器人足够高大上,就用本末的轮足机器人来介绍,没有的同学也不用担心,文章后面会介绍自己搭建机器人的方式。
④其他配件
a.USB Type C接口电源线。至少搭配5V@2A适配器,用于X3派供电。
b.串口线,连接方式如下:
![](https://developer.horizon.ai/api/v1/static/fileData/4_20220729162039.png)
c.TF存储卡和读卡器。旭日X3派开发板采用TF存储卡作为系统启动介质,推荐使用至少8GB容量、速率C10以上的TF存储卡,以便满足Ubuntu系统及更多应用功能包对存储空间的需求。
安装系统
参考旭日X3派的用户手册的安装系统章节,安装完成(或者已经安装过)需要更新系统。
系统配置
配置X3派的无线网络,参考X3派的用户手册的无线网络章节。
无线网络配置成功之后,查询IP地址:
![](https://developer.horizon.ai/api/v1/static/fileData/5_20220729162102.png)
可以看到,X3派的无线网路分配的IP地址为192.168.1.147,下面开始使用这个地址和root账号(密码为root)通过ssh远程连接到X3派,登录成功后的状态如下:
![](https://developer.horizon.ai/api/v1/static/fileData/6_20220729162132.png)
安装TogetherROS
使用apt命令通过DEB包安装TogetherROS。
登录旭日X3派ssh root@192.168.1.147,执行命令sudo apt install hhp,安装过程如下:
root@ubuntu:~# sudo apt install hhp
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
hhp0 upgraded, 1 newly installed, 0 to remove and 52 not upgraded.
Need to get 384 MB of archives.
After this operation, 512 MB of additional disk space will be used.
Get:1 http://42.62.85.28/ubuntu-ports focal/main arm64 hhp arm64 1.0.1 [384 MB]
Fetched 384 MB in 6min 43s (954 kB/s)
Selecting previously unselected package hhp.(Reading database ... 110406 files and directories currently installed.)
Preparing to unpack .../archives/hhp_1.0.1_arm64.deb ...
Unpacking hhp (1.0.1) ...
Setting up hhp (1.0.1) ...
Generating locales (this might take a while)...
en_US.ISO-8859-1... done
en_US.UTF-8... done
Generation complete.
查看/opt目录下文件:
root@ubuntu:/userdata# ls /opt/
tros
可以看到TogetherROS已安装在/opt目录下,说明安装成功。至此,准备工作结束,下面开始使用这些硬件设备和软件包搭建机器人人体跟随App。
三、使用介绍
接下来开始搞各个功能模块,再一步步组装起来,分别验证其功能。
安装和测试F37摄像头
将F37摄像头通过MIPI线连接到X3派上,连接方式如下:
![](https://developer.horizon.ai/api/v1/static/fileData/7_20220729162204.jpg)
直接使用TogetherROS中的ROS package测试F37的功能。以下通过脚本启动摄像头采集,图像编码,web展示功能包,实现将F37摄像头采集到的图像进行编码后,通过PC端web浏览器实时查看采集到的图像。 登录旭日X3派ssh root@192.168.1.147后,在终端(以下默认终端都是通过ssh登录)中输入以下命令启动:
# 配置 TogetherROS 环境:
source /opt/tros/local_setup.bash
# 启动脚本
ros2 launch websocket hobot_websocket.launch.py
启动成功的终端状态如下:
![](https://developer.horizon.ai/api/v1/static/fileData/8_20220729162235.png)
摄像头开始采集图像并对外发布图像消息。PC浏览器(chrome/firefox/edge)输入X3派IP地址,即可查看F37实时采集到的图像效果:
![](https://developer.horizon.ai/api/v1/static/fileData/20220729-161545_20220729162531.gif)
说明F37摄像头已安装成功并能够对外发布图像消息。
测试人体检测算法和交互功能
X3派上打开一个终端,启动人体检测和控制的脚本:
# 配置TogetherROS环境
source /opt/tros/setup.bash
# 从TogetherROS的安装路径中拷贝出运行示例需要的配置文件。
cp -r /opt/tros/lib/mono2d_body_detection/config/ .
#启动launch文件
ros2 launch body_tracking hobot_body_tracking_without_gesture.launch.py
启动成功后,当有人体出现在F37摄像头前时,终端输出如下信息:
[body_tracking-5] [INFO] [1657615485.941625685] [TrackingManager]: track_id: 1, frame_ts: 485910, tracking_sta(0:INITING, 1:TRACKING, 2:LOST): 1, gesture: 0, y pixel to robot: 2, present_rect: 540 6 954 542
[body_tracking-5] [INFO] [1657615485.941724902] [TrackingManager]: UpdateTrackAngle: frame_ts: 485910, track_id: 1, angel_with_robot: 45
[body_tracking-5] [INFO] [1657615485.942362166] [TrackingManager]: rotate direction: 0, step: 0.500000
[body_tracking-5] [WARN] [1657615485.942528139] [RobotCmdVelNode]: RobotCtl, angular: 0 0 -0.5, linear: 0 0 0, pub twist ts: 1657615485942515
以上log显示机器人在跟随目标编号为1(track_id: 1)的人体(tracking_sta: 1),人体不在机器人的正前方,和机器人之间的角度为45度,跟随交互模块控制机器人以0.5r/s的速度向人体方向转动(rotate direction: 0, step: 0.500000)。 在PC端浏览器上会实时渲染显示摄像头采集到的图像,人体、人头、人脸和人手检测框和目标编号结果,人体骨骼关键点以及实时的性能统计数据,如下图:
![](https://developer.horizon.ai/api/v1/static/fileData/9_20220729162355.png)
其中浏览器下方显示的fps为实时的AI推理输出的帧率,和F37摄像头采集图像的帧率30fps一致。ai_delay(单位为毫秒)为28,表示的是单帧推理的延迟,从传感Node发布图像数据开始,经过感知算法Node推理后,发布包含人体检测结果的AI msg的耗时。 板端使用top命令查看系统资源占用如下图所示,其中mono2d_body_detection为人体检测算法推理进程,此时CPU使用率为38.9%。
![](https://developer.horizon.ai/api/v1/static/fileData/10_20220729162412.png)
经过以上测试,说明在X3派上,TogetherROS的人体检测算法运行成功,并且算法可以实现低延迟(30ms)、高帧率(满帧30fps)、远距离(>8m)、低系统负载(单核CPU占用<40%)的算法推理效果,体现了X3 BPU强大的算力。
人体检测算法测试完成后,接着测试人体跟随功能。X3派上另起一个终端,执行如下命令查询X3派上的话题列表:
# 配置TogetherROS环境
source /opt/tros/setup.bash
ros2 topic list
输出如下:
![](https://developer.horizon.ai/api/v1/static/fileData/11_20220729162619.png)
其中/cmd_vel话题是人体跟随控制节点发布的控制命令消息。在当前终端执行ros2 topic echo /cmd_vel命令查询X3派上的话题信息,当人体出现在F37摄像头前并且偏离正前方时,终端输出如下:
![](https://developer.horizon.ai/api/v1/static/fileData/12_20220729162632.png)
可以看到,此时人体跟随控制节点发布发布出的/cmd_vel话题的angular z数据为-0.5,表示以0.5r/s的速度转动。 说明人体识别算法和交互功能的软件包已安装成功,并能够通过/cmd_vel话题对外发布机器人运动控制消息。
将X3派安装到机器人上
将X3派安装到机器人上,并测试在X3派上通过发布/cmd_vel话题控制机器人运动的功能。连接了F37摄像头的X3派直接固定在机器人上,并将机器人的USB控制接口插到X3派上。 安装效果如下:
![](https://developer.horizon.ai/api/v1/static/fileData/13_20220729162648.png)
对于支持使用ROS开发的机器人,一般会提供一个基于ROS开发的机器人运动控制Node,功能为订阅/cmd_vel话题的控制消息(ROS2中定义的用于机器人控制的消息,消息类型为geometry_msgs/msg/Twist),根据控制协议,通过USB等接口向机器人发送运动控制指令,实现控制机器人运动的目的。
本文使用的本末双足机器人使用的是USB接口,并提供了运行在X3派上的运动控制package,package订阅到/cmd_vel话题的控制消息后,通过USB向机器人下发控制指令,实现对机器人的控制。 在X3派上启动本末双足机器人运行控制Node。打开一个终端,执行如下命令:
# 配置TogetherROS环境
source /opt/tros/setup.bash
#启动本末机器人运动控制package
ros2 run diablo_sdk ros_bridge_example
执行成功后终端中输出如下信息:
![](https://developer.horizon.ai/api/v1/static/fileData/14_20220729162734.png)
X3派上重新打开一个终端,通过发布/cmd_vel话题消息控制机器人以0.3r/s的速度转动:
# 配置TogetherROS环境
source /opt/tros/setup.bash
ros2 topic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.3}}'
执行成功后终端中输出如下信息:
![](https://developer.horizon.ai/api/v1/static/fileData/15_20220729162748.png)
机器人收到控制指令后转动的效果如下:
![](https://developer.horizon.ai/api/v1/static/fileData/20220729-162833_20220729162851.gif)
说明机器人能够按照发布的控制命令消息正确的实现运动。
对于其他机器人应该怎么安装
如果手里是其他的移动机器人,例如有一个使用树莓派或者Jetson Nano作为上位机的机器人,也可以将X3派安装在机器人上,代替树莓派或者Jetson Nano,实现控制机器人运动。 安装方法如下:
①编译可以运行在X3派上的运动控制package;
a.X3派上安装ROS2软件系统构建和编译工具:
apt update
apt-get install python3-catkin-pkg
pip3 install empy
pip3 install -U colcon-common-extensions
b.将原先运行在树莓派或者Jetson Nano上的机器人运动控制ROS2 package源码拷贝到X3派上;
c.在X3派上,package源码工程所在路径下,直接使用source /opt/tros/setup.bash; colcon build命令编译package;
d.如果原先运动控制package是基于ROS1开发,源码需要适配到ROS2。只需要适配"cmd_vel"话题消息的订阅和处理,如果原先的ROS1 package中有其他功能,可以先不关注。
②安装
a.将X3派固定在机器人上,如果空间有限,可以将原先的树莓派或者Jetson Nano拆除;
b.使用USB Type C给X3派供电,如果机器人上无Type C供电输出,也可以使用移动电源(输出至少5V&直流 2A)给X3派供电;
c.将机器人的USB控制接口插到X3派上。
③测试
a.X3派上启动新编译的机器人运动控制package;
b.X3派上重新打开一个终端,通过发布/cmd_vel话题消息控制机器人以0.3r/s的速度转动:
# 配置TogetherROS环境
source /opt/tros/setup.bash
ros2 topic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.3}}'
如果机器人正常转动,说明X3派安装成功。
四、完整的机器人人体跟随效果
下面开始测试完整的机器人人体跟随功能。
X3派上打开一个终端,启动人体检测和控制脚本
# 配置TogetherROS环境
source /opt/tros/setup.bash
# 从TogetherROS的安装路径中拷贝出运行示例需要的配置文件。
cp -r /opt/tros/lib/mono2d_body_detection/config/ .
#启动launch文件
ros2 launch body_tracking hobot_body_tracking_without_gesture.launch.py
X3派上打开一个终端,启动机器人运动控制Node
# 配置TogetherROS环境
source /opt/tros/setup.bash
#启动本末机器人运动控制Node
ros2 run diablo_sdk ros_bridge_example
机器人跟随人移动
![](https://developer.horizon.ai/api/v1/static/fileData/20220729-163142_20220729163158.gif)
五、原理分析
第4章节中,在X3派的两个终端中分别启动了hobot_body_tracking_without_gesture.launch.py脚本和运动控制Node,实现了机器人跟随人体的效果,本章节对实现的原理进行分析。
App运行时的Node和Topic信息
对于一个基于ROS开发的App,首先会想到这个App在运行时有哪些Node,这些Node发布和订阅了哪些Topic,以及这些Node之间的关联。
在X3派上使用ros2的命令行工具查询设备上运行的Node和Topic信息:
root@ubuntu:~# source /opt/tros/setup.bash
root@ubuntu:~# ros2 node list
/ai_msg_sub_node
/hobot_codec1658324595406906403
/horizon_tracking_RobotCmdVel
/mipi_cam
/mono2d_body_det
/ros_bridge_example
/tracking_strategy_parameter_node
/transform_listener_impl_5594bf54a0
/websocket
root@ubuntu:~# ros2 topic list
/cmd_vel
/hbmem_img080a1309022201080401012021072312
/hobot_mono2d_body_detection
/image_jpeg
/image_raw
/imu/data_raw
/odom
/parameter_events
/quat_odom
/raw_odom
/rosout
/tf
/tf_static
查询到X3派上运行着多个Node,这些ROS2 Node之间是基于pub&sub机制通信,通过topic将这些Node串联起来形成一个pipeline。
此App运行时Node以及Topic信息比较多,看不出Node之间的关联。可以在PC端通过rqt(PC端需要安装ROS2 Foxy版本,rqt,以及PC需要和X3派处于同一网段)的Node Graph功能可以可视化的展示X3派上运行的Node,Node发布和订阅的topic,以及Node之间的连接关系,如下图(其中椭圆形框内为Node名,矩形框内为topic名):
![](https://developer.horizon.ai/api/v1/static/fileData/16_20220729163359.png)
可以看到,整个graph(pipeline)以mipi_cam Node(图像采集和发布)为起点,websocket Node(序列化图片和AI结果,用于可视化展示)和ros_bridge_example Node(机器人运动控制)为终点,起点和终点之间连接着多个Node。这些Node中ros_bridge_example Node是通过ros2 run diablo_sdk ros_bridge_example命令启动,其余Node都是通过hobot_body_tracking_without_gesture.launch.py脚本启动。
注意:/ai_msg_sub_node节点订阅到的/hobot_mono2d_body_detection话题消息实际是由/horizon_tracking_RobotCmdVel节点处理,导致显示的graph不连续,属于设计上的待完善点
App的Node介绍
对于复杂的包含多个Node的应用,ROS2提供了使用启动脚本通过launch批量启动Node的功能。
机器人跟随人体App使用hobot_body_tracking_without_gesture.launch.py脚本来启动这些Node,脚本内容如下:
import os
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from ament_index_python import get_package_share_directory
def generate_launch_description():
web_service_launch_include = IncludeLaunchDescription(
PythonLaunchDescriptionSource(
os.path.join(
get_package_share_directory('websocket'),
'launch/hobot_websocket_service.launch.py'))
)
return LaunchDescription([
web_service_launch_include,
# 启动图片发布pkg
Node(
package='mipi_cam',
executable='mipi_cam',
output='screen',
parameters=[
{"out_format": "nv12"},
{"image_width": 960},
{"image_height": 544},
{"io_method": "shared_mem"},
{"video_device": "F37"}
],
arguments=['--ros-args', '--log-level', 'error']
),
# 启动jpeg图片编码&发布pkg
Node(
package='hobot_codec',
executable='hobot_codec_republish',
output='screen',
parameters=[
{"channel": 1},
{"in_mode": "shared_mem"},
{"in_format": "nv12"},
{"out_mode": "ros"},
{"out_format": "jpeg"},
{"sub_topic": "/hbmem_img"},
{"pub_topic": "/image_jpeg"}
],
arguments=['--ros-args', '--log-level', 'error']
),
# 启动单目rgb人体、人头、人脸、人手框和人体关键点检测pkg
Node(
package='mono2d_body_detection',
executable='mono2d_body_detection',
output='screen',
parameters=[
{"ai_msg_pub_topic_name": "/hobot_mono2d_body_detection"}
],
arguments=['--ros-args', '--log-level', 'error']
),
# 启动web展示pkg
Node(
package='websocket',
executable='websocket',
output='screen',
parameters=[
{"image_topic": "/image_jpeg"},
{"image_type": "mjpeg"},
{"smart_topic": "/hobot_mono2d_body_detection"}
],
arguments=['--ros-args', '--log-level', 'error']
),
# 启动人体跟随pkg
Node(
package='body_tracking',
executable='body_tracking',
output='screen',
parameters=[
{"ai_msg_sub_topic_name": "/hobot_mono2d_body_detection"},
{"activate_wakeup_gesture": 0},
{"img_width": 960},
{"img_height": 544},
{"track_serial_lost_num_thr": 30},
{"move_step": 0.5},
{"rotate_step": 0.5},
{"activate_robot_move_thr": 5}
],
arguments=['--ros-args', '--log-level', 'info']
)
])
脚本中指定了多个Node,其中每个Node中的package配置项表示Node名,可以看到脚本中配置的Node名和5.1章节中查出来的一致。
在第1章节,分析了机器人人体跟随App所需要具备的功能模块,下面按照这些功能模块对Node进行分析。
传感
使用了TogetherROS中的Hobot Sensor组件中的mipi_cam Node,同时指定了Node的参数:
"out_format":发布图片的格式为"nv12"
"image_width":图片分辨率宽为960
"image_height":图片分辨率高为544
"io_method":发布出来的图片传输方式为"shared_mem",即共享内存方式,对应消息的topic为"hbmem_img"
"video_device":指定了使用的MIPI摄像头类型为"F37",表示F37摄像头
参数指定了使用F37摄像头,发布的图片格式和分辨率可以直接用于算法推理,其中通过共享内存方式发布图片,可以极大地降低系统负载和传输延迟。
感知
使用了TogetherROS中的Boxs算法仓库中的人体检测和跟踪算法,订阅Hobot Sensor(mipi_cam Node)发布的图像消息,利用BPU处理器进行AI推理,发布包含人体、人头、人脸、人手框和人体骨骼关键点检测结果的AI msg,并通过多目标跟踪(multi-target tracking,即MOT)功能,实现检测框的跟踪和目标编号分配。
Node对应package名为'mono2d_body_detection',同时指定了Node的参数:
"ai_msg_pub_topic_name":发布包含人体检测框信息的AI感知结果的topic名为"/hobot_mono2d_body_detection"
人体检测和跟踪算法推理Node(Mono2dBodyDetNode)主要包含三部分逻辑独立的功能:
Node初始化和启动
配置算法使用的模型信息,创建消息的发布者和订阅者,启动目标跟踪算法引擎;
订阅消息和算法推理
在注册的图像消息回调中,处理图像数据并用于算法模型推理,回调中不等待算法推理完成;
推理结果的处理和发布
算法推理完成后,通过注册的回调PostProcess输出推理结果,回调中对检测结果按照时间顺序排序(NodeOutputManage)以及进行多目标跟踪算法(HobotMot)处理后,发布算法推理结果消息。
Node的设计和流程逻辑如下图:
![](https://developer.horizon.ai/api/v1/static/fileData/374e8d78-9c80-428b-9fc4-4e838f77c782_20220729163517.png)
交互
人体跟随策略Node订阅人体检测和跟踪算法发布的包含人体信息的AI msg,根据人体框和机器人的位置关系,发布前进、后退、左转、右转的控制消息,实现控制机器人运动。 Node发布的运动控制消息为ROS2中定义的消息,topic为“/cmd_vel”,消息类型为“geometry_msgs/msg/Twist”,Node对应package名为'body_tracking',同时指定了Node的参数:
"ai_msg_sub_topic_name": 订阅包含人体检测信息的topic名为"/hobot_mono2d_body_detection"
"activate_wakeup_gesture": 唤醒手势开关,值为0表示不启用唤醒手势。一般在人较多,环境复杂的场景,通过启用唤醒手势避免误触发人体跟随功能。
"img_width": 人体检测模型输入图片像素的宽
"img_height": 人体检测模型输入图片像素的高
"track_serial_lost_num_thr": 人体连续消失帧数阈值,值为30,表示当跟随的人体连续消失30帧之后会重新选择跟随的人体
"move_step": 平移运动的步长(速度),0.5表示移动速度为0.5m/s,值越大速度越快
"rotate_step": 旋转运动的步长(速度),0.5表示旋转速度为0.5r/s,值越大速度越快
"activate_robot_move_thr": 激活机器人移动的阈值,单位为像素。当人体检测框的y像素值小于阈值(具体画面的上边界)时,激活机器人移动。
人体跟随策略选择第一次出现的人体作为跟随人体,如果有多个人体同时出现,选择最大宽度的人体检测框作为跟随人体;已有跟随人的情况下,其他的人体检测结果都无效。 Node输出的log中tracking_sta关键字表示跟随的状态,0表示未找到跟随人,1表示已有跟随人,2表示跟随人消失。Node启动后,未找到跟随人的情况下,输出log中tracking_sta值为0;当有跟随人时,输出log中tracking_sta值为1,同时通过track_id关键字输出跟随人的编号;只有当跟随人消失,即连续track_serial_lost_num_thr帧(配置为30帧,对于输出频率为30fps的F37摄像头,为1秒)未检测到跟随人,判断跟随人消失,开始重新选择跟随人,跟随人消失时输出log中tracking_sta值为2。
如果需要启用唤醒手势避免误触发,唤醒手势使用方法详见人体跟随策略的代码仓库。
控制
机器人运动控制Node订阅人体跟随策略Node发布的topic为“/cmd_vel”的控制消息,根据控制协议,通过USB总线向机器人下位机发布运动控制指令。对于不同类型的机器人,控制协议不同,对应于不同的运动控制Node。本文使用的是本末双足机器人,对应的运动控制Node启动方法为ros2 run diablo_sdk ros_bridge_example。此Node单独启动,不在启动脚本中。
App的系统设计
根据5.1和5.2章节的介绍,已经知道了机器人人体跟随App启动了哪些Node,这些Node的功能,Node之间的关系,以及使用这些Node如何实现通过人体跟随机器人的目标。下面进行理论总结,介绍此App的系统设计。对于一个复杂的机器人系统,一般在机器人上配置上位机和下位机两种处理器,机器人上位机的计算能力较强,执行复杂的机器人上层应用,同时能够最大程度屏蔽不同类型机器人的底层差异;机器人下位机一般使用低成本的MCU处理器,对机器人本体上的各类传感器和硬件进行数据采集/控制。
人体跟随App由两部分组成,分别为机器人和PC端,其中机器人部分又分为上位机和下位机。详细组成如下图:
![](https://developer.horizon.ai/api/v1/static/fileData/17_20220729163912.png)
机器人上位机为X3派,运行着多个ROS2 Node,除了5.2章节介绍的传感、感知、交互和控制功能,还有JPEG图像编码和WEB展示功能,将摄像头发布的图片编码压缩,以及将人体检测和跟踪算法发布的AI数据序列化后使用websocket协议发布,实现跨设备在PC端渲染展示和调试(机器人下位机属于机器人本体的一部分,详细说明略)。
从App的系统设计图中可以看出,搭载了X3派和TogetherROS的机器人,利用芯片的AI加速能力和TogetherROS中丰富的算法、机器人开发组件,可以实现快速开发智能机器人应用的目标。
六、FAQ
如何复现App效果?
复现App效果涉及到两部分:
(1)机器人人体跟随App
参考第2章准备工作,在X3派上安装TogetherROS。
(2)本末双足机器人和机器人运动控制package
获取方法详见产品信息:https://developer.horizon.ai/forumDetail/94246984227025410
除了本末双足机器人,X3派和TogetherROS还适配了小R科技的麦轮小车,也可以使用小R小车直接体验App效果。
没有机器人的情况下可以体验App效果吗?
可以体验。 在没有机器人的情况下,可以使用此App控制gazebo仿真环境下的虚拟机器人运动。
如何将App适配到自己的机器人上?
本文以本末双足机器人为例介绍人体跟随App的效果,App本身不依赖于任何形态的机器人,App发布的运动控制消息为ROS2中定义的消息(topic为“/cmd_vel”,消息类型为“geometry_msgs/msg/Twist”,具体说明参考第5章的原理分析)。
如下图,可以将App的组成划分成红色和蓝色虚线框两个部分:
![](https://developer.horizon.ai/api/v1/static/fileData/18_20220729163845.png)
(1)红色虚线框部分
这部分功能不依赖于机器人,即可以直接移植到任意形态的机器人上。
移植方法为将X3派安装在机器人上,按照第2章节的准备工作,在X3派上安装摄像头传感器和TogetherROS。
(2)蓝色虚线框部分
这部分功能依赖于机器人,需要针对性的适配。根据机器人的状态不同,对应不同的适配方法。
状态1,原先机器人上有上位机和下位机,如原先使用树莓派或者Jetson Nano作为上位机,并且上位机上有机器人运动控制Node。需要在X3派上重新编译机器人运动控制Node。
状态2,原先机器人上只有下位机。需要开发机器人运动控制Node后(开发参考components/xrrobot · develop · HHP / app / xr_robot · GitLab (horizon.ai)),在X3派上编译机器人运动控制Node。
App支持哪些摄像头?
App对于摄像头类型没有要求,地平线机器人平台支持MIPI和USB两类摄像头。对于MIPI摄像头,支持F37和GC4663两种型号。
如何调整机器人的运动速度?
修改App启动脚本hobot_body_tracking_without_gesture.launch.py中人体跟随策略body_tracking Node中的move_step和rotate_step参数,可以控制机器人的平移和旋转速度:
# 启动人体跟随pkg
Node(
package='body_tracking',
executable='body_tracking',
output='screen',
parameters=[
{"ai_msg_sub_topic_name": "/hobot_mono2d_body_detection"},
{"activate_wakeup_gesture": 0},
{"img_width": 960},
{"img_height": 544},
{"track_serial_lost_num_thr": 30},
{"move_step": 0.5},
{"rotate_step": 0.5},
{"activate_robot_move_thr": 5}
],
arguments=['--ros-args', '--log-level', 'info']
)
可以开发一个python的Node扩展App功能吗?
可以,ROS2支持跨设备、跨平台、跨语言,TogetherROS完全兼容ROS2 Foxy版本,因此也支持这些特性。
例如根据检出的人体骨骼关键点,开发交互Node,控制人形机器人模仿人的肢体动作。订阅hobot_mono2d_body_detection话题消息(包含人体骨骼关键点信息),使用命令可以查询到话题的详细信息:
# ros2 topic info /hobot_mono2d_body_detection
Type: ai_msgs/msg/PerceptionTargets
Publisher count: 1
Subscription count: 1
消息类型为ai_msgs/msg/PerceptionTargets,因此需要从ai_msgs.msg中import PerceptionTargets消息package。
完整的python代码示例:
import rclpy
from rclpy.node import Node
from ai_msgs.msg import PerceptionTargets
class MinimalSubscriber(Node):
def __init__(self):
super().__init__('minimal_subscriber')
self.subscription = self.create_subscription(
PerceptionTargets,
'hobot_mono2d_body_detection',
self.listener_callback,
10)
self.subscription # prevent unused variable warning
def listener_callback(self, msg):
self.get_logger().info('I heard: "%s"\n' % msg)
def main(args=None):
rclpy.init(args=args)
minimal_subscriber = MinimalSubscriber()
rclpy.spin(minimal_subscriber)
# Destroy the node explicitly
# (optional - otherwise it will be done automatically
# when the garbage collector destroys the node object)
minimal_subscriber.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
使用python开发完Node后,直接在X3派上编译并运行。运行并输出订阅到的消息:
如何开发一个自己的算法Node扩展App功能?
TogetherROS提供的Hobot DNN简化板端AI模型推理与部署,释放BPU算力,降低AI使用门槛。同时内置了常用的检测、分类和分割算法的模型后处理,帮助用户快速在X3派上集成部署自己的算法。
本文转自地平线开发者社区
原作者:zhuk
原链接:https://developer.horizon.ai/forumDetail/106482197149630465
评论(0)
您还未登录,请登录后发表或查看评论