ROS课程讲义--2.1 Catkin编译系统

本文深入探讨了Catkin编译系统,它是ROS平台中用于软件包管理和编译的工具,基于CMake并进行了扩展。文章详细介绍了Catkin的特点、工作原理及编译流程,对比了其与早期rosbuild系统的优劣。

Catkin编译系统

2.1 Catkin编译系统

对于源代码包,我们只有编译才能在系统上运行。而Linux下的编译器有gcc、g++,随着源文件的增加,直接用gcc/g++命令的方式显得效率低下,人们开始用Makefile来进行编译。然而随着工程体量的增大,Makefile也不能满足需求,于是便出现了Cmake工具。CMake是对make工具的生成器,是更高层的工具,它简化了编译构建过程,能够管理大型项目,具有良好的扩展性。对于ROS这样大体量的平台来说,就采用的是CMake,并且ROS对CMake进行了扩展,于是便有了Catkin编译系统。

早期的ROS编译系统是rosbuild,但随着ROS的不断发展,rosbuild逐渐暴露出许多缺点,不能很好满足系统需要。在Groovy版本面世后,Catkin作为rosbuild的替代品被正式投入使用。Catkin操作更加简化且工作效率更高,可移植性更好,而且支持交叉编译和更加合理的功能包分配。目前的ROS同时支持着rosbuild和Catkin两种编译系统,但ROS的核心软件包也已经全部转换为Catkin。rosbuild已经被逐步淘汰,所以建议初学者直接上手Catkin。

本节我们主要来介绍catkin的编译系统。

2.1.1 Catkin特点

Catkin是基于CMake的编译构建系统,具有以下特点:

  • Catkin沿用了包管理的传统像 find_package()基础结构,pkg-config
  • 扩展了CMake,例如
    • 软件包编译后无需安装就可使用
    • 自动生成find_package()代码,pkg-config文件
    • 解决了多个软件包构建顺序问题

一个Catkin的软件包(package)必须要包括两个文件:

  • package.xml: 包括了package的描述信息

    • name, description, version, maintainer(s), license
    • opt. authors, url's, dependencies, plugins, etc...
  • CMakeLists.txt: 构建package所需的CMake文件

    • 调用Catkin的函数/宏
    • 解析package.xml
    • 找到其他依赖的catkin软件包
    • 将本软件包添加到环境变量

2.1.2 Catkin工作原理

catkin编译的工作流程如下:

  1. 首先在工作空间catkin_ws/src/下递归的查找其中每一个ROS的package。
  2. package中会有package.xmlCMakeLists.txt文件,Catkin(CMake)编译系统依据CMakeLists.txt文件,从而生成makefiles(放在catkin_ws/build/)。
  3. 然后make刚刚生成的makefiles等文件,编译链接生成可执行文件(放在catkin_ws/devel)。

也就是说,Catkin就是将cmakemake指令做了一个封装从而完成整个编译过程的工具。catkin有比较突出的优点,主要是:

  • 操作更加简单
  • 一次配置,多次使用
  • 跨依赖项目编译

2.1.3 使用catkin_make进行编译

要用catkin编译一个工程或软件包,只需要用catkin_make指令。一般当我们写完代码,执行一次catkin_make进行编译,调用系统自动完成编译和链接过程,构建生成目标文件。编译的一般性流程如下,在1.5节我们编译ROS-Academy-for-Beginners教学包就是这样的流程。

$ cd ~/catkin_ws #回到工作空间,catkin_make必须在工作空间下执行
$ catkin_make    #开始编译
$ source ~/catkin_ws/devel/setup.bash #刷新坏境

注意: catkin编译之前需要回到工作空间目录,catkin_make在其他路径下编译不会成功。编译完成后,如果有新的目标文件产生(原来没有),那么一般紧跟着要source刷新环境,使得系统能够找到刚才编译生成的ROS可执行文件。这个细节比较容易遗漏,致使后面出现可执行文件无法打开等错误。

catkin_make命令也有一些可选参数,例如:

catkin_make [args]
  -h, --help            帮助信息
  -C DIRECTORY, --directory DIRECTORY
                        工作空间的路径 (默认为 '.')
  --source SOURCE       src的路径 (默认为'workspace_base/src')
  --build BUILD         build的路径 (默认为'workspace_base/build')
  --use-ninja           用ninja取代make
  --use-nmake           用nmake取'make
  --force-cmake         强制cmake,即使已经cmake过
  --no-color            禁止彩色输出(只对catkin_make和CMake生效)
  --pkg PKG [PKG ...]   只对某个PKG进行make
  --only-pkg-with-deps  ONLY_PKG_WITH_DEPS [ONLY_PKG_WITH_DEPS ...]
                        将指定的package列入白名单CATKIN_WHITELIST_PACKAGES,
                        之编译白名单里的package。该环境变量存在于CMakeCache.txt。
  --cmake-args [CMAKE_ARGS [CMAKE_ARGS ...]]
                        传给CMake的参数
  --make-args [MAKE_ARGS [MAKE_ARGS ...]]
                        传给Make的参数
  --override-build-tool-check
                        用来覆盖由于不同编译工具产生的错误
<think>我们正在讨论的是ROS Kinetic环境中出现的包定位错误。用户之前遇到了`E: Unable to locate package ros-kinetic-usb-cam`,现在又遇到了类似的`E: Unable to locate package ros-kinetic-catkin`错误。根据引用[^1]中的信息,用户尝试了从源码构建usb_cam包,但现在的问题是关于catkin包找不到。 注意:在ROS中,`catkin`是构建工具,通常作为核心包安装。因此,出现找不到`ros-kinetic-catkin`包的情况可能是因为ROS环境没有正确安装,或者软件源没有设置正确。 解决步骤: 1. **确认ROS安装**:确保已经正确安装了ROS Kinetic桌面完整版。如果还没有安装,可以参考官方安装步骤。 2. **更新软件源**:运行以下命令更新软件源列表: ```bash sudo apt update ``` 3. **安装`ros-kinetic-catkin`**:尝试使用apt安装: ```bash sudo apt install ros-kinetic-catkin ``` 4. **如果上述步骤仍然无法找到包,检查软件源**: 确保软件源包含了ROS的仓库。检查`/etc/apt/sources.list.d/`目录下是否有ROS的源文件(如`ros-latest.list`)。 如果没有,可以添加ROS官方软件源: ```bash sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' ``` 5. **添加秘钥**: ```bash sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 ``` 6. **再次更新并安装**: ```bash sudo apt update sudo apt install ros-kinetic-catkin ``` 7. **环境设置**:如果安装成功,记得设置环境变量,通常通过`source /opt/ros/kinetic/setup.bash`,也可以将其添加到`~/.bashrc`中。 注意:用户之前尝试过从源码构建一个包,但catkin是基础构建工具,通常不需要从源码构建。 如果用户在安装ROS时已经选择了桌面完整版(`ros-kinetic-desktop-full`),那么catkin应该已经包含在内。所以,出现这个错误可能是因为ROS没有完整安装或者软件源配置问题。 因此,核心步骤是检查软件源和重新安装catkin包。 生成相关问题: 1. 如何安装ROS Kinetic桌面完整版? 2. 如何解决ROS软件源配置问题? 3. 为什么在安装ROS包时会出现“Unable to locate package”错误? </think>### 解决 `E: Unable to locate package ros-kinetic-catkin` 错误的方法 该错误表明系统无法在软件源中找到 `ros-kinetic-catkin` 包。以下是系统性的解决步骤: --- #### **1. 确认ROS软件源配置(关键步骤)** ```bash sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' ``` - 添加ROS官方软件源,其中 `$(lsb_release -sc)` 会自动匹配当前Ubuntu版本(如Xenial对应Kinetic)[^1] - 验证文件内容: ```bash cat /etc/apt/sources.list.d/ros-latest.list ``` #### **2. 添加并更新APT密钥** ```bash sudo apt install curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update # 刷新软件包索引 ``` #### **3. 安装基础依赖包** ```bash sudo apt install build-essential python-rosdep python-catkin-tools sudo rosdep init rosdep update ``` #### **4. 重新安装`catkin`** ```bash sudo apt install ros-kinetic-catkin # 核心安装命令 ``` #### **5. 验证安装** ```bash source /opt/ros/kinetic/setup.bash which catkin_make # 应返回路径如:/opt/ros/kinetic/bin/catkin_make ``` --- ### 常见问题排查 1. **Ubuntu版本不匹配** - Kinetic仅支持Ubuntu 16.04 (Xenial) - 检查版本:`lsb_release -a` 2. **软件源缓存未更新** 执行 `sudo apt update` 后观察是否有 `packages.ros.org` 的更新记录 3. **网络问题** 测试连接性: ```bash ping packages.ros.org ``` 4. **包已被替代** 尝试安装替代包: ```bash sudo apt install python3-catkin-tools # 适用于新版本ROS ``` --- ### 相关问题 1. 如何修复 `sudo rosdep init` 失败错误? 2. Ubuntu 20.04 中如何安装ROS Noetic? 3. `catkin_make` 和 `colcon build` 有何区别? [^1]: 引用自用户提供的软件源配置流程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值