ros底盘驱动包存在scan跟不上车体运行的错误调试过程

网友投稿 544 2022-05-28

现象描述

一个和底盘通讯的代码和ros包,总是发现当控制车体运行一段距离,rviz里面scan的数据更新会过一秒才能跟着运动走,同时发现tf的base_link也是过一秒才更新

ros底盘驱动包存在scan跟不上车体运行的错误调试过程

调试过程

起初,以为是串口堵塞,没有及时的接受和处理底盘上行发布的轮速信息导致,之后写了一个串口缓存程序,但是发现并不是串口堵塞导致,而且odom更新是实时的。

之后发现map到base_footprint的tf的变换是卡顿的,起初跳动一下,之后才跳动成与odom差不多的数值。

此时认为是odom的更新不正确,在odom轮速的累加过程中,把轮速取相反数,发现可以解决这个问题,但是这是不正常的,轮速是正确的。

//计算odom //vx_ 是未处理前的x方向速度 //vy_ 未处理前的y方向速度 //vth_未处理前的x方向角速度 //th_ 未处理前的imu获取的角度 //上面四个是全局变量,是从底盘的串口获得的

//下面四个是用于odom计算的局部变量 //vx vy vyaw taw 对应上面的全局变量 ros::Time curr_time; curr_time = ros::Time::now(); double vx,vy,vyaw,yaw;//局部变量 vx = ((chassisvalue.vx)/1000.0); vy = ((chassisvalue.vy)/1000.0); vyaw = ((chassisvalue.vth)/1000.0); vx = -vx; vy = -vy; vyaw = -vyaw; yaw = (chassisvalue.th_imu/100.0); yaw = (yaw*PI/180.0); //实时角度信息, odomvalue.th = yaw; double dt = (curr_time - last_time_).toSec(); //间隔时间 double delta_x = (vx * cos(yaw)) * dt-(vy * sin(yaw)) * dt; //th_弧度 double delta_y = (vx * sin(yaw)) * dt+(vy * cos(yaw)) * dt; double delta_th = vyaw * dt; //里程计累加 odomvalue.x += delta_x; odomvalue.y += delta_y; odomvalue.vx = vx; odomvalue.vy = vy; //里程计解算积分后角度 odomvalue.vth = vyaw; last_time_ = curr_time; 复制代码

最后发现是在静态tf的设置时候,base_link到laser_link的tf是反的,与实际中有π的差距

修改静态tf之后就好了。

总结:一直认为tf树很重要,仍然在一些重要的地方搞错了tf,导致了比较明显的错误后果。

并且早就查看过tf树,只是tf节点关系正确,但是时间的变换数据是错误的。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:HDC.Cloud 2021 | 华为云发布重磅新品,全栈云原生技术能力持续创新升级
下一篇:【Go开源宝藏】Go 语言操作 Redis (一)
相关文章