ros2学习笔记12--创建ros2包(代码片段)

鸿_H 鸿_H     2022-12-03     156

关键词:

概要:这篇主要介绍如何创建ros2包

环境:ubuntu20.04,ros2-foxy,vscode

最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.

2.2.2创建自己第一个ros2包(原文:https://docs.ros.org/en/foxy/Tutorials/Creating-Your-First-ROS2-Package.html

>>教程>>创建自己第一个ros2包

你正阅读的是ros2较老版本(Foxy),但仍然支持的说明文档.想查看最新版本的信息,请看galactic版本链接( https://docs.ros.org/en/galactic/Tutorials.html

创建自己第一个ros2包

目标:使用CMake或者python来创建一个新包,并且运行它的执行文件.

课程等级:初级

时长:15min

目录

1.背景
1.1什么是ros2包
1.2ros2包是由什么组成
1.3包在工作空间中
2.预备知识
3.步骤
3.1创建包
3.2编译包
3.3source配置文件
3.4使用包
3.5检查包内容
3.6定制化包.xml文件
4.总结
5.下一步

1.背景

1.1什么是ros2包

包可以视为你的ros2代码的容器.如果你想安装你的程序或者分享给别人,你需要(把代码)有组织放到一个包里面.有了包,你可以分享ros2工作内容,别人可以方便地编译以及使用.

ros2包创建使用ament作为编译系统,colcon作为编译工具.使用CMake或者python来创建一个包,这些是官方支持的,当然也存在其他构建方式.

1.2ros2包是由什么组成

CMake或者python ros2包都有各自的最低要求:

CMake:
package.xml:包含包的基本信息的文件

CMakeLists.txt :描述如何编译代码的文件

python:
package.xml:包含包的基本信息的文件

setup.py:安装该包的使用说明

setup.cfg:该文件的作用是,让ros2 run指令可以找到包里面的可执行文件

/<package_name>:一个和包名同名的目录,可让ros2工具用来找到你的包,其包含__init__.py

可能最简单的包文件结构如同:

CMake:

my_package/
     CMakeLists.txt
     package.xml

python:

my_package/
      setup.py
      package.xml
      resource/my_package

1.3包在工作空间中

一个工作空间可以包含你想要的任意数量的包,每一个都有自己的文件夹.同一工作空间,包的构建方式可以多样(CMake, Python等等).但你不可以插入包.

最好练习方式就是,工作空间里面有个src文件集,然后在该文件将里面创建你的包.这可以让工作空间保持高度清洁状态.

简单工作空间可能是这样子:

workspace_folder/
    src/
      package_1/
          CMakeLists.txt
          package.xml

      package_2/
          setup.py
          package.xml
          resource/package_2
      ...
      package_n/
          CMakeLists.txt
          package.xml

2.预备知识

学习了前面课程,你应该有了一个ros2工作空间,你会在里面构建你的包.

3.步骤

3.1创建包

首先,source一下ros2环境变量.

使用前面课程创建的工作空间dev_ws来放新包.

使用包创建指令之前,你确认你是在src文件夹下面:

linux:

cd ~/dev_ws/src

ros2创建新包的指令语法如下:

CMake:

ros2 pkg create --build-type ament_cmake <package_name>

python:

ros2 pkg create --build-type ament_python <package_name>

本课程,你会使用可选型参数--node-name,在包中创建简单的Hello World可执行文件.

终端输入以下指令:

CMake:

ros2 pkg create --build-type ament_cmake --node-name my_node my_package

python:

ros2 pkg create --build-type ament_python --node-name my_node my_package

现在,你工作空间的src目录多了一个my_package文件夹.

运行完指令,你的终端会返回一下信息:

CMake:

going to create a new package
package name: my_package
destination directory: /home/user/dev_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['<name> <email>']
licenses: ['TODO: License declaration']
build type: ament_cmake
dependencies: []
node_name: my_node
creating folder ./my_package
creating ./my_package/package.xml
creating source and include folder
creating folder ./my_package/src
creating folder ./my_package/include/my_package
creating ./my_package/CMakeLists.txt
creating ./my_package/src/my_node.cpp

python:

going to create a new package
package name: my_package
destination directory: /home/user/dev_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['<name> <email>']
licenses: ['TODO: License declaration']
build type: ament_python
dependencies: []
node_name: my_node
creating folder ./my_package
creating ./my_package/package.xml
creating source folder
creating folder ./my_package/my_package
creating ./my_package/setup.py
creating ./my_package/setup.cfg
creating folder ./my_package/resource
creating ./my_package/resource/my_package
creating ./my_package/my_package/__init__.py
creating folder ./my_package/test
creating ./my_package/test/test_copyright.py
creating ./my_package/test/test_flake8.py
creating ./my_package/test/test_pep257.py
creating ./my_package/my_package/my_node.py

你可以看到新包会自动生成这些文件.

3.2编译包

把(一堆)包放到一个工作空间里面是很有意义的,你可以在工作空间根目录使用colcon build指令一次性编译完成.否则,你得必须一个个单独编译.

返回工作空间根目录:

cd ~/dev_ws

现在编译你的包:

linux:

colcon build

回顾上一次课程,你也放了ros_tutorials到工作空间dev_ws.你可能注意到运行colcon build指令,也会编译turtlesim包.当你的工作空间包比较少时候,这么干没有问题,但是包多了,colcon build指令就得花费很长时间.

下次单独编译my_package包,可以运行:

colcon build --packages-select my_package

3.3source配置文件

为了使用新的包和执行文件,新开终端,并source一下ros2环境变量

然后,在dev_ws目录,运行下面指令来source一下工作空间环境变量:

linux:

. install/setup.bash

既然你的工作空间放到(可检索)的路径上,你可以使用新包的执行文件了.

3.4使用包

为了使用创建包时,使用--node-name参数创建的执行文件,输入指令:

ros2 run my_package my_node

终端会返回信息:

CMake:

hello world my_package package

python:

Hi from my_package.

3.5检查包内容

dev_ws/src/my_package目录下面,你会看到一些文件和文件夹使用指令ros2 pkg create自动生成:

CMake:

CMakeLists.txt  include  package.xml  src

my_node.cpp存在src目录,你以后需要要跑的c++编写的节点都是放这里.

python:

my_package  package.xml  resource  setup.cfg  setup.py  test

my_node.py文件放在my_package目录,你以后需要要跑的python编写的节点都是放这里

3.6定制化包.xml文件

创建完包后,你注意到返回信息里面,descriptionlicense域(标签)有TODO(字段)注释.那是因为报的描述和许可者声明并不是自动设置的,如果你想分享你的包却又是必须的(所以就有了).这个maintainer域(标签)也是应该填的.

进入dev_ws/src/my_package目录,用你喜欢的编辑器打开文件package.xml

CMake:

 1<?xml version="1.0"?>
 2<?xml-model
 3   href="http://download.ros.org/schema/package_format3.xsd"
 4   schematypens="http://www.w3.org/2001/XMLSchema"?>
 5<package format="3">
 6 <name>my_package</name>
 7 <version>0.0.0</version>
 8 <description>TODO: Package description</description>
 9 <maintainer email="user@todo.todo">user</maintainer>
10 <license>TODO: License declaration</license>
11
12 <buildtool_depend>ament_cmake</buildtool_depend>
13
14 <test_depend>ament_lint_auto</test_depend>
15 <test_depend>ament_lint_common</test_depend>
16
17 <export>
18   <build_type>ament_cmake</build_type>
19 </export>
20</package>

python:

 1<?xml version="1.0"?>
 2<?xml-model
 3   href="http://download.ros.org/schema/package_format3.xsd"
 4   schematypens="http://www.w3.org/2001/XMLSchema"?>
 5<package format="3">
 6 <name>my_package</name>
 7 <version>0.0.0</version>
 8 <description>TODO: Package description</description>
 9 <maintainer email="user@todo.todo">user</maintainer>
10 <license>TODO: License declaration</license>
11
12 <test_depend>ament_copyright</test_depend>
13 <test_depend>ament_flake8</test_depend>
14 <test_depend>ament_pep257</test_depend>
15 <test_depend>python3-pytest</test_depend>
16
17 <export>
18   <build_type>ament_python</build_type>
19 </export>
20</package>

如果没有自动填充,在对应的行里面输入名字和邮箱.然后,在对应行编辑包的描述:

<description>Beginner client libraries tutorials practice package</description>

然后,对应行更新许可证.在这里(https://opensource.org/licenses/alphabetical),你可以了解更多关于开源许可证信息.

由于该包知识用来练习,使用任何许可者都是没有问题的.这里我们选择Apache License 2.0

<license>Apache License 2.0</license>

编辑结束后,别忘了保存文件.

许可证标签下方,你会看到很多标签名字以_depend结束.这些罗列的是你的包的所依赖的其他包,给colcon指令编译时可自动查找使用的.my_package包比较简单,并不需要很多依赖,但是在后面课程中,你会看到这些空间会被利用起来.

CMake:
你搞全了!(没啥要折腾的了)

python:
setup.py文件跟package.xml文件一样,有描述,维护器和许可证这些内容,所以你要也得设置.这两个需要匹配一致.这里的版本version=和包名package_name也是自动填充到两个文件里面,并且配对一致.

使用你喜欢的文本编辑器打开setup.py文件

 1 from setuptools import setup
 2
 3 package_name = 'my_py_pkg'
 4
 5 setup(
 6 name=package_name,
 7 version='0.0.0',
 8 packages=[package_name],
 9 data_files=[
10     ('share/ament_index/resource_index/packages',
11             ['resource/' + package_name]),
12     ('share/' + package_name, ['package.xml']),
13   ],
14 install_requires=['setuptools'],
15 zip_safe=True,
16 maintainer='TODO',
17 maintainer_email='TODO',
18 description='TODO: Package description',
19 license='TODO: License declaration',
20 tests_require=['pytest'],
21 entry_points=
22     'console_scripts': [
23             'my_node = my_py_pkg.my_node:main'
24     ],
25   ,
26)

根据package.xml修改16到19行

别忘了保存文件

4.总结

你已经创建一个包来组织代码,并让它也方便别人使用.

你的包会自动填充重要文件,然后你可以使用colcon来编译它,因此你可以在本地环境中使用该包的执行文件.

5.下一步

接下来,添加一些有意思的内容到包里面.开始是简单的发布器或订阅器系统,你既可以选择c++也可以选择python来编写(这两者).

其他

个人认为重点:

cmakepython创建包的指令区别,python的配置文件多一些,ros2编译空间使用的是colcon指令.也学习了如何直接创建可执行文件.

个人练习只折腾c++版本(cmake

这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.

#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈

ros2学习笔记24--用colcon对包进行编译(代码片段)

概要:这篇内容主要介绍用colcon对包进行编译环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现3.6用colcon对包进行编译(原文:https://docs.ros.org/en/foxy/Tu... 查看详情

ros2学习笔记20--创建一个action(代码片段)

概要:这篇内容主要介绍如何创建一个action环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.3.1创建一个动作(原文:https://docs.ros.org/en/foxy/Tutori... 查看详情

ros2学习笔记11--工作空间的创建(代码片段)

概要:这篇主要介绍工作空间的创建环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.2.2.1创建工作空间(原文:https://docs.ros.org/en/foxy/Tutorials/Wor... 查看详情

ros2学习笔记9--创建一个launch文件(代码片段)

概要:这篇主要介绍launch文件环境:ubuntu20.04,ros2-foxy,vscode最后没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.2.1.9创建一个launch文件(原文:https://docs.ros.org/en/foxy/Tutorials/Launch-Files... 查看详情

ros2学习笔记16--详述ros2接口(代码片段)

概要:这篇主要进一步介绍ros2接口.环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.2.2.8拓展ros2接口(原文:https://docs.ros.org/en/foxy/Tutorials... 查看详情

ros2学习笔记28--ros2环境下,多激光雷达启动的launch文件编写样式参考(代码片段)

背景:一次需要读取多个velodyne的雷达点云数据,但是ros2知识缺少,一番折腾终有成果.1.准备velodyne的ros2版本驱动链接:https://github.com/ros-drivers/velodyne/tree/ros22.launch文件编写2.1官方 查看详情

ros2学习笔记29--项目从ros1迁移到ros2的经验参考(代码片段)

环境:ubuntu20.04,ros-foxy(ros2),vscode背景:项目需要,一直折腾把ros1下面的包升级到ros2版本.以下纯属个人查找资料摸索,自我理解所得,有错误的地方,望大佬们不吝赐教.1.消失的句柄ro... 查看详情

ros2学习笔记25--ros2话题统计编写教程(c++)(代码片段)

概要:这篇内容主要介绍用c++编写能够统计话题的侦听器环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现4.1ros2话题统计教程(C++)(... 查看详情

ros2学习笔记19--探索ros2doctor工具(代码片段)

概要:这篇主要介绍ros2doctor工具环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.2.2.11探索ros2doctor工具(原文:https://docs.ros.org/en/foxy/Tutorials/Get... 查看详情

ros2学习笔记10--使用ros2bag进行录制和回放数据(代码片段)

概要:这篇主要介绍使用ros2bag进行录制和回放数据环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.2.1.10录制和回放数据(原文:https://docs.ros.or... 查看详情

ros2学习笔记18-velodyne16雷达点云在ros2中可视化案例参考(代码片段)

环境:ubuntu20.04,ros-foxy,vscode,velodyne-16背景:练习如何将velodyne-16雷达点云数据在ros2中读取并可视化.折腾了很久,并没有找到类似案例,所以自己总结一下.1.修改电脑ip这里修改自己电脑ip,跟大多数... 查看详情

ros2学习笔记27--实现自定义内存分配器(代码片段)

概要:这篇内容主要介绍如何实现自定义内存分配器环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现4.3实现自定义内存分配器(原文:https://docs.ros.or... 查看详情

ros2学习笔记17--在类中使用参数(c++)(代码片段)

概要:这篇主要介绍在类中使用参数(C++)环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.2.2.9在类中使用参数(C++)(... 查看详情

ros2学习笔记22--使用launch启动/监听多个node节点(代码片段)

概要:这篇内容主要介绍如何使用launch启动/监听多个node节点环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现3.4使用launch启动/监听多个node节点ÿ... 查看详情

ros2学习笔记23--将多个node节点组合到单一进程中(代码片段)

概要:这篇内容主要介绍将多个node节点组合到单一进程中环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现3.5多个node节点组合到单一进程中(原文:ht... 查看详情

webots2021b和ros2调试笔记21-07-27(代码片段)

先上结论:凉凉凉透心凉webots2021b刚发布时间不长,其ROS2接口包也不全。2021b(win10)安装包小,很多库需要启动时联网下载。很多节点不支持windows哦!如下:[WARNING][webots_robotic_arm_node.EXE-2]:'SIGINT'... 查看详情

ros2学习笔记26--使用快速dds查找服务作为查找协议(社区贡献)(代码片段)

概要:这篇内容主要介绍使用快速DDS查找服务作为查找协议(社区贡献)环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现4.2使用快速DDS查找服务作为... 查看详情

ros2学习笔记21--编写action服务器和客户端(c++)(代码片段)

概要:这篇内容主要介绍如何使用C++来编写动作服务器和客户端环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.3.2编写动作服务器和客户端(... 查看详情