实现需要:
有提供里程计odom的小车一辆,一个激光,一台电脑(我是用EAI小车和R2000倍加福激光)
如果用的是r2000 链接在右边----> R2000激光雷达驱动安装
在用gampping前确保激光有数据
开始用gammping实现建图
gmapping开源的代码,只要改里面的参数就行非常的方便,话不多说上代码
<!--这是小车的驱动程序,这里会提供odom到base_link的坐标转换
可以用rosrun rqt_tf_tree rqt_tf_tree 查看tf树中的坐标转换关系
如果你的小车没有提供odom——>base_link的
如果没有odom——>base_link的tf转换需要自己写一个tf转换
-->
<launch>
<node name="arduino" pkg="dashgo_bringup" type="dashgo_driver.py" output="screen">
<rosparam file="$(find dashgo_bringup)/config/my_dashgo_params.yaml" command="load" />
</node>
<!-- 激光加载
注意这个frame_id 我这里的缺省值是scan,可以自行修改,这个id在gmapping_demo.launch有用到-->
<arg name="frame_id" default="scan"/>
<arg name="scanner_ip" default="192.168.31.158"/>
<arg name="scan_frequency" default="35"/>
<arg name="samples_per_scan" default="3600"/>
<!-- R2000 Driver -->
<node pkg="pepperl_fuchs_r2000" type="r2000_node" name="r2000_node" respawn="true" output="screen">
<param name="frame_id" value="$(arg frame_id)"/>
<param name="scanner_ip" value="$(arg scanner_ip)"/>
<param name="scan_frequency" value="$(arg scan_frequency)"/>
<param name="samples_per_scan" value="$(arg samples_per_scan)"/>
</node>
<!-- 这是base_link——>激光laser的tf坐标转换
/base_footprint /scan 40 注意base_footprint要和gammping.launch文件中base_frame的值对应
而这个scan要和激光的rame_id对应
-->
<node pkg="tf" type="static_transform_publisher" name="base_link_to_laser4" args="0.0 0.0 0.44 0.0 0.0 0.0 /base_footprint /scan 40" />
<!-- 小车的描述文件-->
<include file="$(find dashgo_description)/launch/dashgo_description.launch"/>
<!-- 启动gammping-->
<include file="$(find dashgo_nav)/launch/gmapping.launch"/>
</launch>
gammping.launch需要修改的部分
<!--base_frame的指要和gammping_demo里的/base_footprint /scan 40对应 -->
<arg name="base_frame" default="base_footprint"/>
<arg name="odom_frame" default="odom"/>
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
<!-- 这句话 to="/r2000_node/scan"/ 要看自己的激光的节点名字
如果不知道,可以单独运行激光,然后输入rostopic list查看激光信息
-->
<remap from="scan" to="/r2000_node/scan"/>
<param name="pub_map_odom_transform" value="true"/>
<param name="base_frame" value="$(arg base_frame)"/>
<param name="odom_frame" value="$(arg odom_frame)"/>
单独运行激光后得到的激光信息
remap from=“scan” to="/r2000_node/scan" 这个就是从这里来的
tf树可能和你们的不一样其实只要有右边一列通就可以建图了
各个节点的关系图
最后的建图效果
附上全部的gmapping.launch
<launch>
<arg name="base_frame" default="base_footprint"/>
<arg name="odom_frame" default="odom"/>
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
<param name="pub_map_odom_transform" value="true"/>
<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="-50.0"/>
<param name="ymin" value="-50.0"/>
<param name="xmax" value="50.0"/>
<param name="ymax" value="50.0"/>
make the starting size small for the benefit of the Android client's memory...
-->
<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="/r2000_node/scan"/>
</node>
</launch>```