ROS 2官方文档(基于humble版本)学习笔记(四)
软件包(package)是ROS 2代码的组织单元。如果您希望能够安装代码或与他人共享代码,那么您需要将其组织成一个包。通过包,您可以发布ROS 2工作并允许其他人轻松构建和使用它。ROS 2中的包创建使用ament作为构建系统和colcon作为构建工具。您可以使用CMake或Python创建一个包,这两种方式得到官方支持,尽管还存在其他构建类型。
ROS 2官方文档(基于humble版本)学习笔记(四)
不好意思,停更了好久,官方文档是看了,只是没有时间整理,最近在外地出差,周末都在瞎忙,今天刚好有时间把接下来的部分总结一下,下面才是使用ROS库进行开发的开始。
2.客户端库
使用colcon构建包(package)
该章介绍如何使用colcon创建和构建一个ROS 2的工作空间(workspace)。colcon是 ROS构建工具catkin_make, catkin_make_isolated, catkin_tools and ament_tools的迭代.
使用如下命令安装colcon。
sudo apt install python3-colcon-common-extensions
一个ROS 工作空间有其特殊的目录结构。通常在工作空间中有一个空的src目录,这个目录下存放的是ROS包的源代码。colcon会在src同级的目录下创建build、install、log三个目录(比catkin构建的目录缺少了devel)。顾名思义,build目录是存放构建过程中产生的中间文件的,其中会为每一个包创建一个独立的目录。install目录存放的是每个包的安装文件,同样的每个包一个独立的目录。log目录中存放的是colcon构建时产生的日志文件。
创建工作空间(workspace)
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
可以将example仓库的源码放到src目录下
git clone https://github.com/ros2/examples src/examples -b humble
就像我们在学习笔记(一)中安装完ROS 2之后写到.bashrc中的那句
source /opt/ros/humble/setup.bash
通过这句命令我们创建了ROS 2的底层环境,这个底层环境将为我们的工作空间提供必要的构建依赖。我们的工作空间ros2_ws将成为ROS 2环境之上的覆盖层环境。当你打算迭代少量软件包时,建议使用一个覆盖层,通常,建议当您打算迭代少量软件包时使用覆盖层,而不是将所有软件包放入相同的工作区中。
构建工作空间
在工作空间的根目录(ros2_ws)执行colcon build
命令,同时还可以使用如下参数。
--packages-up-to'
构建所需的包及其所有依赖项,而不是整个工作空间(节省时间)
--symlink-install
在您调整Python脚本时,无需每次重新构建
--event-handlers console_direct+
在构建时显示控制台输出(否则可在log
目录中找到)
--executor sequential
一个包一个包的处理而不是并行处理。
构建完成就会看到工作空间目录下有src,build,install,log四个目录。
执行测试(tests)
通过如下命令执行我们刚刚构建的包中的测试。
colcon test
导入环境(source the environment)
当colcon构建成功后,输出都放在install目录下,在你使用安装好的可执行程序和库之前,需要把他们加到你的path和库path中。幸运的是colcon会在install目录下产生bash/bat文件,来帮助你建立环境。这些文件将会把所有需要的元素添加到你的path和库path中,同时提供包导出的任何bash或者shell命令。
source install/setup.bash
试一下演示程序
通过执行如下命令分别启动订阅者和发布者演示程序:
ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function
ros2 run examples_rclcpp_minimal_publisher publisher_member_function
创建自己的包(package)
colcon使用的包文件是package.xml,遵循REP149定义的规范。
colcon支持多种构建类型。建议的构建类型是ament_cmake
和ament_python
,也支持纯cmake包。
方便起见,我们可以使用ros pkg create
工具基于模板创建一个新包。
设置colcon_cd
这个命令可以快速的从当前目录切换到包目录,例如执行colcon_cd some_ros_package
就会切换到~/ros2_ws/src/some_ros_package
目录,只需进行如下配置:
echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc
echo "export _colcon_cd_root=/opt/ros/humble/" >> ~/.bashrc
小贴士
如果您不想构建特定的软件包,将一个名为colcon_ignore的空文件放在目录中,则不会索引。
如果要避免在CMAKE软件包中配置和建造测试(tests),则可以通过:-CMAKE -ARGS -DBUILD_TESTING = 0。
如果你想要从一个包单独运行一个特定的测试程序,可以执行下面的命令:
colcon test --packages-select YOUR_PKG_NAME --ctest-args -R YOUR_TEST_IN_PKG
创建一个工作空间(workspace)
#导入环境
source /opt/ros/humble/setup.bash
#创建工作空间目录
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
#clone一份示例代码
git clone https://github.com/ros/ros_tutorials.git -b humble
#解决依赖,每次clone一份代码之后,检查一下依赖,这是一个好习惯
# cd if you're still in the ``src`` directory with the ``ros_tutorials`` clone
cd ..
rosdep install -i --from-path src --rosdistro humble -y
#如果您已经具备了所有的依赖项,控制台会返回:
#All required rosdeps installed successfully
colcon build
执行结果如下图:
设置叠加层(overlay)
在设置叠加层之前,非常重要的一点是要打开一个新的终端,与构建工作空间的终端分开。在同一个终端中设置叠加层或在设置叠加层的终端中进行构建可能会导致复杂的问题。
在新的终端中,将你的主要ROS 2环境作为“underlay”来源化,这样你就可以在其“之上”构建叠加层(overlay):
source /opt/ros/humble/setup.bash
进入你的工作空间的根目录:
cd ~/ros2_ws
在根目录中,将你的叠加层源化:
source install/local_setup.bash
将
local_setup
的叠加层源化,只是把叠加层可用的软件包添加到您的环境中。setup
源同时包含覆盖层和创建它的底层,使您能够同时利用两个工作区。
修改覆盖层
你可以在覆盖层中单独修改和重建软件包,而不影响底层。
覆盖层优先于底层。
建议在处理少量包时使用覆盖层,这样您就不必将所有内容放在同一个工作空间中,并且不必在每次迭代中重新构建一个庞大的工作空间。
创建软件包
什么是ROS2软件包(package)
软件包(package)是ROS 2代码的组织单元。如果您希望能够安装代码或与他人共享代码,那么您需要将其组织成一个包。通过包,您可以发布ROS 2工作并允许其他人轻松构建和使用它。
ROS 2中的包创建使用ament作为构建系统和colcon作为构建工具。您可以使用CMake或Python创建一个包,这两种方式得到官方支持,尽管还存在其他构建类型。
一个ROS 2软件包包含什么
CMake
CMakeLists.txt
文件,描述了如何构建软件包内的代码- 包含该包的公共头文件的 include/<package_name> 目录
- 包含有关该包的元信息的 package.xml 文件
- 包含该包源代码的 src 目录
Python
- 包含有关该包的元信息的
package.xml
文件- 用于标记该包的
resource/<package_name>
文件- 当一个软件包包含可执行文件时,需要使用
setup.cfg
,以便ros2 run
能够找到它们setup.py
包含了安装该软件包的指令<package_name>
是与软件包同名的目录,被ROS 2工具用于查找软件包,包含__init__.py
工作空间中的软件包
一个工作空间可以包含任意多个软件包,每个软件包位于自己的文件夹中。您还可以在一个工作空间中拥有不同构建类型的软件包(如CMake、Python等)。但不能嵌套软件包。
最佳实践是在工作空间中创建一个src
文件夹,并在其中创建您的软件包。这样可以保持工作空间的顶层“清洁”。
在ROS 2中创建新包的命令语法如下:
CMake:
ros2 pkg create --build-type ament_python <package_name>
Python:
ros2 pkg create --build-type ament_python <package_name>
一个工作空间的目录结构通常如下图所示:
workspace_folder/
src/
cpp_package_1/
CMakeLists.txt
include/cpp_package_1/
package.xml
src/
py_package_1/
package.xml
resource/py_package_1
setup.cfg
setup.py
py_package_1/
...
cpp_package_n/
CMakeLists.txt
include/cpp_package_n/
package.xml
src/
构建软件包
进入工作目录,输入命令colcon build
或者加上参数只构建单独的一个包,把相关的包放到一个工作目录下的好处就是可以通过colcon build
命令在根目录下一次构建所有的包,也可以使用如下命令单独构建指定的包。
colcon build --packages-select feature_tracker
使用包
为了能使用新建的包和打开一个新的终端,导入底层环境,然后进入~/SLAM_ws目录执行source install/local_setup.bash
导入叠加层环境。然后使用ros2 run feature_tracker feature_tracker
执行包里的可执行程序。
自定义package.xml
使用cat命令查看package.xml内容如下:
在maintainer行写上名字和邮箱,在description行写上这个包的摘要,在license行写上该包遵循的规范。在license行下面的一些以“_depend”结尾的标签,列出来了对其他包的依赖,方便colcon来查找。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)