ROS2+OpenVINO™ 实践教程 -下篇 | 开发者实战

openlab_4276841a 更新于 1年前

3.1 ROS2的工作空间


通过前面的学习及实践,我们已经知道节点就是可以执行文件。那这些节点在哪里,属于哪个软件包,软件包又在哪里?答案是—工作空间(workspace)。

工作空间是包含若干个功能包的目录,我们可以理解成工作空间就是一个文件夹,这个文件夹中必须包含src目录,而软件包必须存放在src目录下。新建一个工作空间就是新建带有src子目录的文件夹。我们用mkdir命令创建一个工作空间。

1.创建工作空间

mkdir -p ros2ov_ws/src


              

2.功能包介绍

功能包可以解释为存放节点的地方,ROS2中功能包根据编译方式的不同分为三种类型。

1 ament_python,适用于python程序

2 cmake,适用于C++

3 ament_cmake,适用于C++程序,是cmake的增强版

3.功能包获取方式

3.1 安装获取


在安装通用工具包时,我们通常使用安装获取方式,工具包会直接安装到系统目录,这也是最便捷的方式。

sudo apt install ros--package_name

例如,我们要安装u**摄像头功能包。安装的工具包位于/opt/ros/foxy/share目录中。

sudo apt-get install ros-foxy-u**-cam


                

3.2 手动编译获取


手动编译获取是应对需要下载源码然后进行编译生成功能包的情况。在下节中我们详细介绍如何编译代码。

4.ros2 pkg命令


ros2 pkg管理功能包的常用命令

               

1)创建功能包

ros2 pkg create --build-type {cmake,ament_cmake,ament_python} --dependencies <依赖名字>


2)列出可执行文件

列出所有

ros2 pkg executables


列出某个功能包的

ros2 pkg executables turtlesim


3)列出所有的包

ros2 pkg list


4)输出某个包所在路径的前缀

ros2 pkg prefix <package-name>


例如海龟仿真器,

ros2 pkg prefix turtlesim


5)列出包的清单描述文件

每一个功能包都有一个标配的manifest.xml文件,用于记录这个包的名字、构建工具、编译信息、拥有者、用途等信息。通过这个信息,就可以自动为该功能包安装依赖,构建时确定编译顺序等。例如:

ros2 pkg xml turtlesim


3.2ROS2的编译环境


与ROS catkin工具不同,ROS2采用colcon作为其编译工具,这个工具有什么作用呢?简言之, 就是用来编译代码,构建应用。

1.安装colcon

Colcon属于python环境的一个扩展轮,并非ROS2默认安装工具,因此我们需要手动安装。在终端中输入命令:

sudo apt-get install python3-colcon-common-extensions


                

2. 测试编译环境

我们创建一个测试工作空间来测试编译环境。

mkdir -p colcon_test/src && cd colcon_test

git clone https://ghproxy.com/https://github.com/ros2/examples src/example**** foxy

colcon build


               

编译完成,没有任何错误,在工作空间中生成了三个新文件夹build、install、log,我们可以确认colcon编译环境已经准备好。

               

3.运行结果


cd colcon_test

source install/setup.bash

ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function


我们进入工作空间,初始化环境变量,启动运行测试节点的订阅。程序运行后没有任何输出,别紧张,因为没有发布者,接下来我们再打开一个终端,运行节点的发布程序。

                

cd colcon_test

source install/setup.bash

ros2 run examples_rclcpp_minimal_publisher publisher_member_function


                  

当发布节点开始运行时,订阅节点同步打印出接收到的消息。

4.其他编译指令


只编译工作空间中一个功能包

colcon build --packages-select <package-name>


不编译测试单元

colcon build --packages-select --cmake-args -DBUILD_TESTING=0


运行编译功能包的测试

允许通过更改src下的部分文件来改变install

提高效率的编译方式,当python脚本有所调整时,不必重新编译功能包。

colcon build --symlink-install


相信各位看官已经掌握了如何编译ROS2功能包,接下来我们继续操练,通过学习ros2_openvino_toolkit让我们的机器人更加智能。

4.1 认识ros2_openvino_toolkit


OpenVINO™ 工具套件是英特尔推出的基于卷积神经网络(CNN)深度学习的推理及神经网络优化的工具集。工具套件提供了接口统一的跨Intel硬件及其加速器的异构计算框架,目标是将英特尔处理器的算力水平发挥到最大,获得了业界认可。关于OpenVINO™ 工具套件详细介绍请参考:https://docs.openvino.ai/latest/index.html

ros2_openvino_toolkit项目是OpenVINO™ 工具套件的应用到ROS2系统的延展,是基于OpenVINO™ SDK开发的适用于机器人应用场景的一个扩展应用。因其灵活性、易用性在不需要改动太多代码的前提下,就可以满足机器人对于深度学习的需求,例如实现诸如识别、分类等人工智能应用。

4.2 ros2_openvino_toolkit的系统框架


从架构设计的角度来看,ROS2 OpenVINO™ 框架不仅将Intel OpenVINO™ 工具套件的主要功能针对ROS2做了移植,也实现了一个初级的运行时神经网络应用框架。

下图展示了该应用框架的基本模块架构。

                 

应用框架由以下几部分构成:

OpenVINO™ 工具套件

作为一个开源的神经网络模型优化及推理加速套件,OpenVINO™ 工具套件可以发挥IA x86芯片的最大性能用于神经网络的推理工作。诸多已经使用IA芯片的产品可以无缝升级,从普通机器人变为智能机器人。

ROS2 OpenVINO™ 运行时框架

运行时框架将OpenVINO™ 工具套件带入到ROS2系统,遵照标准的ROS2 API标准实现,使得用户不需要关心算法本身,甚至不需要学习OpenVINO™ 工具套件即可开发基于ROS2的人工智能应用,例如物体识别、物体分割等。运行时框架提供了更为灵活的接口,适用于更多更多变的应用场景,而且不需要修改代码,通过配置文件就可以获得你期望的视觉推断结果。

标准的数据输入源

框架支持多种图像输入来源,从本地的图片视频、到通用的USB摄像头、乃至RealSense深度摄像头,都可以轻松驾驭,符合ROS2系统标准的输入接口要求,适配不同的应用场景。

标准的数据输出接口

框架支持ROS2的标准接口Topic,service模型。通过对标准的ROS2接口支持,开发者可以直接使用ROS2标准工具,例如RViz工具、以及openCV的图像显示工具Image Window直接处理推理结果。

优化的预训练模型

得益于OpenVINO™ 工具套件的模型仓库提供了大量的预训练模型,从机器视觉到NLP都有支持,此外,模型优化器可以将主流框架Pytorch、Tensorflow、PaddlePaddle等预训练模型转化为IR格式,借助于ROS2 OpenVINO运行时框架可以将大量的已有模型直接导入机器人应用中,为应用开发提供了无限的想象空间。

4.3 ros2_openvino_toolkit实现逻辑


ROS2 OpenVINO™ 应用框架将与神经网络、深度学习等人工智能内容做了很好的封装以pipeline的概念呈现出来。机器人开发者不需要过多考虑算法本身仅需要关注于使用标准的ROS2接口进行数据处理即可。这也为团队中多岗位协同打下良好的基础。算法工程师遵循主流框架利用OpenVINO™ 工具套件优化算法;ROS工程师遵循标准接口处理数据,协同共进,能够有效加快产品开发进度。

下图演示了ROS2的相关应用被调用的过程。

                

应用程序被调用时,用户将代表配置文件路径的参数传递给应用;ROS2 OpenVINO™ 运行时框架内部的Parameter Manager(配置管理器)解析文件,形成结构化的参数信息。依赖这些参数信息,一个包含输入、推断组合、输出三个部分的Pipeline将被创建。此后,Pipeline Manager会接管该pipeline,管理所有pipeline的生命周期。

4.4 支持的功能列表


1、物体检测

2、人脸检测

3、年龄-性别识别

4、表情识别

5、v物体分割

6、人体Re-ID

7、车辆属性识别

8、车牌识别

4.5 ros2_openvino_toolkit代码操练


1.梳理依赖关系

项目运行依赖,OpenVINO™ 工具套件及ROS2机器人系统。在前面的章节中我们已经安装并测试好环境,ROS2系统准备就绪。已经有大量的教程及说明讲解如何安装OpenVINO™ 工具套件,这里不做赘述。安装步骤请参考:

https://docs.openvino.ai/2021.4/openvino_docs_install_guides_installing_openvino_linux.html

2.下载代码

mkdir -p ros2_ws/src && cd ros2_ws

git clone https://github.com/intel/ros2_openvino_toolkit -b master

git clone https://github.com/intel/ros2_object_msgs

git clone https://github.com/IntelRealSense/realsense-ros.git -b ros2


3.安装依赖

sudo apt-get install ros-galactic-diagnostic-updater


注意:此步骤不可省略,必须执行,否则编译时报错。

4.编译代码

cd $HOME/ros2_ws

colcon build --symlink-install


               

编译完成后,初始化环境变量

source $HOME/ros2_ws/install/local_setup.bash


5.准备模型目录

sudo mkdir -p /opt/openvino_toolkit

sudo ln -s /opt/intel/openvino_2021/deployment_tools/open_model_zoo/tools/downloader /opt/openvino_toolkit/models

sudo chmod 777 -R /opt/openvino_toolkit/models


              

6.下载模型


cd /opt/intel/openvino_2021/deployment_tools/open_model_zoo/tools/downloader

sudo python3 downloader.py --name face-detection-adas-0001 --output_dir /opt/openvino_toolkit/models/face_detection/output

sudo python3 downloader.py --name age-gender-recognition-retail-0013 --output_dir /opt/openvino_toolkit/models/age-gender-recognition/output

sudo python3 downloader.py --name emotions-recognition-retail-0003 --output_dir /opt/openvino_toolkit/models/emotions-recognition/output

sudo python3 downloader.py --name head-pose-estimation-adas-0001 --output_dir /opt/openvino_toolkit/models/head-pose-estimation/output

sudo python3 downloader.py --name person-detection-retail-0013 --output_dir /opt/openvino_toolkit/models/person-detection/output

sudo python3 downloader.py --name person-reidentification-retail-0277 --output_dir /opt/openvino_toolkit/models/person-reidentification/output

sudo python3 downloader.py --name landmarks-regression-retail-0009 --output_dir /opt/openvino_toolkit/models/landmarks-regression/output

sudo python3 downloader.py --name semantic-segmentation-adas-0001 --output_dir /opt/openvino_toolkit/models/semantic-segmentation/output

sudo python3 downloader.py --name vehicle-license-plate-detection-barrier-0106 --output_dir /opt/openvino_toolkit/models/vehicle-license-plate-detection/output

sudo python3 downloader.py --name vehicle-attributes-recognition-barrier-0039 --output_dir /opt/openvino_toolkit/models/vehicle-attributes-recognition/output

sudo python3 downloader.py --name license-plate-recognition-barrier-0001 --output_dir /opt/openvino_toolkit/models/license-plate-recognition/output

sudo python3 downloader.py --name person-attributes-recognition-crossroad-0230 --output_dir /opt/openvino_toolkit/models/person-attributes/output


                

7.**label文件


从ros2_openvino_toolkit包**label文件到模型库,仅需要执行一次。

sudo cp ~/ros2_ws/src/ros2_openvino_toolkit/data/labels/face_detection/face-detection-adas-0001.labels /opt/openvino_toolkit/models/face_detection/output/intel/face-detection-adas-0001/FP32/

sudo cp ~/ros2_ws/src/ros2_openvino_toolkit/data/labels/face_detection/face-detection-adas-0001.labels /opt/openvino_toolkit/models/face_detection/output/intel/face-detection-adas-0001/FP16/

sudo cp ~/ros2_ws/src/ros2_openvino_toolkit/data/labels/emotions-recognition/FP32/emotions-recognition-retail-0003.labels /opt/openvino_toolkit/models/emotions-recognition/output/intel/emotions-recognition-retail-0003/FP32/

sudo cp ~/ros2_ws/src/ros2_openvino_toolkit/data/labels/object_segmentation/frozen_inference_graph.labels /opt/openvino_toolkit/models/semantic-segmentation/output/intel/semantic-segmentation-adas-0001/FP32/

sudo cp ~/ros2_ws/src/ros2_openvino_toolkit/data/labels/object_segmentation/frozen_inference_graph.labels /opt/openvino_toolkit/models/semantic-segmentation/output/intel/semantic-segmentation-adas-0001/FP16/

sudo cp ~/openvino2_ws/src/ros2_openvino_toolkit/data/labels/object_detection/vehicle-license-plate-detection-barrier-0106.labels /opt/openvino_toolkit/models/vehicle-license-plate-detection/output/intel/vehicle-license-plate-detection-barrier-0106/FP32


8.运行实例


· 头部姿态检测

使用USB摄像头作为输入,检测头部姿态

ros2 launch dynamic_vino_sample pipeline_people.launch.py


                 

· 物体分割-道路属性识别

使用图片作为输入,实现道路上物体分割

ros2 launch dynamic_vino_sample pipeline_segmentation_image.launch.py


               

4.6 小结


通过本次实践,我们掌握了ROS2工作空间创建、编译,同时深入学习并操练了ros_openvino_toolkit项目,最终运行头部姿态识别及车道分割案例。同时,我们也可以得出NUC N5105平**全可以胜任ROS2+OpenVIO™ 工具套件组合运行。

本章结束,预示着新的开始,接下来我们将用这套平台构建一个机器人参考方案。

* 本文内容及配图均为“英特尔物联网”的原创内容。该公众号的运营主体拥有上述内容的著作权或相应许可。除在微信朋友圈分享之外,如未经该运营主体书面同意,请勿转载、转帖或以其他任何方式**、发表或发布上述内容。如需转载上述内容或其中任何部分,请留言联系。

英特尔、英特尔标识、以及其他英特尔商标是英特尔公司或其子公司在美国和/或其他国家的商标。

©英特尔公司版权所有。

* 文中涉及的其它名称及商标属于各自所有者资产

0个评论