从零开始的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

下载功能包

导航元功能包

 sudo apt-get install ros-melodic-navigation

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

hector-slam功能包

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

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

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

基于激光雷达的gmapping SLAM仿真

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

roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch

从零开始的ROS学习之仿真+SLAM_第1张图片

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

roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch

roslaunch mbot_navigation gmapping_demo.launch

roslaunch mbot_teleop mbot_teleop.launch 

从零开始的ROS学习之仿真+SLAM_第2张图片
之后就可以用鼠标控制小车移动
u 前左转,i 前进,o前右转,j 逆时针转,l顺时针转,‘,‘后退,’.’ 后左转,m后右转
从零开始的ROS学习之仿真+SLAM_第3张图片
走完全图后就可以保存地图

rosrun map_server map_saver -f cloister_gmapping

自主导航

导航的关键是机器人定位和路径规划两大部分。针对这两个核心,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

导航仿真

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

[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

如果要使用此选项避免每次启动终端时都设置此变量,只需将此命令添加到.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

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

原因: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

更改mbot_laser_nav_gazebo.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"/>

    
    <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'" /> 


    
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" >node> 

    
    <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>

    
    <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
          args="-urdf -model mbot -param robot_description"/> 

launch>
原本的:

<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'" />

你可能感兴趣的:(ROS,学习,自动驾驶,人工智能)