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

举报
kobesdu 发表于 2022/01/28 13:29:19 2022/01/28
【摘要】 现象描述一个和底盘通讯的代码和ros包,总是发现当控制车体运行一段距离,rviz里面scan的数据更新会过一秒才能跟着运动走,同时发现tf的base_link也是过一秒才更新调试过程起初,以为是串口堵塞,没有及时的接受和处理底盘上行发布的轮速信息导致,之后写了一个串口缓存程序,但是发现并不是串口堵塞导致,而且odom更新是实时的。之后发现map到base_footprint的tf的变换是卡顿...

现象描述

一个和底盘通讯的代码和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节点关系正确,但是时间的变换数据是错误的。



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。