文章目錄
- 那麼之前測試不好的解釋有以下幾點
- 編寫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的包
那麼之前測試不好的解釋有以下幾點
- 雷射資料和MIT的不一樣,MIT的雷射原資料好,我們的差
- 代碼中的參數調整不是很好(可能性小,因為直接使用kartoslam跑MITbag效果不錯)
- 周圍環境玻璃太多,環境複雜
- 我們實際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猜測:
- 雷射資料和MIT的不一樣,MIT的雷射原資料好,我們的差
- 代碼中的參數調整不是很好(可能性小,因為直接使用kartoslam跑MITbag效果不錯)
- 周圍環境玻璃太多,環境複雜
- 我們實際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的雷射資料

他運作的時候也并沒有在一個地方繞環過久,直接走就可以了
我上一次運作錄下的bag檔案
可以很明顯的看出來,scan資料十分的卡頓,不流暢
至于
2. 代碼中的參數調整不是很好(可能性小,因為直接使用kartoslam跑MITbag效果不錯)
3. 周圍環境玻璃太多,環境複雜
4. 我們實際launch檔案裡面有movebase,也許movebase會對結果有影響。
實際檢視了一下雷達高度并沒有很多玻璃存在,從圖也可以看出,
這裡是接水的地方 但是其實裡面有物體存在,是以大部分并不造成很大影響
是以我認為很大的一個問題就是我們的雷射資料實在是太卡頓了,是以我打算單獨不跑kartoslam的記錄一下資料,順便不用ssh連結接受bag 直接儲存在本地,因為這個也可能是原因
不跑karto隻錄制資訊
規定一下路線,從工位中間開始接受雷達資料,然後走到多媒體那邊的空地中間掉頭,然後到另一邊盡頭走廊中間,然後往廁所岔路口掉頭回到工位。
結果發現的确是不運作kartoslam以及不用ssh接受bag而是儲存在本地,雷射資料連貫多了,不過因為地形的原因,在沙發、玻璃等地方很難找到有效的點。
接下來跑一跑這個記錄的bag在kartoslam上的效果。
最後bag建圖情況
這個圖依然是倒過來的 相當于把地圖放在玻璃桌子上,然後我們從下面看,不過問題依然很大,首先工位和沙發都是胡在一起,然後莫名其妙有很多小波紋,其次在L形拐角處,我們那邊本該檢測到的牆壁到了本該沒有牆壁的地方
以及這裡的電梯入口被堵住了。
這次沒有運作movebase,但是還是很差,感覺所有的結論都要從雷射和環境講起了。要更換一個比較簡單的環境比較好,其次,再看看哪些參數可以适應我們這種環境。
仔細分析一下會發現,這些在牆壁上一橫一橫的東西,
(電梯)
(衛生間岔路口)
四個工位處
貌似都是牆體或者平面出現的地方,我猜測是因為他沒有吧新的scan判定為原來第一次出現的平面,造成了這種會有很多平面,實際上隻有一個平面的存在。
然後我又跑了一次,竟然路徑變得不一樣了,而且上面這個地方是第一次走向廁所就有的,我在想會不會是的确有這個地方,這個牆,但是因為我搞不清楚他地圖
運作過程
是以現在有兩個疑點,到底 這個地圖是怎麼建構的,然後第二點是修改哪些參數能夠修改這種奇怪的波紋和地圖分布
終于找到問題根源啦!
我發現問題根源所在啦!
又出問題拉,出大問題。
建圖到一半
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上說是因為電腦的性能不夠,然後把一些可視化或者占據記憶體的程式取消之後就好了