ros底盘驱动包存在scan跟不上车体运行的错误调试过程
【摘要】 现象描述一个和底盘通讯的代码和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)