在赶毕设文档指导日志的时候才想起来我去年居然写了博客,我恨我怎么懒狗了就写了这么点,今年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
ROS开源社区中汇集了多种SLAM算法,可以直接使用或进行二次开发:
Gmapping是一个基于2D激光雷达使用RBPF(Rao-Blackwellized Particle Filters)算法完成二维栅格地图构建的SLAM算法,这个包最为常用和成熟,所以先用它完成一个基础demo。
http://wiki.ros.org/gmapping
sudo apt-get install ros-melodic-slam-gmapping
hector_slam功能包使用高斯牛顿方法,不需要里程计数据,只根据激光信息便可构建地图。
sudo apt-get install ros-melodic-hector-slam
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
在Gazebo中仿真SLAM
启动Gazebo仿真环境,rviz同步显示雷达传感器检测的环境地图
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
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。
作用:实现导航中的最优路径规划
导航功能包需要采集机器人的传感器信息,以达到实时避障的效果。这就要求机器人通过ROS发布sensor_msgs/LaserScan或者sensor_msgs/PointCloud格式的消息,也就是二维激光信息或者三维点云信息。
其次,导航功能包要求机器人发布nav_msgs/Odometry格式的里程计信息,同时也要发布相应的TF变换。
最后,导航功能包的输出是geometry_msgs/Twist格式的控制指令,这就要求机器人控制节点具备解析控制指令中线速度、角速度的能力,并且最终通过这些指令控制机器人完成相应的运动。
自主定位即机器人在任意状态下都可以推算出自己在地图中所处的位置。
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
roslaunch mbot_navigation nav_cloister_demo.launch
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
原因:生成了 2 个具有相同名称的模型(“my_model”)。每个模型都需要不同的名称,这个自己去找重复的在哪解决掉iu可以了
原因:关闭的过程中有些Gazebo的程序没有完全关闭,导致再次启动时,无法正常开启。
所以,解决方法也很简单,只要把gazebo的相关程序关闭即可。
sudo killall rosmaster
sudo killall gzserver
sudo killall gzclient
现象:闪退,并报错
原因:虚拟机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中即可。
解决方法:
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'" />