虽然可以通过
catkin_make -DCATKIN_WHITELIST_PACKAGES=""
单独编译更新包,但是一个工作空间有太多不同的东西很乱。同时,使用不同的目录管理,也可以自由切换ros环境,比如a和b的包会有冲突,工作时source不同的文件夹即可。
之前知道ros算是一个分布式的系统,当所有的workspace登陆在 ~/.bachrc后,记录在path里面的(就像matlab、visual studio 或者cmakelist、电脑系统变量的各种path)所有东西(包 消息 node scripts等)都可以找得到。
以下记录自己遇到的source和 catkin_workspace的一个细节问题
source作用
source 命令用于加载一个工作空间的 setup.bash 文件,其中包含了设置ROS环境所需的环境变量和路径。这会为ROS提供访问工作空间中的软件包、消息和其他资源所需的信息。 如果source了多个path,那么可以读取所有path内的信息,但!最后一个source的路径才是当前活动的working目录:
借用gpt老师的回答:
在ROS中,活动的工作空间指的是当前ROS环境中正在使用的主要工作空间。这意味着ROS将使用活动工作空间中的软件包和消息,以及其特定的配置设置。当你执行ROS命令时,它们将默认应用于活动工作空间。
活动工作空间通常由ROS环境中的一些关键变量指定,其中最常用的是CATKIN_WORKSPACE环境变量。当你加载一个工作空间的setup.bash文件时,它会将这个工作空间设置为当前活动的工作空间,除非你在同一终端中加载了另一个工作空间的setup.bash,这样后者将成为当前的活动工作空间。
当你在ROS中创建或构建软件包时,它们会被安装到当前活动工作空间中,除非你明确地指定安装到另一个工作空间。因此,活动工作空间在决定哪些软件包和消息在ROS中可用时起着关键作用。
理解当前活动的工作空间对于在ROS中管理多个工作空间以及确保正确加载和使用软件包和消息非常重要。
export CATKIN_WORKSPACE
export CATKIN_WORKSPACE 用于手动设置活动的工作空间。通过设置 CATKIN_WORKSPACE 环境变量,可以明确指定要将哪个工作空间设置为当前活动的工作空间。这对于在同一终端会话中切换工作空间或者在多个工作空间之间进行操作非常有用。
( PS:被注释的那一行是为了实现不同电脑登记在一个rosmaster操作 。ip是另一台电脑的。)
下图export在重新设置ros的workingspace,也就是source我只利用了他完成的是添加路径的作用,而自己在定义哪一个才是我的活动空间,否则会按照顺位取最后一个。
当你source全面了便可以跨工作空间调用其他空间的内容,如:
- 使用另一个workspace的msg
- 启master后使用所有source过path的node
这里实现成功之后我也找gpt老师确认了一下,以下贴用我和gpt的问答补充一下:
Q:ros中 我source了 a 和 b 两个工作空间, a空间编译了一些msg,b空间的package想使用a空间编译好的msg,那么只source过可不可以就不用在b的cmakelist的include中加入a的devel/include目录了?
ANS:在ROS中,当你通过 source 命令加载两个工作空间时,ROS会知道这两个工作空间,因此它将能够找到两个工作空间中的消息和软件包。这意味着你在b空间的CMakeLists.txt文件中不需要显式地包含a空间的devel/include目录,ROS会自动查找这些消息。
总结一下,调用本工作空间外的包或消息的办法:
- 使用cmakelist直接写路径
- 使用依赖项
find_package(catkin REQUIRED COMPONENTS
a
)
1 如果包 b 需要使用包 a 中的某个消息,可以在包 b 的CMakeLists.txt文件中将消息的包名添加到 find_package 和 catkin_package 部分,这将告诉ROS,包 b 需要依赖于包 a,并且ROS会自动找到包 a 中的消息类型,同时也在在xml加入
<build_depend>a</build_depend>
<exec_depend>a</exec_depend>
2 或者find_package 不加入a,依旧在include里面加入.h文件的地址也是可以的,就像正常的cmakelist一样对待就好。比如 WS/devel/include
视情况复杂与简单大家可以选择不同的方式。使用msg可以见我另一篇笔记。rosmsg的编译和使用
但是,这里依然要在对应使用的msg类型的地方加入msg生成的py或者.h文件,如我的截图