Skip to content

move_base 一些问题解决方案

maohaihua edited this page Nov 22, 2018 · 1 revision

navigation 调试 -1- 解决导航过程中边前进边转圈问题 机器人在给客户演示时,概率出现一个问题现象:

制定目的地后,机器人在行进过程中不断朝一个方向转圈式前进,最终达到目标位置,这过程中可以避障。

见下图:

粉色框:起点

蓝色框:终点

黑色线:规划路径

红色线:实际行进路径

分析:

1.从行进过程中可以看到,机器人最后还是可以运行到目标位置,这说明它的里程计(odom)信息是准确的,可以准确定位机器人的位置并运行到目标位置。这说明问题不是出在电机信息或者陀螺仪信息。---位置信息是否准确

2.怀疑是扫描数据源问题,导航过程中,使用rviz查看scan信息,发现是准备的,并且机器人在转圈过程是可以实时检测到障碍并加以避开。这说明不是扫描源问题。---扫描信息是否准确

3.怀疑是算法问题,有没有可能是recovery也跑起来了,结果查看navigation的打印信息,发现和正常运行并无异常。---查看打印信息,看是否有异常

4.怀疑是plan path的问题,在rviz中,将其余的不重要的信息都勾去,只留global path, local path,map,发现global path没有问题, local path在机器人正面朝向目标时才有,并且也基本让机器人往global path上靠。当侧对时,概率出现让机器人转圈转向的local path,不过几率很小。背对目标位置时,没有local path。 ---local path出问题概率很小

5.查看最终下发给机器人的控制速度命令,rostopic echo /cmd_vel_mux/input/navi,发现在最后角度偏转时的转向值一直是负的,没有变成正的,导致机器人在往一个方向转圈。---可以排除机器人硬件问题

angular: x: 0.0 y: 0.0 z: -0.5

6.查看navigation中生成控制命令的地方,dwa_planner_ros.cpp中的findBestPath方法。将获取到的最优路径的控制命令(path.thetav_)打印出来,和rostopic echo /cmd_vel_mux/input/navi进行对比,发现问题,path.thetav_在显示正数时,angular.y还显示负数,然后仔细观察path.thetav_和angular.y,发现angular.y变动的非常慢,例如:

thetav_从-1变成1,当thetav_变成0时,angular.y还是-0.6,这变化慢就说明下发命令是换个转动方向,而在smoother中的角度减速度太慢导致角速度还没变到0,机器人就早已偏离path。

在看smoother如果设置角度减速度,取决与decel_factor和accel_lim_w,由于机器人过大过重,为防止惯性过大,将accel_lim_w减小到很小,而忽略了decel_factor值没有改变,导致其减速度也变的非常小,在适当扩大decel_factor值后,问题消失---导航过程中不光要考虑加速度,还要有减速度

7.如上一步还没有找到问题跟因,则需要继续分析findBestPath方法。

作者:sunyoop 来源:CSDN 原文:https://blog.csdn.net/sunyoop/article/details/78903903 版权声明:本文为博主原创文章,转载请附上博文链接!

问题描述:规划路线后,需要机器人原地转动角度大于180度,在机器人转动时,会大概率出现不断转圈问题

分析过程:

smoother初始参数:

speed_lim_v: 0.8 speed_lim_w: 5.4

accel_lim_v: 1.0 # maximum is actually 2.0, but we push it down to be smooth accel_lim_w: 2.0

Optional parameters

frequency: 20.0 decel_factor: 1.5

Robot velocity feedback type:

0 - none (default)

1 - odometry

2 - end robot commands

robot_feedback: 2

减小角速度的最大速度和最大加速度后,问题依然存在

speed_lim_v: 0.8 speed_lim_w: 2.7

accel_lim_v: 1.0 # maximum is actually 2.0, but we push it down to be smooth accel_lim_w: 1.0

Optional parameters

frequency: 20.0 decel_factor: 1.5

Robot velocity feedback type:

0 - none (default)

1 - odometry

2 - end robot commands

robot_feedback: 2

查看move_base下发的命令,发现下发的角速度依然是朝一个方向不断在转圈

[ INFO] [1516612576.380730741]: Got new plan [ERROR] [1516612576.410813994]: Got a valid command from the local planner: 0.046, 0.000, -2.627 [ERROR] [1516612576.609987660]: Got a valid command from the local planner: 0.046, 0.000, -2.157 [ERROR] [1516612576.813163838]: Got a valid command from the local planner: 0.049, 0.000, -2.123 [ERROR] [1516612577.027420682]: Got a valid command from the local planner: 0.196, 0.000, -2.126 [ERROR] [1516612577.224319143]: Got a valid command from the local planner: 0.240, 0.000, -1.859 [ INFO] [1516612577.380724905]: Got new plan [ERROR] [1516612577.430024792]: Got a valid command from the local planner: 0.000, 0.000, -1.950 [ERROR] [1516612577.609789745]: Got a valid command from the local planner: 0.000, 0.000, -1.758 [ERROR] [1516612577.827081727]: Got a valid command from the local planner: 0.000, 0.000, -2.491 [ERROR] [1516612578.026000115]: Got a valid command from the local planner: 0.000, 0.000, -2.455

怀疑是,检测路线差异的间隔太大,导致每当机器人转到正确角度时,不会检测路线差异重新规划路线,而机器人依然沿着旧的命令不断旋转,最终旋转超过2xx度,才出现路线重新规划,再次需要转到正常角度。

大幅度降低最大角速度和最大角速度加速度

Mandatory parameters

speed_lim_v: 0.8 speed_lim_w: 0.4 #2.7_2 #5.4_1

accel_lim_v: 1.0 # maximum is actually 2.0, but we push it down to be smooth accel_lim_w: 0.8 #1.0_2 1#2.0_1

Optional parameters

frequency: 20.0 decel_factor: 1.5

Robot velocity feedback type:

0 - none (default)

1 - odometry

2 - end robot commands

robot_feedback: 2

结果不会出现该问题,但不是根本原因,因为转到差不多200~220时,已能停下并自动纠正路线。

这样依然有小问题,不能立刻转到180度,要多转几十度。排查,发现local path的频率只有5Hz,每隔0.2s一次,会不会是这0.2秒转动的角速度过大没有纠正过来。做一下尝试修改

controller_frequency: 20.0 #5.0

controller_patience: 3.0 结果出现无法规划local path的情况,即使周围没有障碍。再次减半频率 controller_frequency: 10.0 #20.0 #5.0 controller_patience: 3.0 还是会有该问题出现,并且出现问题,即使重点在后方,也会莫名往前方运行一段距离。 将参数改回5Hz。

再次排查,会不会是move_base设置的最小角速度的加速度和减速度太小了。

max_rot_vel: 0.4 #5.0 # choose slightly less than the base's capability min_rot_vel: 0.4 # this is the min angular velocity when there is negligible translational velocity rot_stopped_vel: 0.4

acc_lim_x: 1.0 # maximum is theoretically 2.0, but we acc_lim_theta: 1.0 #2.0 acc_lim_y: 0.0 # diff drive robot 莫名往前走几步,将max_rot_vel调整回来就没有了。将max_rot_vel和acc_lim_theta调小会发向前行进的命令,真是好奇怪 还有就是每次转向必须等到已经偏移了前进方向后才能偏正回来,怀疑会不会跟陀螺仪有关系。

因为不清楚具体问题跟因,只能不断缩小最大角速度和最大角速度加速度

作者:sunyoop 来源:CSDN 原文:https://blog.csdn.net/sunyoop/article/details/79131854 版权声明:本文为博主原创文章,转载请附上博文链接!

ROS导航小车无故倒退问题分析 之前用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;

1
2
3
4

这段代码之前是计算合适的局部速度策略,而如果没有合适的策略(速度),这段代码会启用。也就是说出现这种状况是因为现在计算不出一个合法的速度供小车安全的行驶。 为什么会出现这种情况呢,原因很多,我这里只讲一种比较常见但容易被忽视的。就是你提供的odom信息中的x速度过大(这里只针对差分运动的小车),也就是每次计算的小车x方向速度过大,这样base_local_planner会认为车体会碰撞所以就只发布后退命令。 为什么x方向速度会很大,因为很多人计算x方向速度时是用两个ros::Time current_time = ros::Time::now(); 这样的时间差作为被除数,这段时间增加的里程作为除数来计算的。在程序运行时有可能这个时间间隔很小,导致速度一下非常大,所以比较好的作法是被除数用一个固定的时间差,下位机发布里程增量的频率要和这个时间差一致。这样就会消除速度突然很大的问题了。

作者:月黑风高云游诗人 来源:CSDN 原文:https://blog.csdn.net/lqygame/article/details/73716065 版权声明:本文为博主原创文章,转载请附上博文链接!

使用move_base规划路径后,小车接近目的地后原地打转的原因分析 在实验过程中,计划使用move_base规划路径,让AGV小车到达指定的目标点,但小车“到达”目的地后不停的旋转,停不下来。对此,发现了导致这一现象的一个原因,仅供参考。 上图描述的就是这种现象,为了便于观察,rviz视图中隐藏了机器人,只保留了机器人的基座标。

图中,第一次指定目标时,小车到达了指定地点并停了下来,第二次指定目标时,小车也几乎到达了指定地点但没有停下来,而是不停的在原地旋转。

问题关键因素:move_base的四个参数文件中,有一个叫base_local_planner_params.yaml的配置文件,其中有个参数是min_vel_x,这个参数控制规划路径时发给机器人的最小x方向速度,这个速度不能太大,在我的测试条件下,min_vel_x:0.2 就有些大,导致机器人到了目的地后原地旋转,降低这个值后(大约0.1左右),原地旋转现象消失。

分析原因:

首先,需要理解一点:小车要到达一个目的地,需要经历一个加减速的过程,开始时加速,中间速度稳定,快到时要减速,否则会错过目标。

在这一基础上,我推测,min_vel_x这个值设置过大会导致有效的减速命令发不出来,比如,小车到达目标前需要减速到0.1m/s的速度,但min_vel_x为0.2,move_base发送指令时最小就只能发送0.2m/s的x方向线速度,按照0.2的速度只会错过目标,因此,move_base此时选择不再发送新的x方向线速度,x方向线速度会归为0,此时并没有到达目标点(一般还差一点,并且比能够容忍的误差要大),move_base就会为进一步接近目标做规划,但此时离目标又太近,因为最低速度的限制,线速度指令始终发不出来,而角速度指令则会另小车原地打转。

需要注意的一点:此时小车并没有真正到达它所认为的目标,只是很接近了,但还不能算到达。实际操作中还存在一种现象,就是有时候min_vel_x明明有些偏大,但小车也能到达终点并不旋转(图中第一次指定目标),这种意外往往发生在算法最近一次规划路径后,小车就很接近目标了,当小车已经走进目标范围内足够接近的区域时,算法就认为已经到目标了,此时也就不再规划了,因此,此时小车不会原地旋转,

以上原因属于个人推测,仅供参考。

作者:爱学习的草莓熊 来源:CSDN 原文:https://blog.csdn.net/lingchen2348/article/details/79830098 版权声明:本文为博主原创文章,转载请附上博文链接!

Clone this wiki locally