ROS with V-rep (3) 之仿真velodyne16線激光 (ROS學習筆記六)

昨天與前天的工作解決了ROS與V-rep通訊的問題,今天主要利用V-rep研究了仿真velodyne16線激光的問題,並將數據發送至rviz中,將點雲地圖畫了出來。

一、環境問題

這裏的環境爲

ubuntu 14.04 + ROS indigo + V-rep 3.3.1 EDU

因爲仿真中的函數、橋接等問題對環境很敏感,所以建議使用以上版本進行仿真,同時因爲V-rep仿真16線激光時對計算量要求很高,建議使用GPU較高端的電腦進行仿真。否則幀率會非常低,我的老舊筆記本幀率差至0.4fps。


二、步驟

依照其他教程與之前的工作,我們可以得到一個可以與ROS進行通訊並受ROS控制的小車底盤,從V-rep的自帶元件庫中找到velodyne VPL16,利用jiont連接至小車上,即完成了初步的搭建工作。同時可以對周圍環境進行一些修飾,插入一些標誌物,如下圖即爲運行時的場景:


但是做到上一步只是實現了在V-rep中插入激光雷達,並不能將數據導出到ROS中,以便仿真我們自己的算法,這時其實只需要修改一下Rendar的LUA腳本即可,因爲源文件在另一個筆記本上,這裏只能給出修改思路。

打開LUA腳本可以發現,其實這個16線激光雷達是分別由4個VisionHandle組成的,其實每個Handle 對應座標系的90度,組合在一起就是整個360度的空間了。我們需要做的其實就是把這四個visionhandle的點雲數據pub出來。

在if(...sensing) then對應的循環中,加入四個publisher其實就可以完成這個任務,pub的函數與上篇文章所用的函數一致,只是數據類型變成“simros_strmcmd_get_depth_sensor_data”,即只要把visionhandle[1]~visionhandle[4]的內容,通過pub的形式,在每個循環中pub出來其實就完成了我們的工作,順利完成後效果如下:

對照上一個V-rep中的圖,可以更直觀的看出點雲的對應信息。

其實只是在rviz中接收是無法正常看到上圖顯示的,這裏需要調用一下神奇的tf矩陣,即

rosrun tf static_transform_publisher 0 0 0 1.57 0 1.57 map velodyneVPL_16_sensor1 10

rosrun tf static_transform_publisher 0 0 0 3.14 0 1.57 map velodyneVPL_16_sensor2 10

rosrun tf static_transform_publisher 0 0 0 -1.57 0 1.57 map velodyneVPL_16_sensor3 10

rosrun tf static_transform_publisher 0 0 0 0 0 1.57 map velodyneVPL_16_sensor4 10

以上的旋轉矩陣實際是將四個激光雷達的信息分別像拼積木一樣湊成了360度,其實仔細看上圖還是可以發現四個雷達的拼接處形成的隱約的分界線,這是因爲3.14與pi之間有少許差距,導致了拼接的縫隙,可以通過哦進一步精確小數位數來彌補。

但其實此時的幀率已經低到了令人髮指的地步,強烈建議選用高配電腦來實現!!


三、進一步工作

既然可以用Rviz收到點雲信息,用subscriber去接收也是同理,但應注意,點雲數據一般非常大,我測試30s的點雲,用txt保存就達到了8G的大小,所以一般不建議直接保存,或者可以嘗試提取關鍵幀類似的想法來嘗試。同時,可以通過自己寫ROS中的controller來將激光點雲作爲輸入信息,利用自己的算法最終輸出對小車的控制信息,以此來驗證自己算法的性能~例如rqt圖如下:

其中depth_1~4爲激光點雲數據,controller爲我們自己寫的控制算法,至此可以愉快的用vrep仿真激光小車了~


其實還有一種思路,結合V-rep中的path_planning模塊,同時將激光點雲與控制方法pub出去,作爲數據送入神經網絡中訓練,以得到一個可以根據激光點雲輸入給出控制方式的網絡。

當然,幀率和數據量依舊是個大問題。。。明天來解決這個問題吧~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章