11

运行其他数据集

 3 years ago
source link: https://charon-cheung.github.io/2022/04/03/%E6%BF%80%E5%85%89SLAM/Cartographer/%E5%8E%9F%E7%90%86%E5%92%8C%E9%85%8D%E7%BD%AE/%E8%BF%90%E8%A1%8C%E5%85%B6%E4%BB%96%E6%95%B0%E6%8D%AE%E9%9B%86/#MIT%E7%9A%84%E6%95%B0%E6%8D%AE%E9%9B%86%E8%BF%90%E8%A1%8C
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

根据我的经验,先启动cartographer后,等待出现下面的日志,然后再播放bag。如果这个日志没出现,播放bag通常不会成功开始建图

[/cartographer_node   node.cc:886] Expected topic "scan" (trajectory 0) (resolved topic "/base_scan") but no publisher is currently active.
[/cartographer_node node.cc:895] Currently available topics are: /constraint_list,/submap_list,/scan_matched_points2,/rosout,/tf,/rosout_agg,/map,/trajectory_node_list,/landmark_poses_list,

软件所的数据集运行

这个数据集的问题是scan话题里的坐标系是laser,这是驱动程序决定的。但是tf里的坐标系变成了laser_mount_link,到了tf_bridge_.LookupToTracking那里卡住了,即使手动改了源码也不行。

另一个问题是坐标系名称带了/,这个其实在cartographer里会被解决,但是习惯上不要加上。

重启电脑后,突然就好了,不明白为什么。 launch里不能加<param name="/use_sim_time" value="true" />,否则cartographer一直阻塞。

结果会有日志:

Warning: TF_OLD_DATA ignoring data from the past for frame base_footprint at time 1.59524e+09 according to authority unknown_publisher
Possible reasons are listed at http://wiki.ros.org/tf/Errors%20explained
at line 277 in /tmp/binarydeb/ros-kinetic-tf2-0.5.20/src/buffer_core.cpp

MIT的数据集运行

这个数据集的第1个问题是它的机器人是会坐电梯在楼层之间跑的,因此需要选择一个只在一个平面上跑的数据集2011-03-28-08-38-59.bag

从TF变换树可以看到,这里的里程计信息是采用经过EKF滤波之后的里程计坐标系/robot_pose_ekf/odom_combined,而不是直接的base_odometry/odom第2个问题来了:cartographer需要的里程计消息是nav_msgs/Odometry,但是/robot_pose_ekf/odom_combined的类型是geometry_msgs/PoseWithCovarianceStamped,在播放rosbag时会报错,无法建图。于是想用原来的里程计/base_odometry/odom,结果发现缺少child_frame_id,一般为base_link。无法给bag消息加坐标系,只能写一个程序mit_to_odom做转换

不使用数据集的IMU和odom,结果建图不能进行,日志如下

[/cartographer_node] [local_trajectory_builder_2d.cc:136] time_first_point: 634369235390529797
[/cartographer_node] [local_trajectory_builder_2d.cc:137] GetLastPoseTime: 634369235390647384
[/cartographer_node] [local_trajectory_builder_2d.cc:138] Extrapolator is still initializing
[/cartographer_node] [pose_graph_2d.cc:148] Inserted submap (0, 0).

阻塞在
if (time_first_point < extrapolator_->GetLastPoseTime() )
{
LOG(INFO) << "Extrapolator is still initializing.";
return nullptr;
}

使用雷达北洋UTM-30LX,也就是LOAM论文所用的雷达。

正常的日志:

[/cartographer_node   local_trajectory_builder_2d.cc:138] Extrapolator is still initializing
[/cartographer_node pose_graph_2d.cc:148] Inserted submap (0, 0).
-------------------------------------------
[/cartographer_node] pose_graph_2d.cc:148] Inserted submap (0, 1).
[/cartographer_node] pose_graph_2d.cc:538] Remaining work items in queue: 0
[/cartographer_node] constraint_builder_2d.cc:290] 0 computations resulted in 0 additional constraints.
[/cartographer_node] constraint_builder_2d.cc:292] Score histogram:
Count: 0

这两个问题最后的解决也很奇怪,就是设置use_sim_time的问题,但是第1个数据集的TF_OLD_DATA的报警解决不了,先使用第2个了。

使用IMU+激光,运行cartographer

<launch>
<node name="cartographer_node" pkg="cartographer_ros"
type="cartographer_node" args="
-configuration_directory $(find cartographer_ros)/configuration_files
-configuration_basename mit_stata.lua"
output="screen">
<remap from="scan" to="base_scan" />
<remap from="imu" to="torso_lift_imu/data" />
</node>

<node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
type="cartographer_occupancy_grid_node" args="-resolution 0.05" />
</launch>

lua参数的设置:

  • 修改tracking_frame, 为 base_footprint
  • 修改published_frame,为 base_footprint
  • 修改num_laser_scans 为1
  • 修改num_multi_echo_laser_scansnum_point_clouds均为0
  • TRAJECTORY_BUILDER_2D.use_imu_data = true

不用里程计,在长走廊中会定位错误,导致建图重叠


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK