• 从零开始的ROS学习之仿真+SLAM


    在赶毕设文档指导日志的时候才想起来我去年居然写了博客,我恨我怎么懒狗了就写了这么点,今年1月写的现在才想起来orz
    赶紧发出来补充一点毕设文档指导日志的内容,麻了

    首先,为了避免每次新终端都要注册先在 ~/.zshrc 注册一下

    vim ~/.zshrc   
    
    #最后一行加上,注意换成你自己的工作目录XXX/devel/setup.zsh,如果你的终端是bash,那么为XXX/devel/setup.bash
    source ~/workspace/slam_learn/devel/setup.zsh
    
    source ~/.zshrc
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    下载功能包

    导航元功能包

     sudo apt-get install ros-melodic-navigation
    
    • 1

    slam算法功能包

    ROS开源社区中汇集了多种SLAM算法,可以直接使用或进行二次开发:

    gmapping

    Gmapping是一个基于2D激光雷达使用RBPF(Rao-Blackwellized Particle Filters)算法完成二维栅格地图构建的SLAM算法,这个包最为常用和成熟,所以先用它完成一个基础demo。

    http://wiki.ros.org/gmapping

    sudo apt-get install ros-melodic-slam-gmapping
    
    • 1

    hector-slam功能包

    hector_slam功能包使用高斯牛顿方法,不需要里程计数据,只根据激光信息便可构建地图。

    sudo apt-get install ros-melodic-hector-slam
    
    • 1

    orb_salam 功能包

    orb_slam 是一个基于特征点的单目slam,它还可以构建三维点云地图,能够实时解算摄像机的移动轨迹。

    git clone https://github.com/raulmur/ORB_SLAM2.git
    
    sudo apt-get install libboost-all-dev libblas-dev liblapack-dev
    
    # 数学运算库
    git clone https://gitlab.com/libeigen/eigen.git
    
    #进入eigen源码目录,完成编译安装
    mkdir build
    cd build
    cmake ..
    make
    sudo make install
    
    # Pangolin包
    git clone https://github.com/stevenlovegrove/Pangolin.git
    mkdir build
    cd build
    cmake ..
    make -j
    
    #进入orb_slam2 同样操作
    mkdir build
    cd build
    cmake -DCPP11_NO_BOOST=1 ..
    make
    sudo make install
    
    • 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

    基于激光雷达的gmapping SLAM仿真

    在Gazebo中仿真SLAM
    启动Gazebo仿真环境,rviz同步显示雷达传感器检测的环境地图

    roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
    
    • 1

    在这里插入图片描述

    启动gmapping,通过键盘控制小车仿真slam

    roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
    
    roslaunch mbot_navigation gmapping_demo.launch
    
    roslaunch mbot_teleop mbot_teleop.launch 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    之后就可以用鼠标控制小车移动
    u 前左转,i 前进,o前右转,j 逆时针转,l顺时针转,‘,‘后退,’.’ 后左转,m后右转
    在这里插入图片描述
    走完全图后就可以保存地图

    rosrun map_server map_saver -f cloister_gmapping
    
    • 1

    自主导航

    导航的关键是机器人定位和路径规划两大部分。针对这两个核心,ROS提供了两个功能包move_base 和amcl。

    move_base

    作用:实现导航中的最优路径规划

    导航功能包需要采集机器人的传感器信息,以达到实时避障的效果。这就要求机器人通过ROS发布sensor_msgs/LaserScan或者sensor_msgs/PointCloud格式的消息,也就是二维激光信息或者三维点云信息。

    其次,导航功能包要求机器人发布nav_msgs/Odometry格式的里程计信息,同时也要发布相应的TF变换。

    最后,导航功能包的输出是geometry_msgs/Twist格式的控制指令,这就要求机器人控制节点具备解析控制指令中线速度、角速度的能力,并且最终通过这些指令控制机器人完成相应的运动。

    amcl

    自主定位即机器人在任意状态下都可以推算出自己在地图中所处的位置。

    roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
    
    roslaunch mbot_navigation nav_cloister_demo.launch
    
    • 1
    • 2
    • 3

    导航仿真

    roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch

    错误合集与解决方式

    [ERROR] [1640451073.664607610, 594.688000000]: SpawnModel: Failure - model name mbot already exist.

    原因:生成了 2 个具有相同名称的模型(“my_model”)。每个模型都需要不同的名称,这个自己去找重复的在哪解决掉iu可以了

    [gazebo-1] process has died

    原因:关闭的过程中有些Gazebo的程序没有完全关闭,导致再次启动时,无法正常开启。
    所以,解决方法也很简单,只要把gazebo的相关程序关闭即可。

    sudo killall rosmaster
    
    sudo killall gzserver
    
    sudo killall gzclient
    
    • 1
    • 2
    • 3
    • 4
    • 5

    [gazebo_gui-3] process has died VMware: vmw_ioctl_command error Invalid argument.

    现象:闪退,并报错
    原因:虚拟机opengl问题
    参考这篇https://robocademy.com/2020/05/02/solved-opengl-issues-with-gazebo-and-vmware/
    方法一:gazebo启用3D加速选项方面存在一些问题,可从VM设置中禁用设置3D加速选项。禁用该选项后,仿真环境运行会比较缓慢,但可以正常工作。

    方法二:更改SVGA_VGPU10变量,告诉系统OpenGL版本,尝试两种选择,然后看看哪个更适合。

    export SVGA_VGPU10=0
    
    • 1

    如果要使用此选项避免每次启动终端时都设置此变量,只需将此命令添加到.zshrc中即可。

    运行Gazebo时,卡在加载模型界面,加载太慢或者黑屏:

    解决方法:

    cd ~/.gazebo/
    
    mkdir -p models
    
    cd ~/.gazebo/models/
    
     wget http://file.ncnynl.com/ros/gazebo_models.txt
    
     wget -i gazebo_models.txt
    
     ls model.tar.g* | xargs -n1 tar xzvf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    小车并不能沿着路径,且速度极慢

    原因:xacro在melodic版本上的inorder解释器不能用prefix这种命名空间的格式

    解决方案:使用TurtleBot3
    https://github.com/ROBOTIS-GIT/turtlebot3

    git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
    
    git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
    
    • 1
    • 2
    • 3

    更改mbot_laser_nav_gazebo.launch

    <launch>
    
        <!-- 设置launch文件的参数 -->
        <arg name="world_name" value="$(find mbot_gazebo)/worlds/cloister.world"/>
        <arg name="paused" default="false"/>
        <arg name="use_sim_time" default="true"/>
        <arg name="gui" default="true"/>
        <arg name="headless" default="false"/>
        <arg name="debug" default="false"/>
    
        <!-- 运行gazebo仿真环境 -->
        <include file="$(find gazebo_ros)/launch/empty_world.launch">
            <arg name="world_name" value="$(arg world_name)" />
            <arg name="debug" value="$(arg debug)" />
            <arg name="gui" value="$(arg gui)" />
            <arg name="paused" value="$(arg paused)"/>
            <arg name="use_sim_time" value="$(arg use_sim_time)"/>
            <arg name="headless" value="$(arg headless)"/>
        </include>
    
           <!-- 加载机器人模型描述参数 -->
        <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find turtlebot3_description)/urdf/turtlebot3_burger.urdf.xacro'" /> 
    
    
        <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
        <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node> 
    
        <!-- 运行robot_state_publisher节点,发布tf  -->
        <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"  output="screen" >
            <param name="publish_frequency" type="double" value="50.0" />
        </node>
    
        <!-- 在gazebo中加载机器人模型-->
        <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
              args="-urdf -model mbot -param robot_description"/> 
    
    </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
    • 33
    • 34
    • 35
    • 36
    • 37
    原本的:
    <!-- 加载机器人模型描述参数 -->
    <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find mbot_description)/urdf/xacro/gazebo/mbot_with_laser_gazebo.xacro'" />
    
    改为:
    <!-- 加载机器人模型描述参数 -->
    <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find turtlebot3_description)/urdf/turtlebot3_burger.urdf.xacro'" />
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    nlp入门(三)基于贝叶斯算法的拼写错误检测器
    企业信息化安全方案设计实战参考
    http发送和接收图片json文件
    提升 Selenium 测试稳定性的秘诀:深入理解等待 API 的使用
    编译原理7:语法分析、消除左递归、FIRST/FOLLOW集合
    QT建立TCP服务器
    Android平台签名证书(.keystore)生成教程
    Bash常见快捷键
    goroutinue
    Charles 乱码解决办法
  • 原文地址:https://blog.csdn.net/u011612364/article/details/122147741