ROS2,为什么launch了以后,加载的rviz文件还是默认的初始rviz格式,没有成功读取我自己的rviz格式文件呢?

提问

ROS2,Rviz2,launch.py文件中,我希望能够加载我的rviz格式文件。首先我拼接rviz格式文件所在路径,关键代码:

rviz_config_dir = os.path.join(pkg_share, 'launch', 'test_follow_rudder.rviz')

然后,我在return launch.LaunchDescription中添加下面的节点来运行rviz2:

# rviz,
launch_ros.actions.Node(
    package='rviz2',
    executable='rviz2',
    name='rviz2',
    arguments=['-d', rviz_config_dir],
    parameters=[{'use_sim_time': use_sim_time}],
    output='screen'
),

然后我编译并source。然而为什么launch了以后,加载的rviz还是默认的起始rviz格式,没有成功读取我自己的rviz格式文件呢?

回答

继续提问

是不是launch以后,实际上读取的是intall里面编译形成的文件,包括rviz格式文件,而不是直接读取功能包里面的launch文件夹下的rviz格式文件?

回答

是的,你理解得完全正确:


✅ ROS2 launch.py 文件中加载 .rviz 配置文件时:

➤ 实际读取的是 install 路径下的文件,而不是你源码包 (src//launch/) 里的 .rviz 文件!


原因解析:

ROS2 的 launch 系统运行时是基于“安装后运行”的模型,也就是说:

  • 当你运行 ros2 launch .py 时,
  • 它会从 install//share//launch/ 目录中读取 .py 文件,
  • 因此在 .launch.py 中拼接的路径 os.path.join(pkg_share, 'launch', 'test_follow_rudder.rviz') 也是指向 install 路径下的 .rviz 文件

继续提问

为什么我执行了:

colcon build --packages-select your_package
. install/setup.bash

但是我在/home/usv-6081/ros2_usv_ws/install/control_planner/share/control_planner/launch里面仍然看不到test_follow_rudder.rviz?

回答

你在执行了 colcon build --packages-select control_plannersource install/setup.bash 后仍然看不到 .rviz 文件被安装到 install/.../launch 目录,这通常说明有以下问题之一:


✅ 1. setup.py 中的 data_files 是否包含了 .rviz 文件?

确认你有如下内容:

from glob import glob
import os

package_name = 'control_planner'

setup(
    ...
    data_files=[
        ('share/ament_index/resource_index/packages',
         ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
        (os.path.join('share', package_name, 'launch'), glob('launch/*')),
    ],
    ...
)

重点检查: glob('launch/*') 是否包含你的 .rviz 文件。你可以在 Python shell 测试:

from glob import glob
print(glob('launch/*'))

确认其中有 launch/test_follow_rudder.rviz


✅ 2. .rviz 文件是否真的存在于 launch/ 目录中?

你可以执行:

ls launch/

确认 test_follow_rudder.rviz 就在 launch/ 下。


✅ 3. 编译后缓存没有更新?

可以尝试 清理缓存 并重新构建:

colcon build --packages-select control_planner --cmake-clean-cache
. install/setup.bash

即使是纯 Python 包,添加 --cmake-clean-cache 也有助于触发重新处理 data_files


✅ 4. install/ 目录结构验证

确认 .rviz 没有被安装到其他路径,你可以执行:

find install/control_planner -name '*.rviz'

看看 .rviz 是否被错误安装到别的地方或根本没有复制。


如果你愿意贴出你的 setup.py 内容,我可以直接帮你检查是否漏了什么配置。

继续提问

from setuptools import find_packages, setup
from glob import glob
import os

package_name = 'control_planner'


# 1) 收集资源文件
map_files   = [os.path.join('maps',  f) for f in os.listdir('maps')]
param_files = [os.path.join('param', f) for f in os.listdir('param')]
urdf_files  = [os.path.join('urdf',  f) for f in os.listdir('urdf')]



# 2) 定义 data_files
data_files_list = [
    # 注册到 ament resource index
    ('share/ament_index/resource_index/packages',
        ['resource/' + package_name]),
    # 安装 package.xml 到 share/my_robot
    ('share/' + package_name, ['package.xml']),

    # 安装 maps 目录下的所有文件到 share/my_robot/maps
    ('share/{0}/maps'.format(package_name),   map_files),
    # 安装 param 目录下的所有文件到 share/my_robot/param
    ('share/{0}/param'.format(package_name),  param_files),
    # 安装 urdf 目录下的所有文件到 share/my_robot/urdf
    ('share/{0}/urdf'.format(package_name),   urdf_files),
    # **安装 launch 目录下的所有 .py 文件**
    ('share/' + package_name + '/launch',
        glob('launch/*.py')),
]


setup(
    name=package_name,
    version='0.0.0',
    packages=find_packages(exclude=['test']),
    # data_files=[
    #     ('share/ament_index/resource_index/packages',
    #         ['resource/' + package_name]),
    #     ('share/' + package_name, ['package.xml']),
    # ],
    data_files = data_files_list,
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='usv-6081',
    maintainer_email='[email protected]',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
            'hello_node = control_planner.hello_node:main',
            'usv_Simulation = control_planner.usvSimV2:main',
            'usv_Simulation_rudder = control_planner.usvSimV3:main',
            'keyboard_interaction = control_planner.keyboard_interaction:main',
            'publish_joint_angle = control_planner.publish_joint_angle:main',
        ],
    },
)

以上是我的setup.py文件,您看看是否有需要修改的地方,以增加对.rviz文件的配置

回答

你的 setup.py 写得已经相当规范了!不过你提到 .rviz 文件没有安装进去,问题就在于:


❗ 你目前的这行:

# **安装 launch 目录下的所有 .py 文件**
('share/' + package_name + '/launch', glob('launch/*.py')),

它只会安装 .py 文件,而 不会包含 .rviz 文件


✅ 正确做法是:将 .rviz 文件也加进去

你只需要改成这样,让它匹配 .launch/ 目录下的所有文件(包括 .py.rviz):

('share/' + package_name + '/launch', glob('launch/*')),

✅ 修改后步骤:

  1. 修改你的 setup.py

把这行:

('share/' + package_name + '/launch', glob('launch/*.py')),

改成这行:

('share/' + package_name + '/launch', glob('launch/*')),

  1. 重新编译并 source:
colcon build --packages-select control_planner --cmake-clean-cache
. install/setup.bash

  1. 验证 .rviz 是否已安装:
ls install/control_planner/share/control_planner/launch

你应该能看到 test_follow_rudder.rviz 出现在其中。


这样改完后,你在 launch.py 中使用 os.path.join(pkg_share, 'launch', 'test_follow_rudder.rviz') 就会正确读取 .rviz 文件了。

如需要我帮你一起确认目录结构和 launch 文件,也可以贴出来我帮你查。

继续提问

rviz格式文件一般是否就是放在launch文件夹下呢?按照惯例

回答

这是一个很好的问题。虽然 ROS2 官方并没有强制要求 .rviz 文件放在哪个目录,但从社区常见的结构和良好实践来看,有如下惯例推荐


✅ 通常做法是:

.rviz 文件放在 launch/ 目录下

这种做法的优点是:

  • .rviz 文件本质上是用于视觉配置,它经常作为 launch.py 启动 rviz2 时的参数加载;
  • 放在 launch/ 目录下便于组织和关联,用户一眼就知道哪些配置和可视化相关;
  • 避免把 .rviz 混进如 param/config/ 这些与功能配置有关的目录。
示例目录结构:
your_package/
├── launch/
│   ├── nav2_launch.py
│   ├── rviz_nav_config.rviz
├── param/
│   └── robot_params.yaml
├── urdf/
│   └── robot.urdf.xacro

其他可选做法(不太推荐):

有些项目也会把 .rviz 放到:

  • config/:如果该目录主要用于放置 .yaml.rviz 等纯配置文件;
  • rviz/:如果视觉配置非常复杂时可能专门设一个子目录;

但这种结构通常是在大型项目中才会出现,一般小中型项目还是倾向于放在 launch/


✅ 最佳实践总结:

放置目录 是否推荐 说明
launch/ ✅ 推荐 简洁明了,适合 .rviz 配置
config/ 可选 适合统一管理所有非代码配置
rviz/ 少见 适用于复杂大型项目
param/ ❌ 不建议 .rviz 与参数配置语义不一致

所以,你现在把 .rviz 放在 launch/ 目录,是符合惯例且推荐的做法。继续这样做是非常好的。

继续提问

所以setup.py的作用就是把其中囊括的内容编译后放到install文件夹下对么?

回答

是的,你的理解完全正确!


setup.py 的主要作用就是:

定义如何将 Python ROS2 功能包“打包 + 安装”到 install/ 目录中,使得 ROS2 可以运行它、找到它的资源、调用其节点和配置文件。


在 ROS2 工作空间中:

当你运行:

colcon build

对于 Python 包,构建系统会读取并执行其中的 setup.py 文件,完成以下关键任务:


setup.py 的功能详解:

功能 描述
安装源码 把你写的 Python 源代码(在 packages= 列表中的)安装到 install/lib/python3.x/site-packages
安装资源文件 通过 data_files 字段,把 .rviz.yaml.launch.py 等文件复制到 install/share/your_package/ 对应目录
注册为 ROS 包 通过 'share/ament_index/resource_index/packages' 告诉 ROS2 这是一个功能包,可以被 ros2 launchros2 run 等命令找到
安装节点脚本 通过 entry_points,让 ros2 run your_package your_node 能直接运行你的 Python 脚本
安装 package.xml 让 ROS2 知道依赖关系、描述信息、作者、许可等

安装后结构示例(install/your_package):

install/control_planner/
├── lib/
│   └── python3.10/
│       └── site-packages/
│           └── control_planner/
│               ├── __init__.py
│               └── usvSimV2.py
├── share/
│   └── control_planner/
│       ├── launch/
│       │   ├── test_follow_rudder.rviz
│       │   └── your_launch.py
│       ├── maps/
│       ├── param/
│       └── package.xml

✅ 总结一句话:

setup.py 决定了你的 Python 包中哪些代码和资源文件会被安装、安装到哪里,从而让 ROS2 的运行环境可以识别并使用它们。

如果你未来想发布、分发或复用你的包,setup.py 的正确配置至关重要。

最终结果

对setup.py中launch文件部分代码进行修改后,编译,source,然后执行

ls install/control_planner/share/control_planner/launch

可以在install的launch文件夹下看到我的rviz文件。rviz中可以正常加载我的配置文件。
ROS2,为什么launch了以后,加载的rviz文件还是默认的初始rviz格式,没有成功读取我自己的rviz格式文件呢?_第1张图片
成功!

你可能感兴趣的:(ROS2,机器人,ROS2)