天天看點

kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。

文章目錄

  • 那麼之前測試不好的解釋有以下幾點
  • 編寫launch
  • 測試bug猜測:
    • 雷射資料和MIT的不一樣,MIT的雷射原資料好,我們的差
  • 不跑karto隻錄制資訊
  • 終于找到問題根源啦!
  • 又出問題拉,出大問題。
    • [ WARN] [1578669454.733878780]: Could not get robot pose, cancelling reconfiguration

之前如 此處進行karto_slam算法包的安裝

kartoslam算法的launch檔案如下

<launch>

  <!-- Define laser type-->
  <arg name="laser_type" default="rplidar" />

  <!-- laser driver -->
  <include file="$(find turtlebot_navigation)/laser/driver/$(arg laser_type)_laser.launch" />

  <!-- karto.launch-->
  <arg name="custom_karto_launch_file" default="$(find turtlebot_navigation)/launch/includes/karto/$(arg laser_type)_karto.launch.xml"/>
  <include file="$(arg custom_karto_launch_file)"/>

  <!-- Move base -->
  <include file="$(find turtlebot_navigation)/launch/includes/move_base.launch.xml"/>


</launch>
           

在rplidar_karto.launch.xml中内容為

<launch>
  <node pkg="slam_karto" type="slam_karto" name="slam_karto" output="screen">
    <remap from="scan" to="scan"/>
    <param name="odom_frame" value="odom"/>
    <param name="map_update_interval" value="25"/>
    <param name="resolution" value="0.025"/>
  </node>
</launch>
           

也就是說custom_karto_launch_file隻有一個slam_karto的node

然後說說move_base.launch.xml

<!-- 
    ROS navigation stack with velocity smoother and safety (reactive) controller
-->
<launch>
  <include file="$(find turtlebot_navigation)/launch/includes/velocity_smoother.launch.xml"/>
  <include file="$(find turtlebot_navigation)/launch/includes/safety_controller.launch.xml"/>
  
  <arg name="odom_frame_id"   default="odom"/>
  <arg name="base_frame_id"   default="base_footprint"/>
  <arg name="global_frame_id" default="map"/>
  <arg name="odom_topic" default="odom" />
  <arg name="laser_topic" default="scan" />
  <arg name="custom_param_file" default="$(find turtlebot_navigation)/param/dummy.yaml"/>

  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
    <rosparam file="$(find turtlebot_navigation)/param/costmap_common_params.yaml" command="load" ns="global_costmap" />
    <rosparam file="$(find turtlebot_navigation)/param/costmap_common_params.yaml" command="load" ns="local_costmap" />   
    <rosparam file="$(find turtlebot_navigation)/param/local_costmap_params.yaml" command="load" />   
    <rosparam file="$(find turtlebot_navigation)/param/global_costmap_params.yaml" command="load" />
    <rosparam file="$(find turtlebot_navigation)/param/dwa_local_planner_params.yaml" command="load" />
    <rosparam file="$(find turtlebot_navigation)/param/move_base_params.yaml" command="load" />
    <rosparam file="$(find turtlebot_navigation)/param/global_planner_params.yaml" command="load" />
    <rosparam file="$(find turtlebot_navigation)/param/navfn_global_planner_params.yaml" command="load" />
    <!-- external params file that could be loaded into the move_base namespace -->
    <rosparam file="$(arg custom_param_file)" command="load" />
    
    <!-- reset frame_id parameters using user input data -->
    <param name="global_costmap/global_frame" value="$(arg global_frame_id)"/>
    <param name="global_costmap/robot_base_frame" value="$(arg base_frame_id)"/>
    <param name="local_costmap/global_frame" value="$(arg odom_frame_id)"/>
    <param name="local_costmap/robot_base_frame" value="$(arg base_frame_id)"/>
    <param name="DWAPlannerROS/global_frame_id" value="$(arg odom_frame_id)"/>

    <remap from="cmd_vel" to="navigation_velocity_smoother/raw_cmd_vel"/>
    <remap from="odom" to="$(arg odom_topic)"/>
    <remap from="scan" to="$(arg laser_topic)"/>
  </node>
</launch>
           

這裡除了兩個為了使得運動平滑的launch檔案velocity_smoother.launch.xml和safety_controller.launch.xml之外還運作了move_base節點,因為之前測試的時候使用MIT的bag檔案我發現隻有運作kartoslam的包,但是沒有運作movebase的包

那麼之前測試不好的解釋有以下幾點

  1. 雷射資料和MIT的不一樣,MIT的雷射原資料好,我們的差
  2. 代碼中的參數調整不是很好(可能性小,因為直接使用kartoslam跑MITbag效果不錯)
  3. 周圍環境玻璃太多,環境複雜
  4. 我們實際launch檔案裡面有movebase,也許movebase會對結果有影響。

Karto_slam跑雷射雷達MITbag檔案

roscore

rosrun slam_karto slam_karto

rosbag play ~/bagfile/script/data.bag

rosrun rviz rviz

實際運作kartoslam在tb2上的代碼:

roscore

roslaunch turtlebot_bringup minimal.launch

roslaunch turtlebot_navigation rplidar_karto_demo.launch

roslaunch turtlebot_teleop keyboard_teleop.launch

roslaunch turtlebot_rviz_launchers view_navigation.launch

對了 在運作launch檔案的時候最好加一個 --screen 可以把每一個node的輸出顯示在終端

編寫launch

<launch>	
 指roslaunch語句的開始和結束。
 <node> 	
 這是對于節點運作的标簽。您可以更改功能包、節點名稱和執行名稱。
 <machine> 	 可以設定運作該節點的PC的名稱、address、ros-root和ros-package-path。
 <include> 	您可以加載屬于同一個功能包或不同的功能包的另一個launch,并将其作為一個launch
檔案來運作。
 <remap> 	
 可以更改節點名稱、話題名稱等等,在節點中用到的ROS變量的名稱。
 <env> 	
 設定環境變量,如路徑和IP(很少使用)。
 <param> 	
 設定參數名稱、類型、值等
 <rosparam> 	 可以像rosparam指令一樣,檢視和修改load、dump和delete等參數資訊。
 <group> 	
 用于分組正在運作的節點。
 <test> 用于測試節點。類似于<node>,但是有可以用于測試的選項。
 <arg> 	
 可以在launch檔案中定義一個變量,以便在像下面這樣運作時更改參數。
           

MIT資料測試:

rosbag play ~/bagfiles/script/data.bag

roslaunch turtlebot_rviz_launchers view_navigation.launch

自己節點運作:kartoslam.launch

<launch>
  <include file="$(find turtlebot_bringup)/launch/minimal.launch" />
  <include file="$(find turtlebot_navigation)/launch/rplidar_karto_demo.launch"/>
  <include file="$(find turtlebot_teleop)/launch/keyboard_teleop.launch"/>
</launch>
           

測試bug猜測:

  1. 雷射資料和MIT的不一樣,MIT的雷射原資料好,我們的差
  2. 代碼中的參數調整不是很好(可能性小,因為直接使用kartoslam跑MITbag效果不錯)
  3. 周圍環境玻璃太多,環境複雜
  4. 我們實際launch檔案裡面有movebase,也許movebase會對結果有影響。

雷射資料和MIT的不一樣,MIT的雷射原資料好,我們的差

  • 打開rviz檢視MIT雷射和我們的雷射資料的差别

    運作MITbag檔案的時候隻是單純的運作rosrun slam_karto slam_karto

    RVIZ中會顯示這些東西導緻看不到模型,localmap(當然也不需要)以及laserscan

    parameter [robot_description]does not exist,and was not found by searchParam()

    local map - costmap :No map received

    LaserScan:For frame[base_laser_link]:No transform to fixed frame [map].TF error:[Lookup would require extrapolation into the past.Requested time 238.889998999 but the earliest data is at time 1578367989.428750344,when looking up transfrom from frame [base_laser_link] to frame [map]

    是以應該是沒有釋出出baselink到laser的tf

    建立一個launch檔案 MIT.launch

<launch>
  <node pkg="tf" type="static_transform_publisher" name="base_to_laser" args="0.0 0.0 0.18 0 0.0 0.0 base_link laser 100"/>
  <node pkg="slam_karto" type="slam_karto" name="slam_karto" output="screen">
    <remap from="scan" to="scan"/>
    <param name="odom_frame" value="odom"/>
    <param name="map_update_interval" value="25"/>
    <param name="resolution" value="0.025"/>
  </node>
</launch>
           

和 kartoslam.launch唯一的差別就是沒有運作

<!-- Move base -->
  <include file="$(find turtlebot_navigation)/launch/includes/move_base.launch.xml"/>
           

這個launch檔案

roslaunch kartoslam MIT.launch --screen

rosbag play ~/bagfiles/script/data.bag

rviz 然後把Global Options中的fixed frameg改成baselinke

此次MIT資料運作使用這裡gif制作工具

在運作roslaunch kartoslam MIT.launch --screen的時候提示:

Warning: TF_OLD_DATA ignoring data from the past for frame base_link at time 147.46 according to authority unknown_publisher

Possible reasons are listed at http://wiki.ros.org/tf/Errors%20explained

at line 277 in /tmp/binarydeb/ros-kinetic-tf2-0.5.20/src/buffer_core.cpp

下面是MIT的雷射資料

kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。
kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。
kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。
kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。
kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。
kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。
kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。
kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。
kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。

他運作的時候也并沒有在一個地方繞環過久,直接走就可以了

我上一次運作錄下的bag檔案

kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。

可以很明顯的看出來,scan資料十分的卡頓,不流暢

至于

2. 代碼中的參數調整不是很好(可能性小,因為直接使用kartoslam跑MITbag效果不錯)

3. 周圍環境玻璃太多,環境複雜

4. 我們實際launch檔案裡面有movebase,也許movebase會對結果有影響。

實際檢視了一下雷達高度并沒有很多玻璃存在,從圖也可以看出,

kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。

這裡是接水的地方 但是其實裡面有物體存在,是以大部分并不造成很大影響

是以我認為很大的一個問題就是我們的雷射資料實在是太卡頓了,是以我打算單獨不跑kartoslam的記錄一下資料,順便不用ssh連結接受bag 直接儲存在本地,因為這個也可能是原因

不跑karto隻錄制資訊

規定一下路線,從工位中間開始接受雷達資料,然後走到多媒體那邊的空地中間掉頭,然後到另一邊盡頭走廊中間,然後往廁所岔路口掉頭回到工位。

結果發現的确是不運作kartoslam以及不用ssh接受bag而是儲存在本地,雷射資料連貫多了,不過因為地形的原因,在沙發、玻璃等地方很難找到有效的點。

接下來跑一跑這個記錄的bag在kartoslam上的效果。

最後bag建圖情況

kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。

這個圖依然是倒過來的 相當于把地圖放在玻璃桌子上,然後我們從下面看,不過問題依然很大,首先工位和沙發都是胡在一起,然後莫名其妙有很多小波紋,其次在L形拐角處,我們那邊本該檢測到的牆壁到了本該沒有牆壁的地方

kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。

以及這裡的電梯入口被堵住了。

kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。

這次沒有運作movebase,但是還是很差,感覺所有的結論都要從雷射和環境講起了。要更換一個比較簡單的環境比較好,其次,再看看哪些參數可以适應我們這種環境。

仔細分析一下會發現,這些在牆壁上一橫一橫的東西,

kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。

(電梯)

kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。

(衛生間岔路口)

kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。

四個工位處

貌似都是牆體或者平面出現的地方,我猜測是因為他沒有吧新的scan判定為原來第一次出現的平面,造成了這種會有很多平面,實際上隻有一個平面的存在。

kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。

然後我又跑了一次,竟然路徑變得不一樣了,而且上面這個地方是第一次走向廁所就有的,我在想會不會是的确有這個地方,這個牆,但是因為我搞不清楚他地圖

運作過程

kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。
kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。

是以現在有兩個疑點,到底 這個地圖是怎麼建構的,然後第二點是修改哪些參數能夠修改這種奇怪的波紋和地圖分布

終于找到問題根源啦!

我發現問題根源所在啦!

kartoslam找bug之行那麼之前測試不好的解釋有以下幾點編寫launch測試bug猜測:不跑karto隻錄制資訊終于找到問題根源啦!又出問題拉,出大問題。

又出問題拉,出大問題。

建圖到一半

Could not get robot pose, cancelling reconfiguration Extrapolation Error looking up robot pose: Lookup would require extrapolation into the past.

[ERROR] [1577803544.186413799]: Extrapolation Error looking up robot pose: Lookup would require extrapolation into the past. Requested time 1577803395.635771648 but the earliest data is at time 1577803534.160161966, when looking up transform from frame [base_footprint] to frame [map]

這個我之前也遇到過 有進行資料查詢

有說是主從機因為網絡原因導緻的時間不同步。

實驗1:修改local_costmap_params.yaml和global_costmap_params.yaml兩個檔案中的transform_tolerance=10(之前是2->5,現在->10)

實驗結果:

依然在建圖大部分之後

[ INFO] [1578456428.827163199]: Calling doSPA for loop closure
                  [ INFO] [1578456428.837986198]: Finished doSPA for loop closure
   [slam_karto-11] process has died [pid 13146, exit code -11, cmd /home/asber/turtlebot_ws/devel/lib/slam_karto/slam_karto scan:=scan __name:=slam_karto __log:=/home/asber/.ros/log/328a1216-31cb-11ea-8f97-28c2dd4c2a6d/slam_karto-11.log].
    log file: /home/asber/.ros/log/328a1216-31cb-11ea-8f97-28c2dd4c2a6d/slam_karto-11*.log
            [ERROR] [1578456438.366370194]: Kobuki : malformed sub-payload detected. [129][170][81 AA 55 4D 01 0F ]
                                     [ WARN] [1578456438.961491661]: Costmap2DROS transform timeout. Current time: 1578456438.9614, global_pose stamp: 1578456428.9330, tolerance: 10.0000
                              [ WARN] [1578456438.961598209]: Could not get robot pose, cancelling reconfiguration
                                    [ERROR] [1578456439.043270114]: Extrapolation Error looking up robot pose: Lookup would require extrapolation into the past.  Requested time 1578456428.932966528 but the earliest data is at time 1578456429.071418350, when looking up transform from frame [base_footprint] to frame [map]
           

那我們在本地建圖如何通過遙控鍵盤控制試試看效果怎麼樣。

果然在鍵盤單獨本地運作就不會出現問題。

那就是網絡延時造成的問題了

[ WARN] [1578669454.733878780]: Could not get robot pose, cancelling reconfiguration

[ERROR] [1578669455.533468334]: Extrapolation Error looking up robot pose: Lookup would require extrapolation into the past. Requested time 1578669101.339670111 but the earliest data is at time 1578669445.509893491, when looking up transform from frame [base_footprint] to frame [map]

有wiki上說是因為電腦的性能不夠,然後把一些可視化或者占據記憶體的程式取消之後就好了

繼續閱讀