想要进行一个完整的地图建立离不开以下几个模块:
1.坐标
2.激光数据
3.绘图算法
ROS工程可以从我的GitHub上面下载:https://github.com/LJianlin/ROS-SLAM-Gmapping 下载完成后可以拷贝到自己的ROS工作空间下,进行编译,编译过程中提示缺少什么,直接apt-get下载即可。
一、坐标的获取:
笔者这里使用的是Arduino单片机作为底层电机的控制板,进行电机编码器数据的获取和电机的驱动控制。然后将获得的编码器数据发送给ROS进行里程的转换,进而获得小车在地图上的坐标。具体代码见功能包。
二、激光数据的获取:
见我的另一篇博客:https://blog.csdn.net/liujianlin01/article/details/78518694
三、绘图算法:
笔者这里使用的是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显示的效果: