在本篇文章中,我们来尽可能详细地深入探讨 catkin config 的使用方法。这是掌握 catkin_tools 工作流的关键,能极大地提升你的开发效率和项目的规范性。

catkin config 的核心思想

首先,要理解它的核心思想:为你的 Catkin 工作空间创建一个持久化的、可被版本控制的配置

在没有 catkin_tools 的年代(使用 catkin_make),如果你想给编译过程传递一个参数,比如开启优化,你必须每次都这样写:

# 每次编译都要写,很麻烦
catkin_make -DCMAKE_BUILD_TYPE=Release

如果你忘了写,那这次编译就不是 Release 模式了。这非常繁琐且容易出错。

catkin config 就是为了解决这个问题。你用 catkin config 设置一次,这个配置就会被保存下来,之后每一次运行 catkin build 都会自动使用这个配置,直到你再次修改它。


配置是如何存储的?

当你第一次在工作空间运行 catkin initcatkin config 时,它会在你的工作空间根目录下创建一个隐藏文件夹 .catkin_tools。所有的配置信息都以 YAML 文件的形式存储在这里面,通常是:

<your_ws>/.catkin_tools/profiles/default/config.yaml

default 是默认的配置文件名。你可以把它理解为“当前激活的配置”。

你通常不应该手动编辑这个 YAML 文件,而是通过 catkin config 命令来安全地修改它。


catkin config 的常用操作

1. 查看当前配置

这是最基本的操作。想知道当前工作空间都设置了些什么?

# 显示当前激活配置的详细信息
catkin config# 或者使用更简洁的别名
catkin config -l

示例输出:

这个输出告诉你:

  • 当前用的是 default 配置。
  • 工作空间继承自 ROS 的主环境 /opt/ros/noetic
  • 各个目录(build, devel 等)的位置。
  • 最重要的:
    • CMake 参数 (CMAKE_ARGS): 编译时会传递 -DCMAKE_BUILD_TYPE=RelWithDebInfo 给 CMake。
    • Make 参数 (MAKE_ARGS): 编译时会使用 make -j32,即 32 线程并行编译。
2. 设置/修改配置项

这是最核心的用法。

A. 设置 CMake 参数 (--cmake-args)

这是最常用的功能,用来向 CMake 传递 -D 开头的变量。

  • 设置编译类型为 Release (开启优化,去除调试信息)

    catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release
    

    运行后,再 catkin config -l 看看,CMAKE_ARGS 就变了。现在每次 catkin build 都会是优化过的版本。

  • 设置编译类型为 Debug (包含调试信息,方便 GDB 调试)

    catkin config --cmake-args -DCMAKE_BUILD_TYPE=Debug
    
  • 添加多个 CMake 参数

    catkin config --cmake-args -DCMAKE_BUILD_TYPE=Debug -DOTHER_VAR=True
    
  • 在现有参数基础上追加 (Append)
    假设你已经设置了 Debug 模式,现在想再加一个参数,但不想覆盖掉原来的。

    catkin config --append-args -DNEW_FLAG=ON
    

    注意: 如果不加 --append-args,新的设置会覆盖掉所有旧的 CMAKE_ARGS

B. 设置 Make 参数 (--make-args)

用来控制 make 命令本身的行为。

  • 设置并行编译的线程数
    # 使用 8 个线程编译
    catkin config --make-args -j8
    # 使用与 CPU 核心数相同的线程数,并保留 2 个核心空闲
    catkin config --make-args -j$(nproc) -l$(nproc)
    

C. 设置安装目录 (--install)

默认情况下,catkin build 只会生成 devel 空间。如果你想生成一个可以被部署到其他机器上的 install 空间(类似于 /opt/ros/noetic 的结构),你需要开启安装选项。

# 开启安装功能,产物会出现在 <ws>/install 目录
catkin config --install

D. 拉黑/白名单包 (--blacklist / --whitelist)

如果你的 src 目录里有些包你暂时不想编译它,可以拉黑。

# 编译时忽略 my_buggy_pkg 和 another_pkg
catkin config --blacklist my_buggy_pkg another_pkg

反之,也可以只编译白名单里的包。

3. 清除配置
  • 清除所有 CMake 参数
    catkin config --cmake-args ""
    
  • 清除所有配置,恢复到初始状态
    catkin config --clear-all
    

杀手级功能:配置文件 (Profiles)

这是 catkin_tools 最强大的功能之一。你可以为不同的场景创建不同的配置集,并随时切换。

最常见的场景:调试 (Debug) vs. 发布 (Release)

工作流示例:

  1. 查看当前有的 Profiles

    catkin profile list
    # 输出可能只有:
    # default (active)
    
  2. 创建新的 Profiles

    # 创建一个叫 'debug' 的 profile
    catkin profile add debug# 创建一个叫 'release' 的 profile
    catkin profile add release
    
  3. 分别为不同的 Profile 设置配置

    • 配置 release Profile:
      # 注意 --profile release 参数
      catkin config --profile release --cmake-args -DCMAKE_BUILD_TYPE=Release
      
    • 配置 debug Profile:
      catkin config --profile debug --cmake-args -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-O0 -g"
      
      这里我们还额外加了 C++ 编译器的标志,-O0 关闭优化,-g 生成调试符号。
  4. 在 Profiles 之间切换

    • 激活 release Profile:

      catkin profile set release
      

      现在,你再运行 catkin config -l,看到的就是 release 的配置了。此时运行 catkin build 就会编译出优化版本。

    • 激活 debug Profile:

      catkin profile set debug
      

      现在运行 catkin build 就会编译出带调试符号的版本,可以用 GDB 来调试。

  5. 临时使用某个 Profile 进行构建
    你也可以不切换全局激活的 Profile,只在本次构建时临时使用。

    catkin build --profile debug
    

最佳实践和注意事项

  1. cleanbuild:当你切换了影响编译结果的核心配置(尤其是 CMAKE_BUILD_TYPE)后,最好先运行 catkin cleancatkin clean <package_name> 来清除旧的编译产物,然后再运行 catkin build,以确保新的配置被完全应用。

  2. 充分利用 Profiles:为不同的任务(调试、发布、测试)建立不同的 Profile,这是一个非常好的习惯,能让你的工作流非常清晰和高效。

  3. 定期检查:时不时用 catkin config -l 检查一下当前的配置,确保它符合你的预期。

  4. 将配置纳入版本控制.catkin_tools 目录可以被 Git 等版本控制工具管理起来。这样,团队里的每个成员 clone 仓库后,就可以使用完全相同的构建配置,保证了环境的一致性。

通过熟练使用 catkin configcatkin profile,你可以像专业开发者一样,精确、高效地管理你的 ROS 项目构建过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92301.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92301.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/92301.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu挂载和取消挂载

在 Ubuntu 中&#xff0c;挂载&#xff08;Mount&#xff09;和取消挂载&#xff08;Unmount&#xff09;是管理存储设备&#xff08;如硬盘、U盘、ISO镜像等&#xff09;的常见操作。以下是详细指南&#xff1a;1. 挂载&#xff08;Mount&#xff09; 1.1 查看可用存储设备 ls…

Vue开发常用库(含npm安装命令)

Vue开发常用库&#xff08;含npm安装命令&#xff09; 核心生态系统&#xff1a;Vue Router - 官方路由管理器 npm install vue-router4 # Vue 3 npm install vue-router3 # Vue 2Pinia - 新一代状态管理库 npm install piniaVuex - 传统状态管理库 npm install vuexnext …

[硬件电路-39]:激光光路的光信号处理、模拟电路的电信号处理、数字电路的电信号处理、软件的信号处理,有哪些共通的操作、运算、变换?

激光光路、模拟电路、数字电路及软件中的信号处理在操作、运算和变换层面存在显著共性&#xff0c;这些共性体现了信号处理的核心逻辑在不同技术领域的通用性。以下是具体分析&#xff1a; 目录 一、共通操作&#xff1a;信号处理的基础动作 1、放大与衰减 2、滤波 3、调制…

Grails(Groovy)框架抛出NoHandlerFoundException而不是返回404 Not Found

本文记录在基于Spring(Boot)框架&#xff08;使用Java语言&#xff09;和Grails框架&#xff08;使用Groovy语言&#xff09;下&#xff0c;开发Controller接口&#xff0c;对不存在的URL请求&#xff0c;接口返回404 not found&#xff0c;而不是抛出NoHandlerFoundException异…

muduo中事件循环线程池的理解

事件循环线程池的理解前置知识reactor模型thread::start()方法的理解创建线程池子线程被唤醒的几种情况子线程被主线程唤醒新连接到来有消息需要发送时&#xff08;多reactor情况时&#xff09;关闭连接时子线程被唤醒执行任务在 上一篇中&#xff0c;我们讨论了关于简单的线程…

AI智能体“上下文工程”实践:来自 Manus 项目的经验总结

转载&#xff1a;https://manus.im/blog/Context-Engineering-for-AI-Agents-Lessons-from-Building-Manus 在启动 Manus (manus.im/app) 项目之初&#xff0c;我的团队面临一个关键抉择&#xff1a;究竟是基于开源基础模型训练一个端到端的智能体模型&#xff0c;还是在前沿大…

day19 链表

定义链式存储的线性表头文件相关定义 typedef int datatype;//定义数据域类型 typedef struct Node {union{int len; //头结点数据域datatype data; //普通节点数据域};struct Node *next; //节点指针域 }Node,*Node_ptr;链表的函数 注意事项 1.创建节点时&#xff0c;需要初…

【第三节】Class与Style绑定

文章目录Class与Style绑定绑定HTML Class对象语法数组语法绑定内联样式对象语法数组语法自动添加前缀Class与Style绑定 数据绑定一个常见需求是操作元素的 class 列表和它的内联样式,因为它们都是属性&#xff0c;我们可以用 v-bind 处理它们:我们只需要计算出表达式最终的字符…

CMOS知识点 离子注入工艺

知识点8&#xff1a;离子注入是为了将掺杂剂&#xff08;如硼、磷等&#xff09;精确引入硅晶片的近表面区域&#xff0c;以改变其电学性质。工艺过程&#xff1a;电离与加速&#xff1a;掺杂剂原子在离子源中被电离&#xff08;带电&#xff09;&#xff0c;通过高压电场&…

从安装到上手:Ubuntu 22.04 玩转 Containerd 2.1.3 容器运行时

Containerd 是一款支持 OCI 规范的容器运行时&#xff0c;注重容器部署和生命周期管理的简单性、健壮性与可移植性&#xff0c;常被嵌入到 Docker 和 Kubernetes 等系统中。本文将详细介绍在 Ubuntu 22.04 服务器上通过二进制包手动安装 Containerd 的完整步骤&#xff0c;包括…

Hadoop与云原生集成:弹性扩缩容与OSS存储分离架构深度解析

Hadoop与云原生集成的必要性Hadoop在大数据领域的基石地位作为大数据处理领域的奠基性技术&#xff0c;Hadoop自2006年诞生以来已形成包含HDFS、YARN、MapReduce三大核心组件的完整生态体系。根据CSDN技术社区的分析报告&#xff0c;全球超过75%的《财富》500强企业仍在使用Had…

飞算科技:以创新科技引领数字化变革,旗下飞算 JavaAI 成开发利器

作为国家级高新技术企业&#xff0c;飞算科技专注于自主创新&#xff0c;在数字科技领域持续深耕&#xff0c;用前沿技术为各行业客户赋能&#xff0c;助力其实现数字化转型升级的飞跃。​飞算科技凭借深厚的技术积累&#xff0c;将互联网科技、大数据、人工智能等技术与实际应…

多线程Python爬虫:加速大规模学术文献采集

1. 引言 在学术研究过程中&#xff0c;高效获取大量文献数据是许多科研工作者和数据分析师的需求。然而&#xff0c;传统的单线程爬虫在面对大规模数据采集时&#xff0c;往往效率低下&#xff0c;难以满足快速获取数据的要求。因此&#xff0c;利用多线程技术优化Python爬虫&a…

NX717NX720美光固态闪存NX724NX728

美光NX系列固态闪存深度解析&#xff1a;技术、性能与市场洞察一、技术架构与核心创新美光NX系列固态闪存&#xff08;包括NX717、NX720、NX724、NX728&#xff09;的技术根基源于其先进的G9 NAND架构。该架构通过5纳米制程工艺和多层3D堆叠技术&#xff0c;实现了存储单元密度…

浅谈——C++和C#差异

虽然这个话题看着似乎有些关公战秦琼的味道&#xff0c;但是作为游戏开发者&#xff0c;C和C#一定是绕不开的两门语言。不过虽然说是比较二者差异&#xff0c;因为我学习的过程主要是先学C&#xff0c;所以我先基于C的认知&#xff0c;再来聊聊C#之中的不同。&#xff08;为什么…

rocky9-zabbix简单部署

目录 一、准备 1、&#xff08;rocky9&#xff09; 2、配置数据库 二、配置文件 1、导入初始架构与数据 2、配置相关文件 三、启动服务 1、浏览器访问 2、解决乱码问题 ​编辑 四、监控 ① 添加主机 1、修改配置文件 2、启动服务 3、网页添加 ②添加监控模块 1…

tabBar设置底部菜单选项、iconfont图标(图片)库、模拟京东app的底部导航栏

欢迎来到我的UniApp技术专栏&#xff01;&#x1f389; 在这里&#xff0c;我将与大家分享关于UniApp开发的实用技巧、最佳实践和项目经验。 专栏特色&#xff1a; &#x1f4f1; 跨平台开发一站式解决方案 &#x1f680; 从入门到精通的完整学习路径 &#x1f4a1; 实战项目经…

7.22总结mstp,vrrp

一、MSTP技术&#xfeff;&#xfeff;MSTI和MSTI域根&#xfeff;&#xfeff;MSTP中的端口角色3. MSTP工作原理 MSTP 计算方法• CST/IST的计算和RSTP类似 • MSTI的计算仅限于区域内 • MSTI计算参数包含在IST BPDU中&#xff0c;和IST的计 算同步完成&#xfeff;&#xfe…

【电脑】网卡的基础知识

网卡&#xff08;Network Interface Card, NIC&#xff09;是计算机中用于连接网络的关键组件之一&#xff0c;它负责管理和发送数据包到互联网或其他局域网设备。下面是一些关于网卡的详细知识&#xff1a;网卡的基本结构MAC地址&#xff1a;每个网卡都有一个唯一的物理地址&a…

IPv4枯竭时代:从NAT技术到IPv6的演进之路

&#x1f50d; 开发者资源导航 &#x1f50d;&#x1f3f7;️ 博客主页&#xff1a; 个人主页&#x1f4da; 专栏订阅&#xff1a; JavaEE全栈专栏 IPv4&#xff08;Internet Protocol version 4&#xff09;是互联网最核心的通信协议之一&#xff0c;自 1981 年正式标准化以来…