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格式文件?
是的,你理解得完全正确:
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_planner
和 source install/setup.bash
后仍然看不到 .rviz
文件被安装到 install/.../launch
目录,这通常说明有以下问题之一:
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
。
.rviz
文件是否真的存在于 launch/
目录中?你可以执行:
ls launch/
确认 test_follow_rudder.rviz
就在 launch/
下。
可以尝试 清理缓存 并重新构建:
colcon build --packages-select control_planner --cmake-clean-cache
. install/setup.bash
即使是纯 Python 包,添加 --cmake-clean-cache
也有助于触发重新处理 data_files
。
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/*')),
setup.py
:把这行:
('share/' + package_name + '/launch', glob('launch/*.py')),
改成这行:
('share/' + package_name + '/launch', glob('launch/*')),
colcon build --packages-select control_planner --cmake-clean-cache
. install/setup.bash
.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 可以运行它、找到它的资源、调用其节点和配置文件。
当你运行:
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 launch 、ros2 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