0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

开发者说 | 地平线程序员奶爸带你玩转机器人开发平台 —— 第一期 手势控制

地瓜机器人 2022-07-19 14:30 次阅读

在地平线工作了4年多了,原本是冲着地平线机器人,机器人这三个字来的地平线,结果很长一段时间地平线都没搞机器人,我倒是给孩子买了不少机器人。

比如这个,

poYBAGLWJHuAI853ADwECV7XXqY206.png

手势操控机器人,东西不错,很便宜,但是得带个手套,一点不AI

再比如这个,

poYBAGLWJIeAP3JRABQeqNE94CA809.png

也很便宜,能语音对话,遥控下能跑跑,但也一点不AI。

身为一个地平线资深程序员奶爸,手里有大把现成的AI武器,必须得用上,恰好地平线刚刚发布了机器人开发平台Horizon Hobot Platform,我准备把里面的各种算法都装进一个机器人里面(都是公开的哦),不管孩子喜不喜欢,但要先体现老爸的厉害,先从最简单的手势控制搞起。

1 功能介绍

大家先看一下最终实现的功能。

  • “666手势”手势控制机器人前进
  • “yeah”手势控制机器人后退
  • “大拇指向右”手势控制机器人右转
  • “大拇指向左”手势控制机器人左转

(里面的语音播报是示意,下期给大家讲语音控制机器人)

pYYBAGLVO72AVfAiAF9MSVBqSB4161.png

从最终实现的功能效果来看,机器人能够迅速响应人手的控制指令,得益于X3派上5Tops算力的BPU可以实现低延迟(50ms左右)、高帧率(满帧30fps)、远距离(>=5m)的算法推理能力。

开始码代码前,先来简单分析一下手势操控机器人需要具备哪些基本模块。

  1. 传感

对于手势识别这类基于视觉的AI算法应用,首先需要有视觉传感器来捕捉图像数据。

  1. 感知

获取到传感器发布的图像后,通过视觉算法进行推理,检测到人手并且识别出手势,实现感知的能力。

  1. 交互

识别出手势之后,需要定义并实现对应不同手势的功能应用,如使用“大拇指向右”手势控制机器人向右转动。

  1. 控制

根据“交互”模块输出的控制指令,实现对机器人的机械控制

  1. 机器人本体

当然还需要一个具备运动能力的机器人本体,接收控制指令并控制电机运动,实现最终的通过手势控制机器人运动的效果。

地平线发布的机器人平台Horizon Hobot Platform(HHP)内置了丰富易用的机器人开发组件,包含搭建一个智能机器人应用(如机器人手势控制)所涉及到的所有功能模块,完全开源免费,并允许开发者二次开发,接下来开始搞起。

2 准备工作

准备搭建机器人手势控制应用案例的硬件设备和软件包。

2.1 硬件

硬件包括:

  1. X3派
poYBAGLWJJeAVOHXAAZP6ysBK9A861.png
  1. F37 MIPI摄像头
poYBAGLWJK-AWjStAADYCvQxdvQ924.png
  1. 机器人

X3派和HHP适配了本末双足机器人和小R科技的麦轮小车。这边为了让孩子觉得机器人足够高大上,就用本末的轮足机器人来介绍,没有的同学也不用担心,文章后面会介绍自己搭建机器人的方式。

pYYBAGLWJL-AAZ8nAAOy91ERXgQ719.png
  1. 其他配件
    1. USB Type C接口电源线。至少搭配5V 直流 2A,用于X3派供电
    2. 串口线。连接方式如下:
pYYBAGLWJPWAEurXAAzs72Tj73U694.png
  1. TF存储卡和读卡器。旭日X3派开发板采用TF存储卡作为系统启动介质,推荐使用至少8GB容量、速率C10以上的TF存储卡,以便满足Ubuntu系统及更多应用功能包对存储空间的需求。

2.2 安装系统

参考旭日X3派的用户手册的安装系统章节。

2.3 系统配置

配置X3派的无线网络,参考X3派的用户手册的无线网络章节。

无线网络配置成功之后,查询IP地址:

poYBAGLWJSWAYIuxAAE-d_Rnorg810.png

可以看到,X3派的无线网路分配的IP地址为192.168.1.147,下面开始使用这个地址和root账号(密码为root)通过ssh远程连接到X3派,登录成功后的状态如下:

pYYBAGLWJW6AbRqeAABKldkb_58374.png

2.4 安装HHP

使用apt命令通过DEB包安装HHP。

登录旭日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

可以看到HorizonHobotPlatform(HHP)已安装在/opt目录下,说明安装成功。

至此,准备工作结束,下面开始使用这些硬件设备和软件包搭建机器人手势控制App。

3 使用介绍

接下来开始搞各个功能模块,再一步步组装起来,分别验证其功能。

3.1 安装和测试F37摄像头

将F37摄像头通过MIPI线连接到X3派上,连接方式如下:

pYYBAGLWJbWAGCn5AAJ9usVh2eY614.png

直接使用HHP中的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

启动成功的终端状态如下:

poYBAGLWJfaAFxFsAARi93E3Ohs054.png

摄像头开始采集图像并对外发布图像消息。

PC浏览器(chrome/firefox/edge)输入旭日X3派IP地址,即可查看F37实时采集到的图像效果:

pYYBAGLWJnSAMOdcAIzwNeIUozQ567.png

说明F37摄像头已安装成功并能够对外发布图像消息。

3.2 测试手势识别算法和交互功能

X3派上打开一个终端,启动手势识别和控制的脚本:

# 配置TogetherROS环境 source /opt/tros/setup.bash # 从TogetherROS的安装路径中拷贝出运行示例需要的配置文件。 cp -r /opt/tros/lib/mono2d_body_detection/config/ . cp -r /opt/tros/lib/hand_lmk_detection/config/ . cp -r /opt/tros/lib/hand_gesture_detection/config/ . #启动launch文件 ros2 launch gesture_control hobot_gesture_control.launch.py

启动成功后,对着F37摄像头做出"Victory"的手势,终端输出如下信息

[gesture_control-7] [WARN] [1652965757.159500951] [GestureControlEngine]: frame_ts_ms: 3698315358, track_id: 2, tracking_sta: 1, gesture: 3 [gesture_control-7] [WARN] [1652965757.159660358] [GestureControlEngine]: do move, direction: 0, step: 0.500000 [gesture_control-7] [WARN] [1652965757.211420964] [GestureControlEngine]: frame_ts_ms: 3698315425, track_id: 2, tracking_sta: 1, gesture: 3 [gesture_control-7] [WARN] [1652965757.211624899] [GestureControlEngine]: do move, direction: 0, step: 0.500000 [gesture_control-7] [WARN] [1652965757.232051230] [GestureControlEngine]: frame_ts_ms: 3698315457, track_id: 2, tracking_sta: 1, gesture: 3 [gesture_control-7] [WARN] [1652965757.232207513] [GestureControlEngine]: do move, direction: 0, step: 0.500000

以上log显示ID为2(track_id: 2)的人手通过Victory手势(gesture: 3)控制机器人(tracking_sta: 1)以0.5m/s的速度后退运动(do move, direction: 1, step: 0.500000)。

在PC端浏览器上会实时渲染显示摄像头采集到的图像,人体、人头、人脸和人手检测框和ID,人手关键点和手势结果,以及实时的性能统计数据,如下图:

pYYBAGLWJoGAT0QGAAmZ4s1wP-w505.png

其中浏览器下方显示的fps为实时的AI推理输出的帧率,和F37摄像头采集图像的帧率30fps一致。ai_delay(单位为毫秒)为51,表示的是单帧推理的延迟,从传感Node发布图像数据开始,经过多个感知算法Node推理后,发布包含手势结果的AI msg的耗时。

同时测试了远距离情况下手势识别的效果,在距离摄像头5米的情况下,依然能够稳定识别出手势,如下图所示:

pYYBAGLWJpyATKe4AAYgqSQqnK8722.png

经过以上测试,说明在X3派上,HHP的手势识别算法运行成功,并且算法可以实现低延迟(51ms)、高帧率(满帧30fps)、远距离(>=5m)的算法推理效果,体现了X3 BPU强大的算力。

手势识别算法测试完成后,接着测试手势交互功能。

X3派上另起一个终端,执行如下命令查询X3派上的话题列表:

# 配置TogetherROS环境 source /opt/tros/setup.bash ros2 topic list

输出如下:

pYYBAGLWJs-AWnzhAABGB30_QsQ793.png

其中/cmd_vel话题是手势控制节点发布的控制命令消息。在当前终端执行ros2 topic echo /cmd_vel命令查询X3派上的话题信息,对着F37摄像头做出"Victory"的手势时,终端输出如下:

poYBAGLWJt-AF1nKAAA0kBoyvoo702.png

可以看到,做出表示后退的“Victory”手势时,发布出的/cmd_vel话题的linear x数据为-0.5,表示以0.5m/s的速度后退。

说明手势识别算法和交互功能的软件包已安装成功,并能够通过/cmd_vel话题对外发布机器人运动控制消息。

3.3 将X3派安装到机器人上

将X3派安装到机器人上,并测试在X3派上通过发布/cmd_vel话题控制机器人运动的功能。

连接了F37摄像头的X3派直接固定在机器人上,并将机器人的USB控制接口插到X3派上。

安装效果如下:

poYBAGLWJyCAZ8c9ABvTNz07oIM337.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

执行成功后终端中输出如下信息:

?code=NDZkOTFmNGQ4Nzg3MzVhMzE3MmYwNWU3Y2Q0ZDEwZmRfb1U0eUcxdjgzdEVKeFBCNFhwREQyS3lCRHFLVEpna25fVG9rZW46Ym94Y24xeEdlTGpLdnFnRkdwb0lkd0tmVm9oXzE2NTgxNDA1MjQ6MTY1ODE0NDEyNF9WNA

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}}'

执行成功后终端中输出如下信息:

pYYBAGLWJzWAAtpgAABABX_Q0O4707.png

机器人收到控制指令后转动的效果如下:

pYYBAGLWJ0yAazCoAABOxcXYJpk135.png

说明机器人能够按照发布的控制命令消息正确的实现运动。

3.4 对于其他机器人应该怎么安装

如果手里是其他的移动机器人,例如有一个使用树莓派或者Jetson Nano作为上位机的机器人,也可以将X3派安装在机器人上,代替树莓派或者Jetson Nano,实现控制机器人运动。

安装方法如下:

  1. 编译可以运行在X3派上的运动控制package
    1. X3派上安装ROS2软件系统构建和编译工具:

apt update apt-get install python3-catkin-pkg pip install empy pip install -U colcon-common-extensions

  1. 将原先运行在树莓派或者Jetson Nano上的机器人运动控制ROS2 package源码拷贝到X3派上。
  2. 在X3派上,package源码工程所在路径下,直接使用source /opt/tros/setup.bash; colcon build命令编译package。
  3. 如果原先运动控制package是基于ROS1开发,源码需要适配到ROS2。只需要适配"cmd_vel"话题消息的订阅和处理,如果原先的ROS1 package中有其他功能,可以先不关注。
  4. 安装
    1. 将X3派固定在机器人上,如果空间有限,可以将原先的树莓派或者Jetson Nano拆除。
    2. 使用USB Type C给X3派供电,如果机器人上无Type C供电输出,也可以使用移动电源(输出至少5V&直流 2A)给X3派供电。
    3. 将机器人的USB控制接口插到X3派上。
  5. 测试
    1. X3派上启动新编译的机器人运动控制package。
    2. 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派安装成功。

4 完整的机器人手势控制效果

下面开始测试完整的机器人手势控制功能。

  1. X3派上打开一个终端,启动手势识别和控制脚本

# 配置TogetherROS环境 source /opt/tros/setup.bash # 从TogetherROS的安装路径中拷贝出运行示例需要的配置文件。 cp -r /opt/tros/lib/mono2d_body_detection/config/ . cp -r /opt/tros/lib/hand_lmk_detection/config/ . cp -r /opt/tros/lib/hand_gesture_detection/config/ . #启动launch文件 ros2 launch gesture_control hobot_gesture_control.launch.py

  1. X3派上打开一个终端,启动机器人运动控制Node

# 配置TogetherROS环境 source /opt/tros/setup.bash #启动本末机器人运动控制Node ros2 run diablo_sdk ros_bridge_example

  1. 通过手势控制机器人运动

App的控制效果视频如下:

pYYBAGLVO72AVfAiAF9MSVBqSB4161.png

5 原理分析

第4章节中,在X3派的两个终端中分别启动了hobot_gesture_control.launch.py脚本和运动控制Node,实现了通过手势控制机器人的效果,本章节对实现的原理进行分析。

5.1 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 /gesture_control /gesture_control_parameter_node /hand_gesture_det /hand_lmk_det /hobot_codec1656779158649265431 /mipi_cam /mono2d_body_det /ros_bridge_example /transform_listener_impl_558896ba50 /websocket root@ubuntu:~# ros2 topic list /cmd_vel /hbmem_img080a1309022201080401012021072312 /hobot_hand_gesture_detection /hobot_hand_lmk_detection /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之间的连接关系,如下图:

pYYBAGLWJ3iAPqxNAACIneNR7ek685.png

其中椭圆形框内为Node名,矩形框内为topic名。

可以看到,整个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_gesture_control.launch.py脚本启动。

5.2 App的Node介绍

对于复杂的包含多个Node的应用,ROS2提供了使用启动脚本通过launch批量启动Node的功能。

手势控制机器人App使用hobot_gesture_control.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'] ), # 启动人手关键点检测pkg Node( package='hand_lmk_detection', executable='hand_lmk_detection', output='screen', parameters=[ {"ai_msg_sub_topic_name": "/hobot_mono2d_body_detection"}, {"ai_msg_pub_topic_name": "/hobot_hand_lmk_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_hand_gesture_detection"} ], arguments=['--ros-args', '--log-level', 'error'] ), # 启动手势识别pkg Node( package='hand_gesture_detection', executable='hand_gesture_detection', output='screen', parameters=[ {"ai_msg_sub_topic_name": "/hobot_hand_lmk_detection"}, {"ai_msg_pub_topic_name": "/hobot_hand_gesture_detection"} ], arguments=['--ros-args', '--log-level', 'error'] ), # 启动手势交互pkg Node( package='gesture_control', executable='gesture_control', output='screen', parameters=[ {"ai_msg_sub_topic_name": "/hobot_hand_gesture_detection"}, {"twist_pub_topic_name": "/cmd_vel"}, {"activate_wakeup_gesture": 0}, {"track_serial_lost_num_thr": 100}, {"move_step": 0.5}, {"rotate_step": 0.5} ], arguments=['--ros-args', '--log-level', 'info'] ) ])

脚本中指定了多个Node,其中每个Node中的package配置项表示Node名,可以看到脚本中配置的Node名和5.1章节中查出来的一致。

在第1章节,分析了机器人手势操控App所需要具备的功能模块,下面按照这些功能模块对Node进行分析。

  1. 传感

使用了HHP中的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摄像头,发布的图片格式和分辨率可以直接用于算法推理,其中通过共享内存方式发布图片,可以极大地降低系统负载和传输延迟。

  1. 感知

使用了HHP中的Boxs算法仓库,订阅Hobot Sensor(mipi_cam Node)发布的图像数据后,通过视觉算法进行推理,检测到人手并且识别出手势。使用到的算法包括:

(1)人体检测和跟踪

人体检测和跟踪算法Node订阅Hobot Sensor发布的图像消息,利用BPU处理器进行AI推理,发布包含人体、人头、人脸、人手框和人体关键点检测结果的AI msg,并通过多目标跟踪(multi-target tracking,即MOT)功能,实现检测框的跟踪和ID分配。

Node对应package名为'mono2d_body_detection',同时指定了Node的参数:

  • "ai_msg_pub_topic_name":发布包含人手检测框信息的AI感知结果的topic名为"/hobot_mono2d_body_detection"

(2)人手关键点检测

人手关键点检测算法Node订阅Hobot Sensor发布的图像消息和人体检测和跟踪算法示例发布的包含人手框信息的AI msg,利用BPU处理器进行AI推理,发布包含人手关键点信息的AI msg。

Node对应package名为'hand_lmk_detection',同时指定了Node的参数:

  • "ai_msg_sub_topic_name": 订阅包含人手检测框信息的topic名为"/hobot_mono2d_body_detection"
  • "ai_msg_pub_topic_name":发布包含人手关键点信息的的AI感知结果topic名为"/hobot_hand_lmk_detection"

(3)手势识别

手势识别算法Node订阅人手关键点检测算法示例发布的包含人手框、人手关键点信息的AI msg,利用BPU处理器进行AI推理,发布包含手势信息的AI msg。

Node对应package名为'hand_gesture_detection',同时指定了Node的参数:

  • "ai_msg_sub_topic_name": 订阅包含人手关键点信息的topic名为"/hobot_hand_lmk_detection"
  • "ai_msg_pub_topic_name":发布包含手势信息的的AI感知结果topic名为"/hobot_hand_gesture_detection"

手势识别算法支持识别的手势类别,发布的AI msg中对应的手势结果数值如下:

手势类别手势结果数值
无手势0
ThumbUp/竖起大拇指2
Victory/“V”手势3
Mute/“嘘”手势4
Palm/手掌5
Okay/OK手势11
ThumbLeft/大拇指向左12
ThumbRight /大拇指向右13
Awesome/666手势14
  1. 交互

手势控制策略Node订阅手势识别算法示例发布的包含手势信息的AI msg,根据手势类型发布前进、后退、左转、右转的控制消息,实现控制机器人运动。

Node发布的运动控制消息为ROS2中定义的消息,topic为“/cmd_vel”,消息类型为“geometry_msgs/msg/Twist”。

Node对应package名为'gesture_control',同时指定了Node的参数:

  • "ai_msg_sub_topic_name": 订阅包含手势信息的topic名为"/hobot_hand_gesture_detection"
  • "twist_pub_topic_name":发布运动控制指令消息的topic名为"/cmd_vel"
  • "activate_wakeup_gesture": 唤醒手势开关,值为0表示不启用唤醒手势。一般在人较多,环境复杂的场景,通过启用唤醒手势避免误触发手势控制功能。
  • "track_serial_lost_num_thr": 人手连续消失帧数阈值,值为100,表示当用于控制的人手连续消失100帧之后会重新选择控制手
  • "move_step": 平移运动的步长(速度),0.5表示移动速度为0.5m/s,值越大速度越快
  • "rotate_step": 旋转运动的步长(速度),0.5表示旋转速度为0.5r/s,值越大速度越快

手势控制策略选择做出上述4种控制手势(详细的手势控制说明详见3.2章节)的人手作为唯一的控制手,通过此控制手实现对机器人的控制。

如果有多个人手同时做手势,选择人手检测框宽度最大的手作为控制手。

已有控制手的情况下,其他的手做控制手势都无效。

Node输出的log中tracking_sta关键字表示控制手的状态,0表示未找到控制手,1表示已有控制手,2表示控制手消失。

Node启动后,未找到控制手的情况下,即没有做出手势,输出log中tracking_sta值为0。

当有人手做出手势时,找到控制手,输出log中tracking_sta值为1,同时通过track_id关键字输出人手的ID,gesture输出当前做出的手势结果数值。

只有当控制手消失,即连续track_serial_lost_num_thr帧(配置为100帧,对于输出频率为30fps的F37摄像头,大约为3.3秒)未检测到人手,判断控制手消失,开始重新选择控制手。控制手消失时输出log中tracking_sta值为2。

如果需要启用唤醒手势避免误触发,唤醒手势使用方法详见手势控制策略的代码仓库。

  1. 控制

机器人运动控制Node订阅手势控制策略Node发布的topic为“/cmd_vel”的控制消息,根据控制协议,通过USB总线向机器人下位机发布运动控制指令。

对于不同类型的机器人,控制协议不同,对应于不同的运动控制Node。

本文使用的是本末双足机器人,对应的运动控制Node启动方法为ros2 run diablo_sdk ros_bridge_example。此Node单独启动,不在启动脚本中。

5.3 App的系统设计

根据5.1和5.2章节的介绍,已经知道了机器人手势控制App启动了哪些Node,这些Node的功能,Node之间的关系,以及使用这些Node如何实现通过手势控制机器人的目标。下面进行理论总结,介绍此App的系统设计。

对于一个复杂的机器人系统,一般在机器人上配置上位机和下位机两种处理器。

机器人上位机的计算能力较强,执行复杂的机器人上层应用,同时能够最大程度屏蔽不同类型机器人的底层差异。

机器人下位机一般使用低成本的MCU处理器,对机器人本体上的各类传感器和硬件进行数据采集/控制。

手势控制App由两部分组成,分别为机器人和PC端,其中机器人部分又分为上位机和下位机。详细组成如下图:

poYBAGLWJ92AE7ElAAKvqgxvwTM899.png

机器人上位机为X3派,运行着多个ROS2 Node,除了5.2章节介绍的传感、感知、交互和控制功能,还有JPEG图像编码和WEB展示功能,将摄像头发布的图片编码压缩,以及将手势识别算法发布的AI数据序列化后使用websocket协议发布,实现跨设备在PC端渲染展示和调试。

机器人下位机属于机器人本体的一部分,详细说明略。

从App的系统设计图中可以看出,搭载了X3派和HHP的机器人,利用芯片的AI加速能力和HHP中丰富的算法、机器人开发组件,可以实现快速开发智能机器人应用的目标。

6 FAQ

6.1 如何复现App效果?

复现App效果涉及到两部分:

(1)机器人手势控制App

参考第2章准备工作,在X3派上安装HHP。

(2)本末双足机器人和机器人运动控制package

获取方法详见产品信息:https://developer.horizon.ai/forumDetail/94246984227025410

除了本末双足机器人,X3派和HHP还适配了小R科技的麦轮小车,也可以使用小R小车直接体验App效果。

6.2 没有机器人的情况下可以体验App效果吗?

可以体验。

在没有机器人的情况下,可以使用此App控制gazebo仿真环境下的虚拟机器人运动。

6.3 如何将App适配到自己的机器人上?

本文以本末双足机器人为例介绍手势控制App的效果,App本身不依赖于任何形态的机器人,App发布的运动控制消息为ROS2中定义的消息(topic为“/cmd_vel”,消息类型为“geometry_msgs/msg/Twist”,具体说明参考第5章的原理分析)。

如下图,可以将App的组成划分成红色和蓝色虚线框两个部分:

poYBAGLWJ_KACtknAALSDaG3hMw929.png

(1)红色虚线框部分

这部分功能不依赖于机器人,即可以直接移植到任意形态的机器人上。

移植方法为将X3派安装在机器人上,按照第2章节的准备工作,在X3派上安装摄像头传感器和HHP。

(2)蓝色虚线框部分

这部分功能依赖于机器人,需要针对性的适配。根据机器人的状态不同,对应不同的适配方法。

状态1,原先机器人上有上位机和下位机,如原先使用树莓派或者Jetson Nano作为上位机,并且上位机上有机器人运动控制Node。需要在X3派上重新编译机器人运动控制Node。

状态2,原先机器人上只有下位机。需要开发机器人运动控制Node后(开发参考components/xrrobot · develop · HHP / app / xr_robot · GitLab (horizon.ai)),在X3派上编译机器人运动控制Node。

6.4 App支持哪些摄像头?

App对于摄像头类型没有要求,地平线机器人平台支持MIPI和USB两类摄像头。

对于MIPI摄像头,支持F37和GC4663两种型号。

6.5 是否可以重新定义手势对应的功能?

可以。

App中手势和控制功能对应关系详见第1章的功能介绍,目前只用到了4种控制手势,5.2章节介绍了手势识别算法支持的8种手势类别,可以对手势控制策略Node进行二次开发,重新定义手势和对应的控制功能,如通过OK手势控制四足机器人站立。

6.6 如何调整机器人的运动速度?

修改App启动脚本hobot_gesture_control.launch.py中手势控制策略gesture_control Node中的参数,可以控制机器人的平移和旋转速度:

# 启动手势交互pkg Node( package='gesture_control', executable='gesture_control', output='screen', parameters=[ {"ai_msg_sub_topic_name": "/hobot_hand_gesture_detection"}, {"twist_pub_topic_name": "/cmd_vel"}, {"activate_wakeup_gesture": 0}, {"track_serial_lost_num_thr": 100}, {"move_step": 0.5}, {"rotate_step": 0.5} ], arguments=['--ros-args', '--log-level', 'info'] )

参数说明详见5.2.2.8章节。

6.7 可以开发一个python的Node扩展App功能吗?

可以。

ROS2支持跨设备、跨平台、跨语言,TogetherROS完全兼容ROS2 Foxy版本,因此也支持这些特性。

例如在X3派的40PIN上安装了LED灯,当机器人处于运动状态时,LED灯被点亮。

用户可以使用python开发一个ROS Node,订阅手势控制策略Node发布的topic为“/cmd_vel”的消息,检查消息中的控制指令是否为启动运动指令(值是否为非0),如果有非0值,表示是启动运动,点亮LED灯,否则点灭LED灯。

使用python开发完Node后,直接在X3派上编译并运行。

6.8 如何开发一个自己的算法Node扩展App功能?

HHP提供的Hobot DNNshe'u'qsheuq简化板端AI模型推理与部署,释放BPU算力,降低AI使用门槛。同时内置了常用的检测、分类和分割算法的模型后处理,帮助用户快速在X3派上集成部署自己的算法。

本文转自地平线开发者社区

原作者:zhuk

原链接:https://developer.horizon.ai/forumDetail/98129540173361326

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 人机交互
    +关注

    关注

    12

    文章

    1200

    浏览量

    55306
  • 人工智能
    +关注

    关注

    1791

    文章

    46820

    浏览量

    237460
收藏 人收藏

    评论

    相关推荐

    塔革特官方教学第一期:元器件及其库相关操作。

    共同探索PCB设计之旅,深入了解TARGET3001!电子设计软件,体验高性价比的魅力。欢迎各位电子工程师参与塔革特官方教学直播第一期:元器件及其库相关操作。
    发表于 11-08 11:32

    智驾科技企业地平线登陆港交所

    近日,智驾科技企业地平线地平线机器人-W,股票代码:9660.HK)在香港交易所主板成功挂牌上市,募资总额高达54.07亿港元,成为港股今年最大的科技IPO。
    的头像 发表于 10-28 16:37 212次阅读

    第五届长沙·中国1024程序员节开幕

    场场精彩活动将轮番上演。超200名海内外技术人员围绕人工智能、数据技术等前沿领域展开深入研讨。 本届1024程序员节中机器人与具身智能、大模型等主题引发热烈讨论;程序员开发者如何利用
    的头像 发表于 10-25 15:42 155次阅读

    中国自动驾驶第一股的地平线机器人正式上市

    10月24日,被誉为“中国自动驾驶领域的领头羊”的地平线机器人在港交所成功上市。   据公告,地平线机器人每股定价3.99港元,共发行13.55亿股,每手交易包含600股,所得款
    的头像 发表于 10-25 11:05 611次阅读

    兆易创新亮相2024地平线地瓜机器人开发者

    日前,以“加速智能生长”为主题的“2024地瓜机器人开发者日暨新品发布”活动在深圳成功举办。兆易创新作为地瓜机器人优质生态合作伙伴,受邀出席大会。中央市场部王霄受邀参加议程中的DUP教育生态联盟研讨会并做了《“兆易创新+地瓜
    的头像 发表于 10-17 09:47 251次阅读

    地平线助力鉴智机器人多款中阶方案斩获定点合作

    近日,智能驾驶系统供应商鉴智机器人基于地平线征程6E打造的多款中阶方案获得头部车企与Tier-1定点,并已正式启动量产交付开发
    的头像 发表于 07-30 09:20 552次阅读
    <b class='flag-5'>地平线</b>助力鉴智<b class='flag-5'>机器人</b>多款中阶方案斩获定点合作

    ROS让机器人开发更便捷,基于RK3568J+Debian系统发布!

    。 ROS系统主要特点有哪些 (1) 提供丰富的机器人算法库 机器人的各种控制以及通信离不开算法库的支持,ROS系统提供丰富且功能强大的机器人算法库,如坐标变换、运动
    发表于 07-09 11:38

    TOSUN同星 第一期开发者训练营圆满落幕

    2024年3月12日,由同星智能举办的2024年首【线上开发者训练营】成功举行。本次开发者训练营旨在聚集对同星智能软件架构以及TSMaster相关功能内容感兴趣的开发者,进行同星软件
    的头像 发表于 03-16 08:20 353次阅读
    TOSUN同星 <b class='flag-5'>第一期</b><b class='flag-5'>开发者</b>训练营圆满落幕

    地平线正式开源Sparse4D算法

    地平线将业内领先的纯视觉自动驾驶算法——Sparse4D系列算法开源,推动行业更多开发者共同参与到端到端自动驾驶、稀疏感知等前沿技术方向的探索中。目前,Sparse4D算法已在GitHub平台上线,
    的头像 发表于 01-23 10:18 722次阅读

    集成电路学习与实训平台配置方案-高职院校第一期建设

    北京革新创展能科技有限公司提供的集成电路学习与实训平台配置方案,主要用于高职院校第一期建设需求,如需详细方案,请随时联系我们。
    的头像 发表于 01-03 10:42 744次阅读
    集成电路学习与实训<b class='flag-5'>平台</b>配置方案-高职院校<b class='flag-5'>第一期</b>建设

    集成电路学习与实训平台配置方案-本科院校第一期建设

    北京革新创展科技有限公司提供的集成电路学习与实训平台配置方案,主要用于本科院校第一期建设。如需详细方案资料,请随时联系我们。
    的头像 发表于 01-03 10:29 892次阅读
    集成电路学习与实训<b class='flag-5'>平台</b>配置方案-本科院校<b class='flag-5'>第一期</b>建设

    开发者开发案例:使用canvas实现图表系列之折线图

    # 开发者 # 【开发者】栏目是为HarmonyOS开发者提供的展示和分享平台,在这里,大家
    的头像 发表于 12-13 16:05 582次阅读
    【<b class='flag-5'>开发者</b><b class='flag-5'>说</b>】<b class='flag-5'>开发</b>案例:使用canvas实现图表系列之折线图

    诚邀报名 | GPT驱动的新程序员时代,开发者如何编程?

    模式,开发者们迎来了编程范式的全新变革。传统的编程不再局限于编写线性代码和优化逻辑,自然语言取而代之,成为了编程的新工具,这大大降低了开发的门槛。 如今,以ChatGPT、Copilot等为代表的AI工具,将全球的知识库和代码库都呈现在用户面前,只要有足够的想象力,每个人
    的头像 发表于 12-11 22:20 512次阅读

    开发者开发案例分享:万能卡片也能用来玩游戏

    # 开发者 # 【开发者】栏目是为HarmonyOS开发者提供的展示和分享平台,在这里,大家
    的头像 发表于 11-30 21:15 505次阅读
    【<b class='flag-5'>开发者</b><b class='flag-5'>说</b>】<b class='flag-5'>开发</b>案例分享:万能卡片也能用来玩游戏

    ROS让机器人开发更便捷,基于RK3568J+Debian系统发布!

    库的支持,ROS系统提供丰富且功能强大的机器人算法库,如坐标变换、运动控制等。机器人开发者可根据开发需要,简单快捷地调用合适的算法库,以提高
    发表于 11-30 16:01