1. 程式人生 > >ros中kobuki(turtlebot)+rplidar 跑gmapping

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更加穩定。  其實遇到問題仔細看看相應的

wiki說明一般也會有幫助。

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>