1. 前言
構建出地圖后,應該測試點雲地圖定位效果,這里用到ndt的scan_matching方法,這是一種scan-to-map方法。這里用的是我們自己采集的數據進行仿真。
本章內容有和No. 1重復的內容,為了方便調試,我將重復的內容也貼出來。
注意:所有需要在 [Simulation] 菜單下加載的數據,都需要在所有操作之前操作,否則在RViz顯示時,會出現frame_id錯誤。
2. 點雲仿真定位
注意:在開始點雲定位之前,請確保No. 1的全部取消(建議直接關閉所有程序)。
注意:坐標系與建立點雲地圖不同,如下圖所示
2.1 打開runtime manager
2.2 打開地圖要定位的數據(在百度網盤中有,這是我們錄制的用於定位的數據)
進入 [Simulaton] 頁面,點擊界面右上方 [Ref] 按鈕,加載錄制用於定位的 bag 文件。
點擊 [Play] 然后點擊 [Pause]暫停。
注意:請一定要先做這一步,這是因為要同步時間。如果在后面做,會產生關於stamped的錯誤。
2.3 加載地圖,加載world到map以及base_link到velodyne的TF變化
(1) 設置從base_link到velodyne坐標系的TF(與No. 1重復)
在 [Setup] 菜單中,確保 [Localizer] 下選項為 [Velodyne],在 [Baselink to Localizer] 中設置好各個參數之后點擊 TF 按鈕,其中x、y、z、yaw、pitch、roll表示真車雷達中心點與車身后軸中心點的相對位置關系(右手坐標系,真車后車軸為原點),此時可以點擊[Vehicle Model],如果[Vehicle Model]為空,那么會加載一個默認模型(在rviz顯示時,如果有激光雷達數據,車輛會顯示為黑色)。如下所示。
(2)設置從world到map轉換(與No. 1重復)
點擊 [Map] 頁面,點擊 [TF] 的 [ref] 選擇 autoware/ros/src/.config/tf/tf_local.launch 文件,這是加載默認world到map的坐標轉換,打開tf_local.launch文件如下:
<launch> <node pkg="tf" type="static_transform_publisher" name="world_to_map" args="0 0 0 0 0 0 /world /map 10" /> </launch>
args的參數“0 0 0 0 0 0 /world /map 10”表示:從/world坐標系轉換到/map坐標系的x, y, z, roll, pitch, yaw轉換,且頻率為10Hz。
點擊 [TF] 按鈕,如下圖:
(2)加載地圖
選擇runtime manager的 [Map] 菜單,點擊 [Point Cloud] 按鈕的 [ref],加載培訓筆記 No. 1產生的.pcd文件(點雲地圖),並點擊 [Point Cloud] 按鈕,進度條顯示OK,則加載完畢,如下所示:
2.4 設置相關濾波器
選擇 [Sensing] 頁面,點擊 [Points Downsampler] 下 [voxel_grid_filter] 的 app,設置一些參數,[voxel_grid_filter] 是一種將采樣方法,將點雲數據用質心近似(用於降采用),如下圖:
這里,[Voxel Leaf Size] 參數值為2,意義是2米的立方體內的全部點近似用1個質心代替。[Measurement Range]的參數值為2,意義是點雲的有效的距離為200米。
[Points Downsampler] 下的四個濾波器都可以選,但我只看了 [voxel_grid_filter] 濾波器,其他三個暫時沒看,后續會陸續補充。
[ring_filter] 與 [ring_ground_filter] 聯合來用,才會過濾掉地面,如果大家去看 [computing] 菜單下的 [astar planner] 下的 [velocity set] 選項下的 [app] 設置會發現這個選項要接收的topic為points_no_ground 只有這兩個選項都開啟時,這個選項才會生效。 [velocity set] 實際上就是跟斑馬線及障礙物相關的速度設置。
2.5 設置從map到base_link的轉換(NDT_MATCHING)
找到 [Computing] 左菜單欄下的 [ndt_matching] 選項,打開 [app] ,如下所示:
確保 [topic:/config/ndt] 選項處於 [Initial_Pose] 處,勾選 [Initial Pos],x,y,z,roll,pitch,yaw的值表示激光的初始位置,我們這里用默認的0,0,0,0,0,0。如果有GPU(還是一定有),那么[Method Type]可以選擇pcl_anh_gpu用GPU幫助運算。其他參數用默認值。
我們用的車只有16線激光雷達與攝像頭,所以沒有勾選Odom與IMU等選項。
如果有GNSS設備可以選擇GNSS(后面會講,先挖個坑)。
2.6 啟動[vel_pose_connect]
找到 [Computing] 左菜單欄下的 [vel_pose_connect] ,打開 [app] 並確保選項 [Simulation_Mode] 沒有被勾選(默認不勾選),退出並勾選 [vel_pose_connect]。
2.7 運行仿真數據
打開 [Rviz], 在 [file] 菜單中的 [open config] 選擇路徑:autoware/ros/src/.config/rviz/default.rviz 的文件。這是回到runtime manager,進入 [Simulaton] 頁面,點擊 [Pause]開始。這時可以從RViz中看到一輛黑色的帶有激光雷達數據的汽車停在地圖的右下方,如下圖所示:
如果沒有上圖的效果,首先應該查看/points_raw topic是否有數據,如果沒有可能是由於數據沒發出來。如果車子不在上圖的位置上,那么點擊RViz的工具 [2D Pose Estimate] 重新為車子選擇上圖的位置和方向。
用於定位的數據在錄制的時候前期停了很長時間,所以車子會在rosbag播放到大約14%的時候才能開始運行。運行效果如下圖(下圖是經過加速的,實際效果比這個慢很多)。
數據仿真到此也就結束了
3. 點雲真車定位
真車定位與仿真定位類似,差別在於仿真定位采用事先記錄的數據,真車定位采用實際的激光雷達。
3.1 打開runtime manager
3.2 啟動激光雷達(與No.1 重復內容)
(1)針對velodyne 多線lidar
如果你有velodyne激光可以啟動默認配置:[Sensing] 頁面下 [Lidars] 選項下針對你的velodyne選擇,velodyne激光對應的發布的點雲topic:/velodyne_packets,frame_id:velodyne,topic會被重映射成為/points_raw。
例如:假如你有16線激光,點選 [velodyne VLP-16] 的 [config],點選[ref],加載/home/pix/Autoware/ros/src/sensing/drivers/lid ar/packages/velodyne/velodyne_pointcloud/param s/VLP16db.yaml路徑下的配置文件(自己多線激光雷達可以針對這個配置改寫),退出 [config],勾選 [velodyne VLP-16] 選項(一般的操作都是先修改config或者app下的配置或參數文件,然后勾選選項)。
查看點雲輸出。
(2)針對其他品牌多線lidar
如果你有其他品牌的激光,他們發布的topic不是/velodyne_packets,且frame_id同樣不對應,這時可以自己寫個程序轉一下,參照:https://www.cnblogs.com/hgl0417/p/11067660.html。然后單獨運行你的lidar driver node,將你的點雲數據模擬成velodyne數據。此時,不需要點選runtime manager上的lidar配置文件(每個配置文件對應一個package或者node,意義在於將對應的topic發布,此時你已經發布了topic,所以不需要在點選上述配置文件)。
3.3 加載地圖數據,TF數據,設置濾波器,加載scan-to-map等
重復上述2.3~2.6的操作
3.4 老司機將車輛開到地圖上的某個區域
3.5 打開RViz,查看定位是否成功
打開 [Rviz], 在 [file] 菜單中的 [open config] 選擇路徑:autoware/ros/src/.config/rviz/default.rviz 的文件。此時在地圖上會顯示真車在地圖上的實際位置。如下所示:
與仿真定位顯示類似,但是有時候由於初始位置與 map TF 有一定的距離,所以導致定位晃動無法准確與地圖綁定,這時需要借助 Rviz 中上菜單欄里的 [2D Pose Estimate] 箭頭進行輔助定位。
此時可以將車發動,司機手動開,可以看到與仿真類似的結果,一輛黑色的汽車在地圖中運行。
引用:
autoware.ai
dowson.live
原創文章,轉載請引用。