阅读 165

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

现象描述

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

调试过程

起初,以为是串口堵塞,没有及时的接受和处理底盘上行发布的轮速信息导致,之后写了一个串口缓存程序,但是发现并不是串口堵塞导致,而且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节点关系正确,但是时间的变换数据是错误的。


作者:kobesdu
链接:https://juejin.cn/post/7057771190361784350


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐