ROS2学习笔记12--创建ros2包
Posted 鸿_H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS2学习笔记12--创建ros2包相关的知识,希望对你有一定的参考价值。
概要:这篇主要介绍如何创建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文件
创建完包后,你注意到返回信息里面,description
和license
域(标签)有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来编写(这两者).
其他
个人认为重点:
cmake
和python
创建包的指令区别,python
的配置文件多一些,ros2
编译空间使用的是colcon
指令.也学习了如何直接创建可执行文件.
个人练习只折腾c++
版本(cmake
)
这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.
#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈
以上是关于ROS2学习笔记12--创建ros2包的主要内容,如果未能解决你的问题,请参考以下文章
ROS2学习笔记15--创建自定义ros2接口文件msg和srv