导航小车利用laser_scan_matcher实现建图

硬件搭配(建图部分跟硬件关系不大)

1.电机:随意,能pid调速就好

2.编码器:精度不用太高,能用于pid控制就好,我们用的是13线的一个编码器,精度不算高

3.激光雷达:使用的是N10单线激光雷达(雷达能放在最顶上就放在最顶上)

4.下位机:选用的arduino Uno +串口通信的搭配(arduino Uno的全局变量空间太小了,于是我们写了一个arduino和上位机的串口通讯来省内存,有条件的可以直接换一块比较好的下位机,那样可以直接在下位机里面开ros节点,会方便很多,因为串口通信真的很难调)

5.上位机:树莓派

6.电机驱动模块:L298N

代码部分

建图

        实现导航的首要要求是有一个地图,主流的建图方法是使用slam gmapping ,gmapping本身不需要你很了解他,掉包就好,首先要安装。

sudo apt-get install ros-noetic-gmapping //要注意版本

 安装了以后就不用管它了,直接安装laser_scan_matcher(咋安装的忘了),laser_scan_matcher是一个利用激光雷达信息实现一个激光雷达里程计的插件,在这里奉劝各位不要用车子编码器的信息做里程计,因为编码器存在一个累计误差,分辨率往往达不到里程计的那种要求,往往你车子直着走你的里程计显示你已经歪了,激光里程计可以同时实现定位和建图,非常方便。

laser_scan_matcher的配置

只用配置demo_gmapping.launch 这个文件,我下载下来是没法直接鼠标打开的,后来无意间这样打开了

gedit demo_gmapping.launch

然后我修改代码如下:

<!-- 
Example launch file: uses laser_scan_matcher together with
slam_gmapping 
-->

<launch>

  #### start laser ###########################//这里是雷达包,我是找商家要的ros包,这里直接调用就好
  <node pkg="lsn10" type="lsn10" name="lsn10" output="screen">
      <param name="scan_topic" value="scan"/> <!--设置激光数据topic名称-->
        <param name="frame_id" value="base_laser"/> <!--激光坐标-->
        <param name="serial_port" value="/dev/ttyUSB0"/> <!--雷达连接的串口-->
        <param name="baud_rate" value="230400" /> <!--雷达连接的串口波特率-->
        <param name="min_distance" value="0.0"/> <!--最小扫描距离-->
        <param name="max_distance" value="30.0"/> <!--最大扫描距离-->

        <!-- 镭神雷达参数 -->
        <param name="truncated_mode" value="0"/>    <!--0:不使用过滤 1:使用过滤-->
        <rosparam param="disable_min">[90]</rosparam> <!--需要过滤(屏蔽)的角度初始值,允许多角度过滤-->
        <rosparam param="disable_max">[270]</rosparam> <!--需要过滤(屏蔽)的角度结束值,允许多角度过滤-->
 </node>
  #### set up data playback from bag #############################

  <param name="/use_sim_time" value="false"/>

  

  #### publish an example base_link -> laser transform ###########

  <node pkg="robot_setup_tf" type="tf_broadcaster" name="tf_broadcaster" output="screen">
    
 </node>//这里是用来设置tf树的包,跑起来这个launch文件以后是要有一个map->odom->base_link->base_footprint->base_laser 的tf树
  
  #### start rviz ################################################

  <node pkg="rviz" type="rviz" name="rviz" 
    args="-d $(find laser_scan_matcher)/demo/demo_gmapping.rviz"/>

  #### start the laser scan_matcher ##############################

  <node pkg="laser_scan_matcher" type="laser_scan_matcher_node" 
    name="laser_scan_matcher_node" output="screen">

    <param name="fixed_frame" value = "odom"/>
    <param name="max_iterations" value="10"/>
    <param name = "base_frame" value = "base_link"/>
    <param name= "use_odom" value="false"/>
    <param name= "publy_pose" value= "true"/>
    <param name="publy_tf" value="true"/>//这五行要加上,要不然报错

  </node>

  #### start gmapping ############################################

  <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
    <param name="map_udpate_interval" value="1.0"/>
    <param name="maxUrange" value="5.0"/>
    <param name="sigma" value="0.1"/>
    <param name="kernelSize" value="1"/>
    <param name="lstep" value="0.15"/>
    <param name="astep" value="0.15"/>
    <param name="iterations" value="1"/>
    <param name="lsigma" value="0.1"/>
    <param name="ogain" value="3.0"/>
    <param name="lskip" value="1"/>
    <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="0.4"/>
    <param name="resampleThreshold" value="0.5"/>
    <param name="particles" value="10"/>
    <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.02"/>
    <param name="llsamplerange" value="0.01"/>
    <param name="llsamplestep" value="0.05"/>
    <param name="lasamplerange" value="0.05"/>
    <param name="lasamplestep" value="0.05"/>
  </node>

</launch>

 然后接上雷达roslaunch就好啦。在rviz里面会有扫描出来的图,带着雷达走就可以完成建图

下面是我的tf_broadcaster的代码

 

#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
    int main(int argc, char** argv){
      ros::init(argc, argv, "robot_tf_publisher");
      ros::NodeHandle n;
    
      ros::Rate r(100);
    
     tf::TransformBroadcaster broadcaster;
   
     while(n.ok()){
       broadcaster.sendTransform(
         tf::StampedTransform(
           tf::Transform(tf::Quaternion(0, 0, 0, 1), tf::Vector3(0.0, 0.0, -0.2)),
           ros::Time::now(),"base_link", "base_footprint"));
           broadcaster.sendTransform(
         tf::StampedTransform(
           tf::Transform(tf::Quaternion(0, 0, 0, 1), tf::Vector3(0.0, 0.0, -0.2)),
           ros::Time::now(),"base_footprint", "base_laser"));
       r.sleep();
     }
   }

第一次写,有问题请大家指出。

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值