最近,我在使用网上的开源代码时候,作者使用的是Ubuntu18.04,melodic版本的ros1
但是我试了一下,使用 Ubuntu20.04,ros1 noetic版本也是可以实现的。
项目地址:
https://github.com/Geo-JTao/UR5_gripper_camera_gazebo
我把代码clone下来,然后编译,直接通过了。
我不太懂CmakeLists.txt作用到底是啥。
比如这里的是melodic路径,但是我noetic版本,没有这个路径,竟然编译的时候没有报错,直接成功。
问:cmakelists.txt中/opt/ros/melodic/share/catkin/cmake/toplevel.cmake是啥意思
在 CMakeLists.txt
文件中,/opt/ros/melodic/share/catkin/cmake/toplevel.cmake
是一个用于设置和管理 ROS 包构建的 CMake 文件路径,特别是在使用 ROS1 系统时,catkin
是一种构建工具,类似于传统的 cmake
。我们可以通过该路径来指定一些特定于 ROS 构建系统的行为。
详细解释:
-
路径解释:
/opt/ros/melodic/
:这是安装了 ROS Melodic 版本的系统路径。/opt/ros/
目录下存放了你安装的 ROS 各版本的文件和库。share/catkin/cmake/
:这是catkin
构建工具的 CMake 配置文件所在的目录,catkin
是 ROS1 默认的构建系统,cmake
目录包含了一些 ROS-specific 的 CMake 模块和脚本。toplevel.cmake
:这个文件是catkin
构建系统的一部分,通常用于在一个 ROS 工作空间的顶层目录中进行 CMake 配置。它的作用是为 ROS 包的构建过程设置一些全局配置和管理工具链。
-
作用:
toplevel.cmake
文件通常会在你构建 ROS 工作空间时由catkin_make
或catkin build
命令自动调用。这个文件的主要作用是:- 设置编译过程的基础环境。
- 配置一些与 ROS 相关的 CMake 变量和宏。
- 通过加载
catkin
的其他 CMake 模块,帮助 CMake 和 ROS 的其他工具协作完成包的编译和安装。
-
如何使用:
当你运行catkin_make
或catkin build
时,CMake 会使用工作空间中CMakeLists.txt
文件的指令来查找并加载toplevel.cmake
。在该文件中,catkin
会根据不同的参数和设置来确定如何构建包和依赖项。示例:
如果你在CMakeLists.txt
文件中引用了toplevel.cmake
,一般是为了确保这个文件被正确地调用。例如:find_package(catkin REQUIRED) include_directories(${catkin_INCLUDE_DIRS}) catkin_package()
这会自动包含
toplevel.cmake
文件中的所有设置,从而配置 ROS 构建系统所需的标准流程。
总结:
/opt/ros/melodic/share/catkin/cmake/toplevel.cmake
是 ROS Melodic 版本中用于支持 catkin
构建系统的 CMake 配置文件,它在构建过程中设置了 ROS 包的构建环境。它帮助 CMake 了解如何在 ROS 工作空间中正确地配置和构建包。
但是很奇怪,根本没有这个路径,因此,上面的所有内容,都实现不了。
问:那为什么我noetic版本的ros,也能使用这句话编译成功吗
这是因为 ROS 1 的 catkin
构建系统在不同的版本(如 Melodic、Noetic)之间基本保持了兼容性,尽管它们对应的是不同的 ROS 发行版本。具体来说,ROS Noetic 版本的 catkin
仍然继承了 Melodic 的构建工具和一些标准配置文件,因此即使你使用的是 Noetic
版本,仍然可以通过类似的方式(例如引用 /opt/ros/melodic/share/catkin/cmake/toplevel.cmake
)来完成编译。
解释原因:
-
ROS Noetic 与 Melodic 的兼容性:
ROS Noetic 是 ROS 1 的最后一个发行版,它基于 Ubuntu 20.04(Focal Fossa),而 ROS Melodic 基于 Ubuntu 18.04(Bionic)。尽管它们使用了不同的 Ubuntu 版本,但它们的catkin
构建系统在设计时保留了较好的向后兼容性,尤其是在 CMake 配置和构建方式上。因此,Noetic
和Melodic
使用的构建工具是相似的,catkin
的大部分基础设施和目录结构是一样的。 -
catkin
构建系统的兼容性:
catkin
是一个在 ROS 1 中广泛使用的构建系统,它负责组织和管理 ROS 包的构建过程。catkin
的配置文件和工作流程在不同版本之间并没有做大的改变,尤其是在 CMake 部分。ROS Noetic 仍然使用catkin
,并且大部分的配置文件路径(如/opt/ros/melodic/share/catkin/cmake/toplevel.cmake
)是被保留下来的,这就导致了即使你在 Noetic 中使用 Melodic 的路径,编译过程仍然能够成功执行。 -
catkin
配置文件的共享:
即使你在 ROS Noetic 中使用了 Melodic 的路径,例如toplevel.cmake
,这些配置文件和脚本仍然可以兼容。ROS 的 CMake 构建系统并没有对不同版本做出完全独立的调整,而是通过一些软链接或者配置保留了对老版本的支持。这意味着,Noetic 的catkin
构建系统可以在运行时找到Melodic
的一些配置文件,并根据它们进行构建。
关键点:
- 路径兼容性:虽然 ROS Melodic 和 Noetic 是不同版本,但它们都使用
catkin
构建系统,且大多数 CMake 配置文件和工具链保持了兼容性。 - 向后兼容性:
catkin
构建系统在 ROS 版本间的兼容性很强,尤其是在 CMake 配置方面。它设计时考虑到不同版本的兼容性,确保在构建时不容易出现因版本差异导致的问题。 - 默认工具链和配置:即使在 Noetic 中,某些 Melodic 的配置文件也可能被保留,或者路径指向的文件仍然是有效的。
总结:
在 ROS Noetic 中使用 Melodic
版本的路径进行编译成功,主要是因为 ROS 1 在不同版本之间的构建系统(catkin
)保持了较好的兼容性。因此,使用 Melodic 的构建配置路径在 Noetic 中也能找到相应的支持文件,并成功编译。
问:但是noetic版本根本找不到路径吧
你说得对,在 ROS Noetic 中,默认的路径应该指向的是 Noetic 版本的 catkin
工具和配置,而不是 Melodic 版本的路径。如果你尝试使用 /opt/ros/melodic/share/catkin/cmake/toplevel.cmake
这样的路径,在 Noetic 中确实应该无法找到该文件,因为路径指向的是 Melodic 的版本。
让我们来澄清一下可能出现的混淆并找出原因:
1. 不同版本的安装路径不同:
- ROS Melodic 和 Noetic 会分别安装在不同的目录下。ROS Melodic 通常安装在
/opt/ros/melodic/
下,而 ROS Noetic 安装在/opt/ros/noetic/
下。所以,Noetic 中的catkin
相关路径应该位于/opt/ros/noetic/share/catkin/
下,而不是 Melodic 的路径。 - 如果你在 Noetic 中尝试引用 Melodic 的路径,确实会出现找不到路径的问题。
2. ROS Noetic 里的 catkin
配置:
- 如果你在 ROS Noetic 中遇到类似的问题,应该查看
/opt/ros/noetic/share/catkin/cmake/
下的内容,而不是 Melodic 版本的路径。 - 一些可能的正确路径包括:
/opt/ros/noetic/share/catkin/cmake/toplevel.cmake
/opt/ros/noetic/share/catkin/cmake/catkinConfig.cmake
3. 解决方案:
- 确保你在使用 Noetic 时,所引用的路径是基于 Noetic 的。例如,尝试查找以下路径中的
catkin
文件:/opt/ros/noetic/share/catkin/cmake/toplevel.cmake
- 如果你之前复制了 Melodic 相关的路径到 Noetic 的工作环境中,那就需要进行更正,引用适合当前版本的配置文件。
4. 如何检查路径:
如果你不确定正确的路径,可以通过以下方式检查:
- 执行
roscd catkin
查看当前 ROS 环境中catkin
的实际路径。 - 执行
ls /opt/ros/noetic/share/catkin/cmake/
查看 Noetic 中的实际 CMake 配置文件。
最后
最后就是,我改了路径
然后重新 编译了一下,也是能够成功的。