之前用ROS+激光雷达做小车室内导航时,遇到个问题,就是在RVIZ中给定目的地后小车总是会倒退行走,这个行走速度就是base_local_planner_params.yaml里配置的escape_vel逃逸速度,调整了其他参数无用,看看源代码
在trajectory_planner.cpp中
//and finally, if we can't do anything else, we want to generate trajectories that move backwards slowly
vtheta_samp = 0.0;
vx_samp = backup_vel_;
vy_samp = 0.0;
这段代码之前是计算合适的局部速度策略,而如果没有合适的策略(速度),这段代码会启用。也就是说出现这种状况是因为现在计算不出一个合法的速度供小车安全的行驶。
为什么会出现这种情况呢,原因很多,我这里只讲一种比较常见但容易被忽视的。就是你提供的odom信息中的x速度过大(这里只针对差分运动的小车),也就是每次计算的小车x方向速度过大,这样base_local_planner会认为车体会碰撞所以就只发布后退命令。
为什么x方向速度会很大,因为很多人计算x方向速度时是用两个ros::Time current_time = ros::Time::now(); 这样的时间差作为被除数,这段时间增加的里程作为除数来计算的。在程序运行时有可能这个时间间隔很小,导致速度一下非常大,所以比较好的作法是被除数用一个固定的时间差,下位机发布里程增量的频率要和这个时间差一致。这样就会消除速度突然很大的问题了。