小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
鱼哥鱼哥,rviz2加载地图时无法出现地图
-
问题描述:
在slam建图的进阶篇章节中激活了map_server但是还是无法出现地图
具体细节和上下文:
在rviz中无法在fixed frame找到任何一个可选项
map这里有个警告,不太清楚为什么。而且我看社区也有人问过,说改qos,但是改了好像也无济于事
然后我看rqt的节点关系
感觉map都发送到rviz了,不知道为什么就是无法显示出来
运行rviz2:
lua:include "map_builder.lua" include "trajectory_builder.lua" options = { map_builder = MAP_BUILDER, trajectory_builder = TRAJECTORY_BUILDER, map_frame = "map", tracking_frame = "imu_link", published_frame = "odom", odom_frame = "odom", provide_odom_frame = false, publish_frame_projected_to_2d = true, use_odometry = true, use_nav_sat = false, use_landmarks = false, num_laser_scans = 1, num_multi_echo_laser_scans = 0, num_subdivisions_per_laser_scan = 1, num_point_clouds = 0, lookup_transform_timeout_sec = 0.2, submap_publish_period_sec = 0.3, pose_publish_period_sec = 5e-3, trajectory_publish_period_sec = 30e-3, rangefinder_sampling_ratio = 1., odometry_sampling_ratio = 1., fixed_frame_pose_sampling_ratio = 1., imu_sampling_ratio = 1., landmarks_sampling_ratio = 1., } MAP_BUILDER.use_trajectory_builder_2d = true TRAJECTORY_BUILDER_2D.min_range = 0.12 TRAJECTORY_BUILDER_2D.max_range = 3.5 TRAJECTORY_BUILDER_2D.missing_data_ray_length = 3. TRAJECTORY_BUILDER_2D.use_imu_data = false TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1) POSE_GRAPH.constraint_builder.min_score = 0.65 POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7 -- POSE_GRAPH.optimize_every_n_nodes = 0 return options
launch:
import os from launch import LaunchDescription from launch.substitutions import LaunchConfiguration from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare def generate_launch_description(): # 定位到功能包的地址 pkg_share = FindPackageShare(package='fishbot_cartographer').find('fishbot_cartographer') #=====================运行节点需要的配置======================================================================= # 是否使用仿真时间,我们用gazebo,这里设置成true use_sim_time = LaunchConfiguration('use_sim_time', default='true') # 地图的分辨率 resolution = LaunchConfiguration('resolution', default='0.05') # 地图的发布周期 publish_period_sec = LaunchConfiguration('publish_period_sec', default='1.0') # 配置文件夹路径 configuration_directory = LaunchConfiguration('configuration_directory',default= os.path.join(pkg_share, 'config') ) # 配置文件 configuration_basename = LaunchConfiguration('configuration_basename', default='fishbot_2d.lua') rviz_config_dir = os.path.join(pkg_share, 'config')+"/cartographer.rviz" print(f"rviz config in {rviz_config_dir}") #=====================声明三个节点,cartographer/occupancy_grid_node/rviz_node================================= cartographer_node = Node( package='cartographer_ros', executable='cartographer_node', name='cartographer_node', output='screen', parameters=[{'use_sim_time': use_sim_time}], arguments=['-configuration_directory', configuration_directory, '-configuration_basename', configuration_basename]) cartographer_occupancy_grid_node = Node( package='cartographer_ros', executable='cartographer_occupancy_grid_node', name='cartographer_occupancy_grid_node', output='screen', parameters=[{'use_sim_time': use_sim_time}], arguments=['-resolution', resolution, '-publish_period_sec', publish_period_sec]) rviz_node = Node( package='rviz2', executable='rviz2', name='rviz2', arguments=['-d', rviz_config_dir], parameters=[{'use_sim_time': use_sim_time}], output='screen') #===============================================定义启动文件======================================================== ld = LaunchDescription() ld.add_action(cartographer_node) ld.add_action(cartographer_occupancy_grid_node) ld.add_action(rviz_node) return ld
-
根据您提供的信息,这里有几个可能的原因导致RViz2中无法加载和显示地图:
-
Fixed Frame问题:RViz2中无法在Fixed Frame下拉列表中找到任何选项,这通常意味着RViz2没有接收到任何TF(Transform)数据,或者这些TF数据还没有被完全发布。确保您的机器人/仿真环境中的传感器数据(如激光雷达扫描或里程计数据)正在被发布,并且
tf
或tf2
包正在处理这些数据。 -
Map Server未正确激活:虽然您提到激活了
map_server
,但请确保map_server
节点实际上已经启动,并且地图文件路径正确无误。您可以通过ros2 node list
查看当前运行的节点,确保map_server
在其中。 -
地图文件问题:确保地图文件没有损坏,并且格式正确(如PGM或PNG)。您可以使用图像查看器打开地图文件来检查其是否可读取。
-
RViz2配置问题:检查RViz2的配置文件(
.rviz
),确保地图显示的相关设置是正确的。比如,在RViz2的Display面板中,您应该有一个名为Map
的显示项,其Topic
应该设置为/map
(或您map_server发布地图的topic)。 -
QoS设置问题:虽然您提到更改QoS设置似乎无济于事,但确保所有相关的节点(包括
cartographer_node
、cartographer_occupancy_grid_node
、map_server
和RViz2)都使用兼容的QoS设置是很重要的。有时,如果某个节点使用默认的QoS设置,而其他节点使用非默认设置,它们之间可能无法正确通信。 -
时间同步问题:确保所有节点都使用相同的时间源(模拟时间或实时时间),并且它们之间的时间同步是正确的。时间不同步可能会导致TF转换失败,从而导致地图无法在RViz2中显示。
-
ROS 2通信问题:由于ROS 2的分布式特性,确保所有节点都在同一网络中,并且ROS 2的通信没有问题。您可以使用
ros2 topic echo
或ros2 topic list
来检查话题是否正在被发布和接收。
为了进一步诊断问题,您可以尝试以下步骤:
- 使用
ros2 topic echo /map
(或您map_server发布地图的topic)来查看地图数据是否正在被发布。 - 使用
ros2 run tf2_ros tf2_echo map odom
(或您想要查询的任意两个frame)来检查TF转换是否可用。 - 在RViz2中,尝试手动添加Map显示项,并设置正确的Topic。
- 检查RViz2的日志文件或控制台输出,看是否有任何错误或警告信息。
如果以上步骤都无法解决问题,您可能需要更深入地检查您的ROS 2设置和配置,或者寻求社区或论坛的帮助,提供更多的细节和日志信息以便他人能够帮助您。
以上为生成回答,仅供参考~
-
-
@1877846919 看看TF是否正常
-
此回复已被删除! -
@小鱼
好像也不正常 -
-
@小鱼
这个截图吗
-
@1877846919 你的操作上下文,系统信息之类的
-
@小鱼 我是上面问了问题然后这边回复你的tf是否正常的问题的,我这边进到rqt看节点关系跟位姿,截的图
然后我就想看一下一直监听一下/map然后激活会发送什么数据,结果也是0000
-
@1877846919 话题有数据就是有地图,所以你需要打开RVIZ2,修改好fix frame 和 Qos应该就可以正常显示了
-
原因:topic:/map发布了一次,rviz2 后启动接收不到,参考:
https://blog.csdn.net/chenlin41204050/article/details/136439108