• 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图



    前言

    最近在学习Ros和激光SLam,反复折腾了一段时间,有了一点小结果,于是想分享一点经验。
    本文是基于二维雷达Rplidar,使用Hector_slam算法在Ros中建图,同时在PC和Nvidia Jetson Xavier配置了多机通信, 我的电脑PC当从机,Nvidia Jetson Xavier当主机来跑雷达。
    ubuntu的版本为20.04


    一、ROS分布式通信(配置多机通信)

    1.简介

    ROS是一个分布式计算环境。一个运行中的ROS系统可以包含分布在多台计算机上多个节点。根据系统的配置方式,任何节点可能随时需要与任何其他节点进行通信。因此,ROS对网络配置有某些要求:
    1.所有端口上的所有机器之间必须有完整的双向连接。
    2. 每台计算机必须通过所有其他计算机都可以解析的名称来公告自己

    2.步骤

    2.1 准备

    先要保证不同计算机处于同一网络中,最好分别设置固定IP,如果为虚拟机,需要将网络适配器改为桥接模式;
    可以用PC或者Nvidia Jetson Xavier来开热点或者是连网线,让两台设备处于同一网络下,然后需要将两台设备的IP地址处于同一网段。
    如果是用分享热点的话不需要修改IP地址,两台设备的IP地址会自动在同一网段,而采用网线连接的方法则需要手动设置IP地址。

    ThinkPad-E480:~$ ifconfig //查看IP地址
    
    • 1

    我是用PC来热点给Nvidia连接,PC的IP地址如下所示:

    wlp5s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.1.111  netmask 255.255.255.0  broadcast 192.168.1.255
            inet6 fe80::6cab:8a8f:7d7c:c5d9  prefixlen 64  scopeid 0x20<link>
            ether 3c:91:80:5c:01:db  txqueuelen 1000  (以太网)
            RX packets 132659  bytes 106070983 (106.0 MB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 85589  bytes 64277025 (64.2 MB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在Nvidia上面也可以用同样的方法,我的Nvidia的IP地址为:192.168.1.144
    于是两个设备就在同一个网段中。

    2.2 修改配置文件

    分别修改不同计算机的 /etc/hosts 文件,在该文件中加入对方的IP地址和计算机名:

    ThinkPad-E480:~$ cd /etc
    ThinkPad-E480:/etc$ sudo gedit hosts
    
    • 1
    • 2

    主机端:
    从机的IP 从机计算机名

    从机端:
    主机的IP 主机计算机名

    设置完毕后,可以通过 ping 命令测试网络通信是否正常。

    
    
        IP地址查看名: ifconfig
    
        计算机名称查看: hostname
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.3配置主机IP

    配置主机IP,打开ubuntu中的文件,按住键盘上的ctrl+h,就会在文件中显示隐藏文件 .bashrc
    在这里插入图片描述打开.bashrc文件追加

    export ROS_MASTER_URI=http://主机IP:11311
    export ROS_HOSTNAME=主机IP
    
    
    • 1
    • 2
    • 3

    然后在终端中刷新环境

    ThinkPad-E480:~$ source ~/.bashrc 
    
    • 1

    2.4配置从机IP

    也是和配置主机同样的方法,打开.bashrc文件追加内容,但是从机可以有多台,每台都做如下设置:
    打开.bashrc 追加

    export ROS_MASTER_URI=http://主机IP:11311
    export ROS_HOSTNAME=从机IP
    
    
    • 1
    • 2
    • 3

    然后在终端中刷新环境

    ThinkPad-E480:~$ source ~/.bashrc 
    
    • 1

    这样就完成了多机通信的配置,有一个地方需要注意 roscore必须由主机来启动

    二、RPlidar的使用教程

    关于RPlidar激光雷达,是有现成的功能包可以调用。

    1.创建环境

    打开一个终端,创建ros工作空间

    mkdir -p ~/turtlebot_ws/src
    cd ~/turtlebot_ws/src
    
    
    • 1
    • 2
    • 3

    2.下载激光雷达的功能包

    再之前进入的turtlebot_ws/src目录下,输入如下命令

    git clone https://github.com/ncnynl/rplidar_ros.git
    
    • 1

    rplidar的ros功能包就会出现在src目录下。

    3.编译

    回到turtlebot_ws目录下

    cd ~/turtlebot_ws
    
    • 1

    编译工作空间

    catkin_make
    
    • 1

    当编译结束后,在 turtlebot_ws 目录下就会出现 devel 和 build 两个文件夹
    在这里插入图片描述

    4.启动雷达

    首先将雷达的USB连接到Nvidia上,并查看使用那个USB口,在给予相应USB口权限。

    ls -l /dev |grep ttyUSB //查看USB口
    sudo chmod 777 /dev/ttyUSB0 // 一般为USB0
    
    • 1
    • 2

    回到turtlebot_ws 目录下,刷新环境变量

    source /devel/setup.bash
    
    • 1

    启动launch文件即可运行雷达并打开Rviz查看

    $ roslaunch rplidar_ros view_rplidar.launch
    
    • 1

    三、Hector的使用教程

    hector在ROS中也有集成好的功能包,直接调用即可。

    1.下载hector功能包

    进入turtlebot_ws /src目录下,下载hector功能包

     cd  /turtlebot_ws/src
     git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam.git
    
    • 1
    • 2

    在turtlebot_ws /src目录下,就会有两个功能包,一个是激光雷达,一个是hector。
    在这里插入图片描述

    2.编译

    回到turtlebot_ws 目录下,编译。

    cd ..
    catkin_make
    
    • 1
    • 2

    同样地,查询雷达是连接的那个USB口,给予相应USB口权限

    ls -l /dev |grep ttyUSB //查看USB口
    sudo chmod 777 /dev/ttyUSB0 // 一般为USB0
    
    • 1
    • 2

    3.添加launch文件

    还需要给hector添加launch文件,进入turtlebot_ws / src / rplidar_ros / launch 文件夹内,添加一个launch文件

    cd 	turtlebot_ws/src/ rplidar_ros/launch
    touch hector_mapping_demo.launch
    
    • 1
    • 2

    在hector_mapping_demo.launch内添加如下内容:

    <launch><node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" output="screen"><param name="pub_map_odom_transform" value="true"/><param name="map_frame" value="map" /><param name="base_frame" value="base_link" /><param name="odom_frame" value="base_link" /><param name="use_tf_scan_transformation" value="true"/><param name="use_tf_pose_start_estimate" value="false"/><param name="map_resolution" value="0.05"/><param name="map_size" value="2048"/><param name="map_start_x" value="0.5"/><param name="map_start_y" value="0.5" /><param name="laser_z_min_value" value = "-1.0" /><param name="laser_z_max_value" value = "1.0" /><param name="map_multi_res_levels" value="2" /><param name="map_pub_period" value="2" /><param name="laser_min_dist" value="0.4" /><param name="laser_max_dist" value="5.5" /><param name="output_timing" value="false" /><param name="pub_map_scanmatch_transform" value="true" /><param name="update_factor_free" value="0.4"/><param name="update_factor_occupied" value="0.7" /><param name="map_update_distance_thresh" value="0.2"/><param name="map_update_angle_thresh" value="0.06" /><param name="advertise_map_service" value="true"/><param name="scan_subscriber_queue_size" value="5"/><param name="scan_topic" value="scan"/></node><node pkg="tf" type="static_transform_publisher" name="base_to_laser_broadcaster" args="0 0 0 0 0 0 /base_link /laser 100"/><node pkg="rviz" type="rviz" name="rviz" args="-d $(find hector_slam_launch)/rviz_cfg/mapping_demo.rviz"/>
    </launch>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    回到 turtlebot_ws 目录下,刷新环境变量

    source /turtlebot_ws/devel/setup.bash
    
    • 1

    4.分别启动雷达和hector的launch文件

    在主机(nvidia)上启动雷达的launch文件

    roslaunch rplidar_ros rplidar.launch
    
    • 1

    在从机上启动hector的launch文件

    roslaunch rplidar_ros rplidar.launch
    
    • 1

    就可以在从机的Rviz上看到雷达建图
    在这里插入图片描述


    总结

    在使用rplidar基于hector_slam的建图过程中,都有已经写好的功能包可以调用,无需重复造轮子。
    在rqt_graph中可以清楚的看到,雷达的节点(rplidarnode)在发布 /scan 话题,hector的节点(hector_mapping)会订阅 /scan 话题,这也就是把雷达的数据通过rplidar功能包发给hector功能包,进行运算后来建图
    在这里插入图片描述

  • 相关阅读:
    python
    GO微服务实战第三节 微服务架构是如何演进的?
    移远EC600U-CN开发板 11.17
    Kutools for Excel 结合 300 多种高级功能和工具
    Java 24 Design Pattern 之 观察者模式
    Ubuntu MySQL
    外滩大会今日开幕 近20位“两院”院士、诺贝尔奖和图灵奖得主齐聚
    Flutter splash 屏幕
    【数据结构】详解二叉树之堆
    leetcode刷题记录
  • 原文地址:https://blog.csdn.net/weixin_43903002/article/details/127802613