ros中kobuki(turtlebot)+rplidar 跑gmapping
舊篇:http://blog.csdn.net/zyh821351004/article/details/44103757#reply 時間有點老,當時知識描述只能這個程度,也就不改動那篇了,重新寫一篇。
由於手頭目前沒有kobuki了,就以自己的sdp來說明吧。
提示:ros中開源的package問題其實最好以開源的方式在github的issue提出來,也可以先到issue裡面找(包括closed的),再者可以直接向package的維護email求解(例如 rplidar_ros的維護郵箱[email protected]), 包括開源的程式不一定十分完美,你若發現bug可以fork,提交你的commit,
發pull request, 共同促package更加穩定。 其實遇到問題仔細看看相應的
1. 框架搭建說明:
裝置: 底盤 : 採集碼盤資料 與執行控制指令來運動 : 你要提供 /odom 與 /cmd_vel 這樣的資料介面
rplidar: 採集鐳射測距資料 你要提供 /scan 資料介面
利用現有package搭建工程你首先需要維護好兩個東西: TF tree 和 topic 資料.
2. 搭建其實很簡單:
維護好你的tf tree. 因為每個topic資料都是相對一個frame ID 的,而資料之間的關聯就需要 tf樹的變換關係確定。 如果你啟動移動機器人時使用的不是模型(URDF檔案中已經描述關係)自帶的感測器,
例如 turtlebot 中就沒有rplidar 雷達, 你就需要指定雷達的frame id (/laser) 相對基座tf樹中的變換關係。
也就是你要建立一個靜態的tf變換髮布出去。當然你也可以像舊篇一樣修改turtlebot的urdf模型檔案等等(這也就是為什麼kinect模擬2D laser時為什麼不需要新增static_transform_publisher的原因)。
<node name="base2laser" pkg="tf" type="static_transform_publisher" args="-0.15 0 0 0 0 0 1 /base_link /laser 50"/> // 其中的引數請自行檢視wiki瞭解詳細具體的說明
topic資料介面的問題,你需要依據gmapping的實際需要, 剛好他需要的就是/odom /scan 。與原package的node輸出相一致。如果不一致,你就需要採取remap的形式修改對應介面(不建議直接在原始碼裡修改)
topic的 對映類似於: <remap from="scan" to="$(arg scan_topic)"/> ;相當於原始碼中的”scan“ 變成了$(arg scan_topic) 你之前的定義。
TF與topic相一致了,演算法基本能跑起來。但是跑起來的實際效果你得留意3中注意要點和自己對引數的理解和不斷嘗試。
3. 利用rplidar搭建gmapping 你需要注意點:
3.1 laser 在base 上面的安裝你注意了嗎:
A2參考: http://blog.csdn.net/zyh821351004/article/details/51169334
A1常見 rplidar_ros 裡面的圖
3.2 埠許可權問題:
rplidar_ros 裡面有相應的script檔案,你可以瞭解udev相關說明作相應配置。
多USB竄擾(ttyUSB0會依據你接入先後執行分配),其實你可以依據埠號繫結重對映,參見: http://blog.csdn.net/zyh821351004/article/details/50596171
3.3 雷達啟動不轉,health state 異常:
多半是你這usb供電問題,用主機後背USB口試試。
3.4 很多問題可以關注gitbub中issue , 裡面的wiki也是有相應的一些說明的。
issue: https://github.com/robopeak/rplidar_ros/issues?q=is%3Aopen+is%3Aissue (可以留意closed中問題)
wiki: https://github.com/robopeak/rplidar_ros/wiki
3.5 gmapping中記得修改鐳射資料有效的最大值配置
<param name="maxUrange" value="6.0"/>
3.6 理解每個引數的意義
3.7 跑navigation時。如果local_costmap值全零,
參看下 costmap_common_params.yaml 檔案
依據你前面tf設定修改相應的高度值。
min_obstacle_height: 0.0 #0.25
max_obstacle_height: 2.0 #0.35
3.8 出錯性問題請求別人幫忙注意事項
一定要將你的這些資訊暴露給技術支援:
1)你執行相關的所有launch檔案(除非你都理解,個別無關不附上)
2)你的TF tree : rosrun tf view_frames
3) 你的topic 資訊: rqt_graph ; rostopic list
4) package你是否保證原封不動,無法確認記得檢視你的git log ,附上對應package的commit ID
3.9 你懷疑ubuntu下不正常,請自行到windows下去測試官方的。
4. 貼上我的launch檔案(移動底盤請結合你自己的自行改動):
僅作參考比對。
啟動移動底盤
<launch>
<!-- set the parameters for the maximal and minimal velocity of the motor-->
<param name="max_vel_motor" value=".16"/>
<param name="min_vel_motor" value=".01"/>
<param name="in_place_rotation_factor" value="1.0"/>
<!-- set the parameters for the width between the wheels-->
<param name="width" value=".233"/>
<!-- set the parameters for whether use the odometry model or not (velocity model) -->
<param name="flag_use_odom" value="true"/>
<node name="base_controller" pkg="control_base" type="control_base_node"/>
<node name="footprint2base" pkg="tf" type="static_transform_publisher" args="0 0 0.05 0 0 0 1 /base_footprint /base_link 50"/>
<node name="base2laser" pkg="tf" type="static_transform_publisher" args="-0.15 0 0 0 0 0 1 /base_link /laser 50"/>
<node name="motor_actuator" pkg="actuate_motors" type="actuate_motors_node" args="-p /dev/slamtec_base_ status" />
</launch>
啟動rplidar
<launch>
<node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen">
<param name="serial_port" type="string" value="/dev/ttyUSB0"/>
<param name="serial_baudrate" type="int" value="115200"/>
<param name="frame_id" type="string" value="laser"/>
<param name="inverted" type="bool" value="false"/>
<param name="angle_compensate" type="bool" value="true"/>
</node>
</launch>
啟動gmapping
<launch>
<param name="use_sim_time" value="false"/>
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
<!--remap from="scan" to="base_scan"/-->
<param name="map_update_interval" value="5.0"/>
<param name="maxUrange" value="6.0"/>
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="1"/>
<param name="lstep" value="0.05"/>
<param name="astep" value="0.05"/>
<param name="iterations" value="5"/>
<param name="lsigma" value="0.075"/>
<param name="ogain" value="3.0"/>
<param name="lskip" value="0"/>
<param name="minimumScore" value="50"/>
<param name="srr" value="0.1"/>
<param name="srt" value="0.2"/>
<param name="str" value="0.1"/>
<param name="stt" value="0.2"/>
<param name="linearUpdate" value="1.0"/>
<param name="angularUpdate" value="0.5"/>
<param name="temporalUpdate" value="3.0"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="30"/>
<param name="xmin" value="-5.0"/>
<param name="ymin" value="-5.0"/>
<param name="xmax" value="5.0"/>
<param name="ymax" value="5.0"/>
<param name="delta" value="0.05"/>
<param name="llsamplerange" value="0.01"/>
<param name="llsamplestep" value="0.01"/>
<param name="lasamplerange" value="0.005"/>
<param name="lasamplestep" value="0.005"/>
</node>
<node name="visualizer" pkg="rviz" type="rviz" args="-d $(find sdp_navigation)/rviz/navigation.rviz"/>
</launch>