在地平線工作了4年多了,原本是沖著地平線機器人,機器人這三個字來的地平線,結(jié)果很長一段時間地平線都沒搞機器人,我倒是給孩子買了不少機器人。
比如這個,

手勢操控機器人,東西不錯,很便宜,但是得帶個手套,一點不AI。
再比如這個,

也很便宜,能語音對話,遙控下能跑跑,但也一點不AI。
身為一個地平線資深程序員奶爸,手里有大把現(xiàn)成的AI武器,必須得用上,恰好地平線剛剛發(fā)布了機器人開發(fā)平臺Horizon Hobot Platform,我準備把里面的各種算法都裝進一個機器人里面(都是公開的哦),不管孩子喜不喜歡,但要先體現(xiàn)老爸的厲害,先從最簡單的手勢控制搞起。
1 功能介紹
大家先看一下最終實現(xiàn)的功能。
- “666手勢”手勢控制機器人前進
- “yeah”手勢控制機器人后退
- “大拇指向右”手勢控制機器人右轉(zhuǎn)
- “大拇指向左”手勢控制機器人左轉(zhuǎn)
(里面的語音播報是示意,下期給大家講語音控制機器人)

從最終實現(xiàn)的功能效果來看,機器人能夠迅速響應(yīng)人手的控制指令,得益于X3派上5Tops算力的BPU可以實現(xiàn)低延遲(50ms左右)、高幀率(滿幀30fps)、遠距離(>=5m)的算法推理能力。
開始碼代碼前,先來簡單分析一下手勢操控機器人需要具備哪些基本模塊。
- 傳感
對于手勢識別這類基于視覺的AI算法應(yīng)用,首先需要有視覺傳感器來捕捉圖像數(shù)據(jù)。
- 感知
獲取到傳感器發(fā)布的圖像后,通過視覺算法進行推理,檢測到人手并且識別出手勢,實現(xiàn)感知的能力。
- 交互
識別出手勢之后,需要定義并實現(xiàn)對應(yīng)不同手勢的功能應(yīng)用,如使用“大拇指向右”手勢控制機器人向右轉(zhuǎn)動。
- 控制
根據(jù)“交互”模塊輸出的控制指令,實現(xiàn)對機器人的機械控制。
- 機器人本體
當然還需要一個具備運動能力的機器人本體,接收控制指令并控制電機運動,實現(xiàn)最終的通過手勢控制機器人運動的效果。
地平線發(fā)布的機器人平臺Horizon Hobot Platform(HHP)內(nèi)置了豐富易用的機器人開發(fā)組件,包含搭建一個智能機器人應(yīng)用(如機器人手勢控制)所涉及到的所有功能模塊,完全開源免費,并允許開發(fā)者二次開發(fā),接下來開始搞起。
2 準備工作
準備搭建機器人手勢控制應(yīng)用案例的硬件設(shè)備和軟件包。
2.1 硬件
硬件包括:
- X3派

- F37 MIPI攝像頭

- 機器人
X3派和HHP適配了本末雙足機器人和小R科技的麥輪小車。這邊為了讓孩子覺得機器人足夠高大上,就用本末的輪足機器人來介紹,沒有的同學(xué)也不用擔心,文章后面會介紹自己搭建機器人的方式。


- TF存儲卡和讀卡器。旭日X3派開發(fā)板采用TF存儲卡作為系統(tǒng)啟動介質(zhì),推薦使用至少8GB容量、速率C10以上的TF存儲卡,以便滿足Ubuntu系統(tǒng)及更多應(yīng)用功能包對存儲空間的需求。
2.2 安裝系統(tǒng)
參考旭日X3派的用戶手冊的安裝系統(tǒng)章節(jié)。
2.3 系統(tǒng)配置
配置X3派的無線網(wǎng)絡(luò),參考X3派的用戶手冊的無線網(wǎng)絡(luò)章節(jié)。
無線網(wǎng)絡(luò)配置成功之后,查詢IP地址:

可以看到,X3派的無線網(wǎng)路分配的IP地址為192.168.1.147,下面開始使用這個地址和root賬號(密碼為root)通過ssh遠程連接到X3派,登錄成功后的狀態(tài)如下:

2.4 安裝HHP
使用apt命令通過DEB包安裝HHP。
登錄旭日X3派ssh [email protected],執(zhí)行命令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目錄下,說明安裝成功。
至此,準備工作結(jié)束,下面開始使用這些硬件設(shè)備和軟件包搭建機器人手勢控制App。
3 使用介紹
接下來開始搞各個功能模塊,再一步步組裝起來,分別驗證其功能。
3.1 安裝和測試F37攝像頭
將F37攝像頭通過MIPI線連接到X3派上,連接方式如下:

直接使用HHP中的ROS package測試F37的功能。以下通過腳本啟動攝像頭采集,圖像編碼,web展示功能包,實現(xiàn)將F37攝像頭采集到的圖像進行編碼后,通過PC端web瀏覽器實時查看采集到的圖像。
登錄旭日X3派ssh [email protected]后,在終端(以下默認終端都是通過ssh登錄)中輸入以下命令啟動:
# 配置 TogetherROS 環(huán)境: source /opt/tros/local_setup.bash # 啟動腳本 ros2 launch websocket hobot_websocket.launch.py
啟動成功的終端狀態(tài)如下:

攝像頭開始采集圖像并對外發(fā)布圖像消息。
PC瀏覽器(chrome/firefox/edge)輸入旭日X3派IP地址,即可查看F37實時采集到的圖像效果:

說明F37攝像頭已安裝成功并能夠?qū)ν獍l(fā)布圖像消息。
3.2 測試手勢識別算法和交互功能
X3派上打開一個終端,啟動手勢識別和控制的腳本:
# 配置TogetherROS環(huán)境 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,人手關(guān)鍵點和手勢結(jié)果,以及實時的性能統(tǒng)計數(shù)據(jù),如下圖:

其中瀏覽器下方顯示的fps為實時的AI推理輸出的幀率,和F37攝像頭采集圖像的幀率30fps一致。ai_delay(單位為毫秒)為51,表示的是單幀推理的延遲,從傳感Node發(fā)布圖像數(shù)據(jù)開始,經(jīng)過多個感知算法Node推理后,發(fā)布包含手勢結(jié)果的AI msg的耗時。
同時測試了遠距離情況下手勢識別的效果,在距離攝像頭5米的情況下,依然能夠穩(wěn)定識別出手勢,如下圖所示:

經(jīng)過以上測試,說明在X3派上,HHP的手勢識別算法運行成功,并且算法可以實現(xiàn)低延遲(51ms)、高幀率(滿幀30fps)、遠距離(>=5m)的算法推理效果,體現(xiàn)了X3 BPU強大的算力。
手勢識別算法測試完成后,接著測試手勢交互功能。
X3派上另起一個終端,執(zhí)行如下命令查詢X3派上的話題列表:
# 配置TogetherROS環(huán)境 source /opt/tros/setup.bash ros2 topic list
輸出如下:

其中/cmd_vel話題是手勢控制節(jié)點發(fā)布的控制命令消息。在當前終端執(zhí)行ros2 topic echo /cmd_vel命令查詢X3派上的話題信息,對著F37攝像頭做出"Victory"的手勢時,終端輸出如下:

可以看到,做出表示后退的“Victory”手勢時,發(fā)布出的/cmd_vel話題的linear x數(shù)據(jù)為-0.5,表示以0.5m/s的速度后退。
說明手勢識別算法和交互功能的軟件包已安裝成功,并能夠通過/cmd_vel話題對外發(fā)布機器人運動控制消息。
3.3 將X3派安裝到機器人上
將X3派安裝到機器人上,并測試在X3派上通過發(fā)布/cmd_vel話題控制機器人運動的功能。
連接了F37攝像頭的X3派直接固定在機器人上,并將機器人的USB控制接口插到X3派上。
安裝效果如下:

對于支持使用ROS開發(fā)的機器人,一般會提供一個基于ROS開發(fā)的機器人運動控制Node,功能為訂閱/cmd_vel話題的控制消息(ROS2中定義的用于機器人控制的消息,消息類型為geometry_msgs/msg/Twist),根據(jù)控制協(xié)議,通過USB等接口向機器人發(fā)送運動控制指令,實現(xiàn)控制機器人運動的目的。
本文使用的本末雙足機器人使用的是USB接口,并提供了運行在X3派上的運動控制package,package訂閱到/cmd_vel話題的控制消息后,通過USB向機器人下發(fā)控制指令,實現(xiàn)對機器人的控制。
在X3派上啟動本末雙足機器人運行控制Node。打開一個終端,執(zhí)行如下命令:
# 配置TogetherROS環(huán)境 source /opt/tros/setup.bash #啟動本末機器人運動控制package ros2 run diablo_sdk ros_bridge_example
執(zhí)行成功后終端中輸出如下信息:
X3派上重新打開一個終端,通過發(fā)布/cmd_vel話題消息控制機器人以0.3r/s的速度轉(zhuǎn)動:
# 配置TogetherROS環(huán)境 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}}'
執(zhí)行成功后終端中輸出如下信息:

機器人收到控制指令后轉(zhuǎn)動的效果如下:

說明機器人能夠按照發(fā)布的控制命令消息正確的實現(xiàn)運動。
3.4 對于其他機器人應(yīng)該怎么安裝
如果手里是其他的移動機器人,例如有一個使用樹莓派或者Jetson Nano作為上位機的機器人,也可以將X3派安裝在機器人上,代替樹莓派或者Jetson Nano,實現(xiàn)控制機器人運動。
安裝方法如下:
- 編譯可以運行在X3派上的運動控制package
- X3派上安裝ROS2軟件系統(tǒng)構(gòu)建和編譯工具:
apt update apt-get install python3-catkin-pkg pip install empy pip install -U colcon-common-extensions
- 將原先運行在樹莓派或者Jetson Nano上的機器人運動控制ROS2 package源碼拷貝到X3派上。
- 在X3派上,package源碼工程所在路徑下,直接使用source /opt/tros/setup.bash; colcon build命令編譯package。
- 如果原先運動控制package是基于ROS1開發(fā),源碼需要適配到ROS2。只需要適配"cmd_vel"話題消息的訂閱和處理,如果原先的ROS1 package中有其他功能,可以先不關(guān)注。
- 安裝
- 將X3派固定在機器人上,如果空間有限,可以將原先的樹莓派或者Jetson Nano拆除。
- 使用USB Type C給X3派供電,如果機器人上無Type C供電輸出,也可以使用移動電源(輸出至少5V&直流 2A)給X3派供電。
- 將機器人的USB控制接口插到X3派上。
- 測試
- X3派上啟動新編譯的機器人運動控制package。
- X3派上重新打開一個終端,通過發(fā)布/cmd_vel話題消息控制機器人以0.3r/s的速度轉(zhuǎn)動:
# 配置TogetherROS環(huán)境 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}}'
如果機器人正常轉(zhuǎn)動,說明X3派安裝成功。
4 完整的機器人手勢控制效果
下面開始測試完整的機器人手勢控制功能。
- X3派上打開一個終端,啟動手勢識別和控制腳本
# 配置TogetherROS環(huán)境 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
- X3派上打開一個終端,啟動機器人運動控制Node
# 配置TogetherROS環(huán)境 source /opt/tros/setup.bash #啟動本末機器人運動控制Node ros2 run diablo_sdk ros_bridge_example
- 通過手勢控制機器人運動
App的控制效果視頻如下:

5 原理分析
第4章節(jié)中,在X3派的兩個終端中分別啟動了hobot_gesture_control.launch.py腳本和運動控制Node,實現(xiàn)了通過手勢控制機器人的效果,本章節(jié)對實現(xiàn)的原理進行分析。
5.1 App運行時的Node和Topic信息
對于一個基于ROS開發(fā)的App,首先會想到這個App在運行時有哪些Node,這些Node發(fā)布和訂閱了哪些Topic,以及這些Node之間的關(guān)聯(lián)。
在X3派上使用ros2的命令行工具查詢設(shè)備上運行的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串聯(lián)起來形成一個pipeline。
此App運行時Node以及Topic信息比較多,看不出Node之間的關(guān)聯(lián)。可以在PC端通過rqt(PC端需要安裝ROS2 Foxy版本,rqt,以及PC需要和X3派處于同一網(wǎng)段)的Node Graph功能可以可視化的展示X3派上運行的Node,Node發(fā)布和訂閱的topic,以及Node之間的連接關(guān)系,如下圖:

其中橢圓形框內(nèi)為Node名,矩形框內(nèi)為topic名。
可以看到,整個graph(pipeline)以mipi_cam Node(圖像采集和發(fā)布)為起點,websocket Node(序列化圖片和AI結(jié)果,用于可視化展示)和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介紹
對于復(fù)雜的包含多個Node的應(yīng)用,ROS2提供了使用啟動腳本通過launch批量啟動Node的功能。
手勢控制機器人App使用hobot_gesture_control.launch.py腳本來啟動這些Node,腳本內(nèi)容如下:
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, # 啟動圖片發(fā)布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圖片編碼&發(fā)布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人體、人頭、人臉、人手框和人體關(guān)鍵點檢測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'] ), # 啟動人手關(guān)鍵點檢測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章節(jié)中查出來的一致。
在第1章節(jié),分析了機器人手勢操控App所需要具備的功能模塊,下面按照這些功能模塊對Node進行分析。
- 傳感
使用了HHP中的Hobot Sensor組件中的mipi_cam Node,同時指定了Node的參數(shù):
- "out_format":發(fā)布圖片的格式為"nv12"
- "image_width":圖片分辨率寬為960
- "image_height":圖片分辨率高為544
- "io_method":發(fā)布出來的圖片傳輸方式為"shared_mem",即共享內(nèi)存方式,對應(yīng)消息的topic為"hbmem_img"
- "video_device":指定了使用的MIPI攝像頭類型為"F37",表示F37攝像頭
參數(shù)指定了使用F37攝像頭,發(fā)布的圖片格式和分辨率可以直接用于算法推理,其中通過共享內(nèi)存方式發(fā)布圖片,可以極大地降低系統(tǒng)負載和傳輸延遲。
- 感知
使用了HHP中的Boxs算法倉庫,訂閱Hobot Sensor(mipi_cam Node)發(fā)布的圖像數(shù)據(jù)后,通過視覺算法進行推理,檢測到人手并且識別出手勢。使用到的算法包括:
(1)人體檢測和跟蹤
人體檢測和跟蹤算法Node訂閱Hobot Sensor發(fā)布的圖像消息,利用BPU處理器進行AI推理,發(fā)布包含人體、人頭、人臉、人手框和人體關(guān)鍵點檢測結(jié)果的AI msg,并通過多目標跟蹤(multi-target tracking,即MOT)功能,實現(xiàn)檢測框的跟蹤和ID分配。
Node對應(yīng)package名為'mono2d_body_detection',同時指定了Node的參數(shù):
- "ai_msg_pub_topic_name":發(fā)布包含人手檢測框信息的AI感知結(jié)果的topic名為"/hobot_mono2d_body_detection"
(2)人手關(guān)鍵點檢測
人手關(guān)鍵點檢測算法Node訂閱Hobot Sensor發(fā)布的圖像消息和人體檢測和跟蹤算法示例發(fā)布的包含人手框信息的AI msg,利用BPU處理器進行AI推理,發(fā)布包含人手關(guān)鍵點信息的AI msg。
Node對應(yīng)package名為'hand_lmk_detection',同時指定了Node的參數(shù):
- "ai_msg_sub_topic_name": 訂閱包含人手檢測框信息的topic名為"/hobot_mono2d_body_detection"
- "ai_msg_pub_topic_name":發(fā)布包含人手關(guān)鍵點信息的的AI感知結(jié)果topic名為"/hobot_hand_lmk_detection"
(3)手勢識別
手勢識別算法Node訂閱人手關(guān)鍵點檢測算法示例發(fā)布的包含人手框、人手關(guān)鍵點信息的AI msg,利用BPU處理器進行AI推理,發(fā)布包含手勢信息的AI msg。
Node對應(yīng)package名為'hand_gesture_detection',同時指定了Node的參數(shù):
- "ai_msg_sub_topic_name": 訂閱包含人手關(guān)鍵點信息的topic名為"/hobot_hand_lmk_detection"
- "ai_msg_pub_topic_name":發(fā)布包含手勢信息的的AI感知結(jié)果topic名為"/hobot_hand_gesture_detection"
手勢識別算法支持識別的手勢類別,發(fā)布的AI msg中對應(yīng)的手勢結(jié)果數(shù)值如下:
手勢類別 | 手勢結(jié)果數(shù)值 |
無手勢 | 0 |
ThumbUp/豎起大拇指 | 2 |
Victory/“V”手勢 | 3 |
Mute/“噓”手勢 | 4 |
Palm/手掌 | 5 |
Okay/OK手勢 | 11 |
ThumbLeft/大拇指向左 | 12 |
ThumbRight /大拇指向右 | 13 |
Awesome/666手勢 | 14 |
- 交互
手勢控制策略Node訂閱手勢識別算法示例發(fā)布的包含手勢信息的AI msg,根據(jù)手勢類型發(fā)布前進、后退、左轉(zhuǎn)、右轉(zhuǎn)的控制消息,實現(xiàn)控制機器人運動。
Node發(fā)布的運動控制消息為ROS2中定義的消息,topic為“/cmd_vel”,消息類型為“geometry_msgs/msg/Twist”。
Node對應(yīng)package名為'gesture_control',同時指定了Node的參數(shù):
- "ai_msg_sub_topic_name": 訂閱包含手勢信息的topic名為"/hobot_hand_gesture_detection"
- "twist_pub_topic_name":發(fā)布運動控制指令消息的topic名為"/cmd_vel"
- "activate_wakeup_gesture": 喚醒手勢開關(guān),值為0表示不啟用喚醒手勢。一般在人較多,環(huán)境復(fù)雜的場景,通過啟用喚醒手勢避免誤觸發(fā)手勢控制功能。
- "track_serial_lost_num_thr": 人手連續(xù)消失幀數(shù)閾值,值為100,表示當用于控制的人手連續(xù)消失100幀之后會重新選擇控制手
- "move_step": 平移運動的步長(速度),0.5表示移動速度為0.5m/s,值越大速度越快
- "rotate_step": 旋轉(zhuǎn)運動的步長(速度),0.5表示旋轉(zhuǎn)速度為0.5r/s,值越大速度越快
手勢控制策略選擇做出上述4種控制手勢(詳細的手勢控制說明詳見3.2章節(jié))的人手作為唯一的控制手,通過此控制手實現(xiàn)對機器人的控制。
如果有多個人手同時做手勢,選擇人手檢測框?qū)挾茸畲蟮氖肿鳛榭刂剖帧?/p>
已有控制手的情況下,其他的手做控制手勢都無效。
Node輸出的log中tracking_sta關(guān)鍵字表示控制手的狀態(tài),0表示未找到控制手,1表示已有控制手,2表示控制手消失。
Node啟動后,未找到控制手的情況下,即沒有做出手勢,輸出log中tracking_sta值為0。
當有人手做出手勢時,找到控制手,輸出log中tracking_sta值為1,同時通過track_id關(guān)鍵字輸出人手的ID,gesture輸出當前做出的手勢結(jié)果數(shù)值。
只有當控制手消失,即連續(xù)track_serial_lost_num_thr幀(配置為100幀,對于輸出頻率為30fps的F37攝像頭,大約為3.3秒)未檢測到人手,判斷控制手消失,開始重新選擇控制手。控制手消失時輸出log中tracking_sta值為2。
如果需要啟用喚醒手勢避免誤觸發(fā),喚醒手勢使用方法詳見手勢控制策略的代碼倉庫。
- 控制
機器人運動控制Node訂閱手勢控制策略Node發(fā)布的topic為“/cmd_vel”的控制消息,根據(jù)控制協(xié)議,通過USB總線向機器人下位機發(fā)布運動控制指令。
對于不同類型的機器人,控制協(xié)議不同,對應(yīng)于不同的運動控制Node。
本文使用的是本末雙足機器人,對應(yīng)的運動控制Node啟動方法為ros2 run diablo_sdk ros_bridge_example。此Node單獨啟動,不在啟動腳本中。
5.3 App的系統(tǒng)設(shè)計
根據(jù)5.1和5.2章節(jié)的介紹,已經(jīng)知道了機器人手勢控制App啟動了哪些Node,這些Node的功能,Node之間的關(guān)系,以及使用這些Node如何實現(xiàn)通過手勢控制機器人的目標。下面進行理論總結(jié),介紹此App的系統(tǒng)設(shè)計。
對于一個復(fù)雜的機器人系統(tǒng),一般在機器人上配置上位機和下位機兩種處理器。
機器人上位機的計算能力較強,執(zhí)行復(fù)雜的機器人上層應(yīng)用,同時能夠最大程度屏蔽不同類型機器人的底層差異。
機器人下位機一般使用低成本的MCU處理器,對機器人本體上的各類傳感器和硬件進行數(shù)據(jù)采集/控制。
手勢控制App由兩部分組成,分別為機器人和PC端,其中機器人部分又分為上位機和下位機。詳細組成如下圖:

機器人上位機為X3派,運行著多個ROS2 Node,除了5.2章節(jié)介紹的傳感、感知、交互和控制功能,還有JPEG圖像編碼和WEB展示功能,將攝像頭發(fā)布的圖片編碼壓縮,以及將手勢識別算法發(fā)布的AI數(shù)據(jù)序列化后使用websocket協(xié)議發(fā)布,實現(xiàn)跨設(shè)備在PC端渲染展示和調(diào)試。
機器人下位機屬于機器人本體的一部分,詳細說明略。
從App的系統(tǒng)設(shè)計圖中可以看出,搭載了X3派和HHP的機器人,利用芯片的AI加速能力和HHP中豐富的算法、機器人開發(fā)組件,可以實現(xiàn)快速開發(fā)智能機器人應(yīng)用的目標。
6 FAQ
6.1 如何復(fù)現(xiàn)App效果?
復(fù)現(xiàn)App效果涉及到兩部分:
(1)機器人手勢控制App
參考第2章準備工作,在X3派上安裝HHP。
(2)本末雙足機器人和機器人運動控制package
獲取方法詳見產(chǎn)品信息:https://developer.horizon.ai/forumDetail/94246984227025410
除了本末雙足機器人,X3派和HHP還適配了小R科技的麥輪小車,也可以使用小R小車直接體驗App效果。
6.2 沒有機器人的情況下可以體驗App效果嗎?
可以體驗。
在沒有機器人的情況下,可以使用此App控制gazebo仿真環(huán)境下的虛擬機器人運動。
6.3 如何將App適配到自己的機器人上?
本文以本末雙足機器人為例介紹手勢控制App的效果,App本身不依賴于任何形態(tài)的機器人,App發(fā)布的運動控制消息為ROS2中定義的消息(topic為“/cmd_vel”,消息類型為“geometry_msgs/msg/Twist”,具體說明參考第5章的原理分析)。
如下圖,可以將App的組成劃分成紅色和藍色虛線框兩個部分:

(1)紅色虛線框部分
這部分功能不依賴于機器人,即可以直接移植到任意形態(tài)的機器人上。
移植方法為將X3派安裝在機器人上,按照第2章節(jié)的準備工作,在X3派上安裝攝像頭傳感器和HHP。
(2)藍色虛線框部分
這部分功能依賴于機器人,需要針對性的適配。根據(jù)機器人的狀態(tài)不同,對應(yīng)不同的適配方法。
狀態(tài)1,原先機器人上有上位機和下位機,如原先使用樹莓派或者Jetson Nano作為上位機,并且上位機上有機器人運動控制Node。需要在X3派上重新編譯機器人運動控制Node。
狀態(tài)2,原先機器人上只有下位機。需要開發(fā)機器人運動控制Node后(開發(fā)參考components/xrrobot · develop · HHP / app / xr_robot · GitLab (horizon.ai)),在X3派上編譯機器人運動控制Node。
6.4 App支持哪些攝像頭?
App對于攝像頭類型沒有要求,地平線機器人平臺支持MIPI和USB兩類攝像頭。
對于MIPI攝像頭,支持F37和GC4663兩種型號。
6.5 是否可以重新定義手勢對應(yīng)的功能?
可以。
App中手勢和控制功能對應(yīng)關(guān)系詳見第1章的功能介紹,目前只用到了4種控制手勢,5.2章節(jié)介紹了手勢識別算法支持的8種手勢類別,可以對手勢控制策略Node進行二次開發(fā),重新定義手勢和對應(yīng)的控制功能,如通過OK手勢控制四足機器人站立。
6.6 如何調(diào)整機器人的運動速度?
修改App啟動腳本hobot_gesture_control.launch.py中手勢控制策略gesture_control Node中的參數(shù),可以控制機器人的平移和旋轉(zhuǎn)速度:
# 啟動手勢交互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'] )
參數(shù)說明詳見5.2.2.8章節(jié)。
6.7 可以開發(fā)一個python的Node擴展App功能嗎?
可以。
ROS2支持跨設(shè)備、跨平臺、跨語言,TogetherROS完全兼容ROS2 Foxy版本,因此也支持這些特性。
例如在X3派的40PIN上安裝了LED燈,當機器人處于運動狀態(tài)時,LED燈被點亮。
用戶可以使用python開發(fā)一個ROS Node,訂閱手勢控制策略Node發(fā)布的topic為“/cmd_vel”的消息,檢查消息中的控制指令是否為啟動運動指令(值是否為非0),如果有非0值,表示是啟動運動,點亮LED燈,否則點滅LED燈。
使用python開發(fā)完Node后,直接在X3派上編譯并運行。
6.8 如何開發(fā)一個自己的算法Node擴展App功能?
HHP提供的Hobot DNNshe'u'qsheuq簡化板端AI模型推理與部署,釋放BPU算力,降低AI使用門檻。同時內(nèi)置了常用的檢測、分類和分割算法的模型后處理,幫助用戶快速在X3派上集成部署自己的算法。
本文轉(zhuǎn)自地平線開發(fā)者社區(qū)
原作者:zhuk
原鏈接:https://developer.horizon.ai/forumDetail/98129540173361326
-
人機交互
+關(guān)注
關(guān)注
12文章
1236瀏覽量
56204 -
人工智能
+關(guān)注
關(guān)注
1804文章
48681瀏覽量
246385
發(fā)布評論請先 登錄
拓斯達亮相2025華為鯤鵬昇騰開發(fā)者大會
明遠智睿SSD2351開發(fā)板:語音機器人領(lǐng)域的變革力量
【「# ROS 2智能機器人開發(fā)實踐」閱讀體驗】機器人入門的引路書
大象機器人攜手進迭時空推出 RISC-V 全棧開源六軸機械臂產(chǎn)品
地瓜機器人,和全球機器人開發(fā)者交朋友

名單公布!【書籍評測活動NO.58】ROS 2智能機器人開發(fā)實踐
《HarmonyOS第一課》煥新升級,賦能開發(fā)者快速掌握鴻蒙應(yīng)用開發(fā)
ROSCon China 2024 | RDK第一本教材來了!地瓜機器人與古月居發(fā)布新書《ROS 2智能機器人開發(fā)實踐》

ROSCon China 2024 | RDK第一本教材來了!地瓜機器人與古月居發(fā)布新書《ROS 2智能機器人開發(fā)實踐》
塔革特官方教學(xué)第一期:元器件及其庫相關(guān)操作。
中國自動駕駛第一股的地平線機器人正式上市
兆易創(chuàng)新亮相2024地平線地瓜機器人開發(fā)者日
地平線助力鑒智機器人多款中階方案斬獲定點合作

評論