ROS下使用鐳射雷達RPLIDAR-A2進行SLAM完成地圖的構建
想要進行一個完整的地圖建立離不開以下幾個模組:
1.座標
2.鐳射資料
3.繪圖演算法
ROS工程可以從我的GitHub上面下載:https://github.com/LJianlin/ROS-SLAM-Gmapping 下載完成後可以拷貝到自己的ROS工作空間下,進行編譯,編譯過程中提示缺少什麼,直接apt-get下載即可。
一、座標的獲取:
筆者這裡使用的是Arduino微控制器作為底層電機的控制板,進行電機編碼器資料的獲取和電機的驅動控制。然後將獲得的編碼器資料傳送給ROS進行里程的轉換,進而獲得小車在地圖上的座標。具體程式碼見功能包。
三、繪圖演算法:
筆者這裡使用的是Gmapping演算法,在ROS下已經有封裝好的包可以直接使用。但是要設定一系列的引數,這也是構建地圖最麻煩的地方。
1.建立鐳射雷達(Rplidar)的串列埠別名
確認idVendor和idProduct,ID後面的部分idVendor:idProduct
$ lsusb
Bus 001 Device 006: ID 10c4:ea60
新建 /etc/udev/rules.d/rplidar.rules檔案,內容如下:(別名為rplidar,實際名稱為:/dev/rplidar)
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666", GROUP:="dialout", SYMLINK+="rplidar"
增加當前使用者對串列埠的預設訪問許可權並使UDEV配置生效:(重啟電腦使串列埠的預設訪問許可權生效)
$ sudo usermod -a -G dialout 使用者名稱
$ sudo service udev reload
$ sudo service udev restart
2.製作雷達驅動啟動檔案
複製下載的雷達驅動包裡的rplidar.launch到rplidar_laser.launch,並增加TF定義
$ roscd turtlebot_navigation
$ mkdir -p laser/driver
$ sudo cp ~/catkin_ws/src/rplidar_ros/launch /rplidar.launch laser/driver/rplidar_laser.launch
開啟rplidar_laser.launch,修改完整程式碼如下:
<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>
<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"/>
</launch>
其中檢視frame_id是否指定為laser,檢視serial_port是否指定正確埠,增加TF,修改為args=”0.0 0.0 0.18 0 0.0 0.0 為自己雷達的實際安裝位置。假設底盤的中心點為0,雷達放在機器人托盤中心位置,X為0,高度為18CM,Z為0.18m,TF的單位使用米,測量單位是CM
3.增加dis_gmapping.launch檔案,用於啟動gmapping。
輸入內容:
<?xml version="1.0"?>
<launch>
<!-- arduino.launch-->
<node name="arduino" pkg="ros_arduino_python" type="arduino_node.py" output="screen">
<rosparam file="$(find ros_arduino_python)/config/my_arduino_params.yaml" command="load" />
</node>
<!-- rplidar_gmapping.launch-->
<!-- Define laser type-->
<arg name="laser_type" default="rplidar" />
<!-- laser driver -->
<include file="$(find slam_gampping)/laser/$(arg laser_type)_laser.launch" />
<!-- Gmapping -->
<arg name="custom_gmapping_launch_file" default="$(find slam_gampping)/launch/$(arg laser_type)_gmapping.launch.xml"/>
<include file="$(arg custom_gmapping_launch_file)"/>
<!-- Move base -->
<include file="$(find slam_gampping)/launch/move_base.launch.xml"/>
<!-- diaplay.launch-->
<arg name="model" default="$(find robot1_description)/urdf/robot1.urdf" />
<arg name="gui" default="False" />
<param name="robot_description" textfile="$(arg model)" />
<param name="use_gui" value="$(arg gui)"/>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.rviz" />
<!-- joy_node.py-->
<node name="joystick" pkg="joy" type="joy_node" >
<param name="deadzone" value="0.0" />
</node>
<!-- cmd_control.py-->
<node name="cmd_control" pkg="cmd_control" type="cmdtest.py" >
</node>
</launch>
4.下載turtlebot_navigation功能包,apt-get直接下載
增加rplidar_gmapping.launch.xml檔案,執行gmapping建圖
$ roscd turtlebot_navigation
$ touch launch/includes/gmapping/rplidar_gmapping.launch.xml
$ rosed launch/includes/gmapping/rplidar_gmapping.launch.xml
輸入內容:
<launch>
<arg name="scan_topic" default="scan" />
<arg name="base_frame" default="base_link"/>
<arg name="odom_frame" default="odom"/>
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
<param name="base_frame" value="$(arg base_frame)"/>
<param name="odom_frame" value="$(arg odom_frame)"/>
<param name="map_update_interval" value="0.01"/>
<param name="maxUrange" value="4.0"/>
<param name="maxRange" value="5.0"/>
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="3"/>
<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="30"/>
<param name="srr" value="0.01"/>
<param name="srt" value="0.02"/>
<param name="str" value="0.01"/>
<param name="stt" value="0.02"/>
<param name="linearUpdate" value="0.05"/>
<param name="angularUpdate" value="0.0436"/>
<param name="temporalUpdate" value="-1.0"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="8"/>
<param name="xmin" value="-1.0"/>
<param name="ymin" value="-1.0"/>
<param name="xmax" value="1.0"/>
<param name="ymax" value="1.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"/>
<remap from="scan" to="$(arg scan_topic)"/>
</node>
</launch>
測試:
$ roslaunch slam_gmapping dis_gmapping.launch
構建地圖結束儲存地圖
$ mkdir -p ~/map
$ rosrun map_server map_saver -f ~/map/rplidar_gmapping
生成的地圖檔案,可以用影象瀏覽器開啟檢視。
Rviz顯示的效果: