jjzjj

ROS2 编译入门

冰·点 2024-03-26 原文

前言

ROS2 相比较于 ROS1 在编译方式上比较类似,但是在内部功能实现上却发生了很大的改变,比如构建工具从 catkin_make 更换为了 colcon, 在构建的选择上更加灵活,更容易集成更多的工具,甚至兼容非 ROS package 的工程构建。基础的 cmake 升级为了基于 cmake 封装的 ament_cmake, 为开发者减少了更多的繁琐的 cmake 配置,使开发者能够更好专注于代码的开发。这里介绍 ROS2 编译的几个关键步骤以及涉及到的几个关键的 package, 使得大家能够全面的了解到 ROS2 的整个编译系统是怎么工作的。


一、ROS2 编译流程

ROS2 编译流程与 ROS1 基本一致,ros_buildfarm 工作的流程也与这个基本类似,只是实现比较复杂,核心的流程如下图所示:

如上图所示,整个流程可以概括为几个步骤:

  1. 安装 ros package 编译及运行依赖
  2. 编译
  3. 打包及安装(可选)

接下来的章节会讲解每个模块的作用以及各部分与 ros package 是怎样衔接起来的。

二、关键工具详解

1. colcon

colcon 是 ROS2 编译,测试等主要的工具,使用方式延续了 ROS1 的风格,降低了切换后的上手难度,同样,ROS2 的工作空间推荐与 ROS1 保持一样的目录结构:

<workspace>
├── build        # 编译时自动生成,包含编译的中间文件
├── install      # 编译时自动生成,包含编译的结果:可执行文件,库文件,message 头文件等
├── log          # 编译时的日志,方便在编译失败时查找问题(ros2 新增)
└── src
	├── ros_package1  # 开发者的代码
	├── ros_package2
	├── ros_package3
    ......

注意执行 colcon 命令需要在 workspace 目录,因为默认生成的 build,install,log 文件夹会与 colcon 执行文件夹保持同级,这一点是与 ROS1 不同的

colcon 最常用的有以下几个命令:

  1. colcon build
    这个是最基本命令,默认是选用 ninja 作为构建方式并且使用 8线程 进行代码的编译。 编译的结果在install文件夹中是以 package 为单位存放的,这个与 catkin_make_isolated 作用类似。

  2. colcon build --merge-install
    这个与 catkin_make 功能一样,是将编译的结果进行合并安装,比如头文件都放在 install/include 目录下, 库文件都放在 install/lib 文件夹下等。

  3. colcon build --symlink-install
    将编译的结果以软链接的方式进行安装,这个在程序开发的过程中非常实用。比如如果是 python 的 ros package, 后续将不需要再重新 colcon build, 直接修改源码就可以再次运行,加快了开发的效率。同样对于 C++ 工程而言,如果你是修改 rclcpp 或者系统中已经安装的同名的文件包的话,在编译时搜寻的头文件将是自己 workspace 下的,而不是系统目录下的头文件(/opt/ros/xx/include),这点与 ROS1 中的 catkin_make 中的 devel 开发方式保持一致。

  4. colcon build --packages-select <package_name1, package_name2...>
    编译指定的 ros package, 类似于 ROS1 的白名单的功能。

  5. colcon build --packages-ignore <package_name1, package_name2...>
    忽略编译指定的 ros package。同样也可以在 ros_package 目录下创建 COLCON_IGNORE 空文件以忽略编译。

  6. colcon build --cmake-args -Dxxx
    在编译的时候指定特定的 cmake 变量的值。

  7. colcon build --parallel-workers
    在编译的时候指定同时编译的最大线程数,默认为 8,对于性能好的机器来说,可以适当的增加这个值来加快编译速度。

2. rosdep

rosdep是 ROS 软件包依赖管理的命令行工具,可以为开发人员在编译,部署时解决开发的软件包编译及运行依赖的问题,最常见的就是解决 xxxConfig.cmake not found 的问题。
rosdep 的工作步骤一般如下:

  1. rosdep init
    初始化远程服务器的地址

  2. rosdep update
    将 ros package 的依赖关系缓存在本地

  3. rosdep install --from-paths src --ignore-src src -y
    通过查询每一个 ros_package 下的 package.xml 文件中的值来确定要下载的依赖包并进行安装

例如:在 ROS2 代码示例 examplesrclcpp/topics/minimal_publisher 这个目录下的 package.xml

  <build_depend>rclcpp</build_depend>
  <build_depend>std_msgs</build_depend>
  <exec_depend>rclcpp</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

rosdep 会读取 xxx_depend 中的值来判断本地是否存在相应的依赖,如果没有的话,rosdep 会选择合适的方式去下载依赖文件。

3. rosdistro

rosdistro 可以理解为一个简单的数据库,里面存储了 ros package 的依赖关系,目前在 github 上以 git 仓库的方式维护,在 rosdep update 的时候会将里面的信息缓存在本地,所以在网速不好的情况下,可以将这个仓库镜像到本地以提高 rosdep update 的速度。

另外,在自己开发的过程中往往会有自己创建的 ros 软件包,这些软件包可能不在 rosdistro 的维护列表内,这样可能会在 rosdep install 的时候出现解析不到正确的依赖而失败,这个时候一个可行的解决办法是将自己的软件包添加到 rosdistro 仓库中已解决 rosdep install 的问题。

一个简单的例子如下:

  1. /etc/ros/rosdep/sources.list.d/目录下添加一个名为 50-my-default.list 的文件
  2. 50-my-default.list 添加以下内容
yaml file:///home/user/.ros/rosdep.yaml
  1. 然后在 2 中所指向的目录创建 rosdep.yaml 文件, 并写入以下内容
rosdep_name:  # 自己定义的软件包的名字
  ubuntu:     # 发行版系统类型
    apt:      # 下载方式 apt, pip 等
      packages: [ debian-package-name, other-debian-package-name] # 依赖 deb 包的名字

详细的 rosdep_yaml 可以参考 http://docs.ros.org/en/independent/api/rosdep/html/rosdep_yaml_format.html

4. bloom

bloom 是一个打包工具,可以将代码制作成 deb, rpm 包,方便的安装到目标机器上进行测试,避免了直接拷贝文件带来的操作繁琐,容易出错的问题,一般情况下 bloom 是不随 ROS2 基础包一并安装的,bloom 的安装方式如下:

sudo apt-get install python3-bloom fakeroot

bloom 的工作方式:

  1. 读取 ros package 中的 CMakeLists.txt 的 install 确定安装位置
  2. 读取 ros package 中的 package.xml 文件确定版本号及依赖项
  3. 基于以上信息进行软件的打包

参考操作命令:

cd <ros package 的目录下>
bloom-generate rosdebian --os-name <系统名字> --ros-distro <ros版本名字>
fakeroot debian/rules binary

文章及代码参考

ROS2: https://docs.ros.org/en/humble/index.html#
colcon: https://colcon.readthedocs.io/en/released/index.html
rosdep: https://github.com/ros-infrastructure/rosdep.git
rosdistro: https://github.com/ros/rosdistro.git
bloom: https://github.com/ros-infrastructure/bloom.git

有关ROS2 编译入门的更多相关文章

  1. ruby - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  4. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  5. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  6. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  7. .net - 是否有 Ruby .NET 编译器? - 2

    是否有适用于Ruby语言的.NETFramework编译器?我听说过DLR(动态语言运行时),这是否将使Ruby能够用于.NET开发? 最佳答案 IronRuby是Microsoft支持的项目,建立在动态语言运行时之上。 关于.net-是否有Ruby.NET编译器?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/199638/

  8. python - 使用 Python、Ruby 和 Perl 重新编译 MacPort 版本的 MacVim - 2

    关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭10年前。ImprovethisquestionLinux专家正在转向Mac(10.8)。因为我懒...我使用MacPorts安装MacVim。它似乎安装没有错误。我只需要mvim中的python、ruby和perl支持。$/opt/local/bin/mvim--version|egrep'patches|python|ruby|perl'Includedpatches:1-244,246-646+multi_lang-mzscheme+

  9. ruby - 为什么 `middleman serve` 有效,但是 `middleman build` 编译这个 Sass 失败? - 2

    当我刚刚运行middleman时服务,all.css编译得很好,只包含对+box-shadow(none)的调用:/*line1,/home/yang/asdf/source/stylesheets/content.css.sass*/div{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}但是当我构建网站时,我得到了这个Sass/Compass错误:$middlemanbuildSlim::EmbeddedEngineisdeprecated,itiscalledSlim::EmbeddedinSlim2.0

  10. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

随机推荐