算法wokflow构建

功能背景

ROS2的节点(Node)将复杂的机器人软件系统拆解成多个功能和逻辑独立的模块,例如一个机器人应用可能包含多个传感和算法感知功能的Node。Node之间通过“话题”(Topic)进行数据交换,机器人软件系统中不同功能的ROS2 Node通过Topic连接起来形成一个有向无环图(DAG)。

地平线TogetheROS.Bot软件栈中包含丰富的机器人开发组件和算法Node,其中传感Node支持从摄像头采集图像数据并发布,用于感知算法推理使用。感知算法库中的人手框检测算法Node使用图像数据进行推理,输出人手框检测结果;人手关键点检测算法Node使用图像数据和人手框检测结果推理输出人手关键点检测结果。因此人手关键点检测算法Node需要基于Topic通信,订阅人手框检测算法Node发布的人手框消息。

通过阅读本章节,用户可以在旭日X3派上使用\tros.b中的传感Node、人手框检测和人手关键点检测算法Node,基于ROS2 Topic通信,串联起传感和感知Node,实现开发复杂机器人算法应用的目标。

前置条件

1 旭日X3派开发板,并且已安装好相关软件,包括:

  • 地平线提供的Ubuntu 20.04系统镜像。

  • tros.b软件包。

2 旭日X3派已安装F37或者GC4663摄像头。

3 和旭日X3派在同一网段(有线或者连接同一无线网,IP地址前三段需保持一致)的PC,PC端需要安装的环境包括:

任务内容

1 启动数据采集Node

旭日X3派上打开一个终端启动图像发布Node,从F37摄像头采集图像数据并发布,用于算法推理使用:

# 配置tros.b环境
source /opt/tros/setup.bash
# 启动Node
ros2 run mipi_cam mipi_cam --ros-args -p out_format:=nv12 -p image_width:=960 -p image_height:=544 -p video_device:=F37 -p io_method:=shared_mem --log-level warn

2 启动人手框检测算法Node

旭日X3派上打开一个终端启动人手框检测算法Node,订阅数据采集Node发布的图像消息,检测并发布人手检测框消息。

启动命令中指定了发布的Topic为hobot_hand_detection

# 配置tros.b环境
source /opt/tros/setup.bash
# 从tros.b的安装路径中拷贝出运行示例需要的配置文件。
cp -r /opt/tros/lib/mono2d_body_detection/config/ .
# 启动Node
ros2 run mono2d_body_detection mono2d_body_detection --ros-args --log-level warn --ros-args -p ai_msg_pub_topic_name:=hobot_hand_detection

3 启动人手关键点检测算法Node

旭日X3派上打开一个终端启动人手关键点检测算法Node,订阅数据采集Node发布的图像消息以及人手框检测算法Node发布的人手框消息。

启动命令中指定了发布消息的Topic为hobot_hand_lmk_detection,订阅消息的Topic为hobot_hand_detection

# 配置tros.b环境
source /opt/tros/setup.bash
# 从tros.b的安装路径中拷贝出运行示例需要的配置文件。
cp -r /opt/tros/lib/hand_lmk_detection/config/ .
# 启动Node
ros2 run hand_lmk_detection hand_lmk_detection --ros-args --log-level warn --ros-args -p ai_msg_pub_topic_name:=hobot_hand_lmk_detection -p ai_msg_sub_topic_name:=hobot_hand_detection

4 查看算法推理结果输出

旭日X3派上打开一个终端使用ROS2命令查看算法推理Node发布的Topic消息。

查看人手框检测算法Node发布出来的人手框检测消息

查询命令:

# 配置tros.b环境
source /opt/tros/setup.bash
# 启动Node
ros2 topic echo /hobot_hand_detection

输出结果:

header:
  stamp:
    sec: 1660034025
    nanosec: 429969208
  frame_id: '8049'
fps: 30
targets:
- type: person
  track_id: 10
  rois:
  - type: hand
    rect:
      x_offset: 619
      y_offset: 128
      height: 229
      width: 168
      do_rectify: false
  attributes: []
  points: []
  captures: []
disappeared_targets: []

可以看到人手框检测算法Node发布出来的消息中包含一个人手框检测结果(roi type为hand)。

查看人手关键点检测算法Node发布出来的人手关键点检测消息

查询命令:

# 配置tros.b环境
source /opt/tros/setup.bash
# 启动Node
ros2 topic echo /hobot_hand_lmk_detection

输出结果:

header:
  stamp:
    sec: 1660034025
    nanosec: 429969208
  frame_id: '8049'
fps: 30
targets:
- type: person
  track_id: 10
  rois:
  - type: hand
    rect:
      x_offset: 619
      y_offset: 128
      height: 229
      width: 168
      do_rectify: false
  attributes: []
  points:
  - type: hand_kps
    point:
    - x: 715.2421875
      y: 348.0546875
      z: 0.0
    - x: 673.4921875
      y: 315.8515625
      z: 0.0
    - x: 655.2265625
      y: 294.3828125
      z: 0.0
    - x: 639.5703125
      y: 262.1796875
      z: 0.0
    - x: 621.3046875
      y: 229.9765625
      z: 0.0
    - x: 686.5390625
      y: 247.8671875
      z: 0.0
    - x: 683.9296875
      y: 201.3515625
      z: 0.0
    - x: 683.9296875
      y: 176.3046875
      z: 0.0
    - x: 681.3203125
      y: 147.6796875
      z: 0.0
    - x: 712.6328125
      y: 240.7109375
      z: 0.0
    - x: 717.8515625
      y: 194.1953125
      z: 0.0
    - x: 720.4609375
      y: 161.9921875
      z: 0.0
    - x: 723.0703125
      y: 129.7890625
      z: 0.0
    - x: 736.1171875
      y: 247.8671875
      z: 0.0
    - x: 743.9453125
      y: 201.3515625
      z: 0.0
    - x: 749.1640625
      y: 172.7265625
      z: 0.0
    - x: 749.1640625
      y: 140.5234375
      z: 0.0
    - x: 759.6015625
      y: 262.1796875
      z: 0.0
    - x: 770.0390625
      y: 226.3984375
      z: 0.0
    - x: 775.2578125
      y: 204.9296875
      z: 0.0
    - x: 775.2578125
      y: 179.8828125
      z: 0.0
    confidence: []
  captures: []
disappeared_targets: []

可以看到人手关键点检测算法Node在订阅到人手检测框消息并用于推理后,发布出来的消息中包含一个人手框和人手关键点检测结果(roi type为hand,points type为hand_kps)。发布出来的人手框消息内容来源于订阅到的人手框消息,和上一步查出来的数据一致。

5 Node串联出来的Graph

旭日X3派上打开一个终端使用ROS2命令查看运行时设备的Node和Topic信息:

# 配置tros.b环境
root@ubuntu:~# source /opt/tros/setup.bash
# 查询Node信息
root@ubuntu:~# ros2 node list
/hand_lmk_det
/mipi_cam
/mono2d_body_det
# 查询Topic信息
root@ubuntu:~# ros2 topic list
/hbmem_img08172824022201080202012021072315
/hobot_hand_detection
/hobot_hand_lmk_detection
/image_raw
/parameter_events
/rosout

查询到旭日X3派上运行着3个Node。

在PC端(PC需要和旭日X3派处于同一网段)通过rqt的Node Graph功能可以可视化的展示旭日X3派上运行的Node,Node发布和订阅的topic,以及Node基于这些Topic组成的graph,如下图:

../../_images/rosgraph_handlmk.jpg

其中椭圆形框内为Node名,矩形框内为Topic名。可以看到,整个graph由3个Node和2个Topic组成。

mipi_cam(传感Node)为起点,实现从摄像头采集和发布图像。

mono2d_body_det(算法感知Node)为中间节点,订阅mipi_cam Node发布的图像数据,实现人手框的检测。

hand_lmk_det(算法感知Node)为终点,订阅mipi_cam Node发布的图像数据以及mono2d_body_det Node发布的人手框检测数据,实现人手关键点的检测。

本节总结

本章节介绍了在旭日X3派上使用地平线tros.b中的传感Node、人手框检测和人手关键点检测算法Node,基于ROS2 Topic通信,串联起两个感知算法Node,实现从摄像头采集图像后用于算法推理并发布检测出的人手关键点消息的功能。

基于本章节介绍的算法串联原理,用户可以在旭日X3派上串联更多算法Node,开发出功能丰富的机器人算法应用。