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節點關系正確,但是時間的變換數據是錯誤的。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。