从零开始的ROS学习之仿真+SLAM
Posted 中二病没有蛀牙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始的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。
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
启动gmapping,通过键盘控制小车仿真slam
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
roslaunch mbot_navigation gmapping_demo.launch
roslaunch mbot_teleop mbot_teleop.launch
之后就可以用鼠标控制小车移动
u 前左转,i 前进,o前右转,j 逆时针转,l顺时针转,‘,‘后退,’.’ 后左转,m后右转
走完全图后就可以保存地图
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>
<!-- 设置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>
原本的:
<!-- 加载机器人模型描述参数 -->
<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学习之仿真+SLAM的主要内容,如果未能解决你的问题,请参考以下文章