首先是必要的安装,ROS+gazebo+PX4+MAVROS+QGroundControl+XTDrone(这一部分可以参考我在无人机仿真环境搭建查看),本篇是基本XTDrone官方的文档所学习的,主要记录仿真环境的运行以及自己在过程中遇到的坑。
官方文档链接:https://www.yuque.com/xtdrone/manual_cn
一、键盘控制无人机飞行
正确安装完成上面的必要依赖就可以先测试一下无人机是否可以通过键盘控制起飞
打开一个终端运行启动gazebo,这里的indoor1就是px4自带的一个仿真环境可以改成别的,比如indoor2.launch
cd ~/PX4_Firmware
roslaunch px4 indoor1.launch
这里启动后由于是在虚拟机运行的因此可能有很大的卡顿,可以点左上角的Camera然后勾选Orthographic可以很大的优化
gazebo启动后再运行
cd ~/XTDrone/communication/
python multirotor_communication.py iris 0
与0号iris建立通信,然后再启动键盘控制
cd ~/XTDrone/control/keyboard
python multirotor_keyboard_control.py iris 1 vel
起飞流程
按住i把速度加到0.3以上—–>按b切换offboard模式—–>按b解锁起飞
二、配置控制多旋翼无人机
1.配置方法
在单机仿真中,indoor和outdoor开头的launch文件都是仿真启动的文件,不同的文件代表在不同的场景下进行仿真,上面已经说过了,这里以outdoor3.launch为例,配置多旋翼无人机
打开这个文件
cd ~/PX4_Firmware/launch/
gedit outdoor3.launch
默认的是车辆的仿真,搜索rover,只需对应改成需要的机型就可以了。然后就是sdf文件,因为同一种机型可能配备不同的传感器,所以sdf文件的命名也会随之不同,可以在~/PX4_Firmware/Tools/sitl_gazebo/models/ 目录下寻找所需要的sdf文件
2.控制方法
多旋翼无人机相应的机型是solo,这里由于里地面高度较高,需要把launch文件中初始位置z设置为1,不然无人机就在地面以下了
<arg name="z" default="1"/>
然后启动仿真程序,这里要是用的别的场景也是设置launch文件的
cd ~/PX4_Firmware
roslaunch px4 outdoor3.launch
然后启动通信脚本,solo代表机型,0代表飞机编号
cd ~/XTDrone/communication
python multirotor_communication.py solo 0
然后在启动键盘控制,1代表的是飞机个数,vel代表速度控制
cd ~/XTDrone/control/keyboard
python multirotor_keyboard_control.py solo 1 vel
然后按i把z速度加到0.3以上,在按b切换到offboard模式,再按t解锁起飞飞到合适位置按s实现悬停
然后打开地面站设置导航点即可运行
三、PX4飞控EKF配置
PX4默认使用的EKF配置为融合GPS的水平位置与气压计高度。如果我们想使用视觉定位就需要修改配置文件,我们这里使用的是ORBSLAM2
注意,此修改意味着EKF融合来自mavros/vision_pose/pose的数据,并不是修改完无人机就可以视觉定位了,需要相关程序提供mavros/vision_pose/pose的数据,相关程序包括视觉SLAM、激光SLAM和获取Gazebo真值等。如果没有额外的视觉数据,想要飞行必须改回基于GPS和气压计的定位。
先打开相应文件
gedit ~/PX4_Firmware/ROMFS/px4fmu_common/init.d-posix/rcS
# GPS used
#param set EKF2_AID_MASK 1
# Vision used and GPS denied
param set EKF2_AID_MASK 24
# Barometer used for hight measurement
#param set EKF2_HGT_MODE 0
# Barometer denied and vision used for hight measurement
param set EKF2_HGT_MODE 3
重启仿真之前要先删除上一次记录在虚拟eeprom中的参数文件,否则仿真程序就会读取参数文件导致本次rcS的修改不能生效
rm ~/.ros/eeprom/parameters*
rm -rf ~/.ros/sitl*
四、ORBSLAM视觉仿真
首先是编译两种方式的ORB文件SLAM
cp -r ~/XTDrone/sensing/slam/vslam/ORB_SLAM2/ ~/catkin_ws/src/
mkdir ~/catkin_ws/scripts/
cp ~/catkin_ws/src/ORB_SLAM2/xtdrone* ~/catkin_ws/scripts/
cd ~/catkin_ws/src/ORB_SLAM2
chmod +x build.sh
./build.sh
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/catkin_ws/src/ORB_SLAM2/Examples/ROS #将这句放到~/.bashrc中,以后使用更方便
chmod +x build_ros.sh
./build_ros.sh
XTDnore官方的方法也可以参考https://gitee.com/robin_shaun/XTDrone/tree/master/sensing/slam/vslam/ORB_SLAM2#2-prerequisites
在运行到./build.sh可能会报错,运行崩溃
这里进去./build.sh文件把最后的make -j改成make -j4就可以了,ros版本同理
这里ORB就已经编译好了。理论上就已经可以跑SLAM仿真了
1.先启动PX4仿真
cd PX4_Firmware
roslaunch px4 indoor1.launch
2.启动ORNBSLAM
cd ~/catkin_ws/scripts/
sh xtdrone_run_stereo.sh
这里没有运行成功,我自己运行没有反应无论是编译官方的ORB包还是XTD给出的ORB暂时还没有找出问题所在
成功可以在终端看到
INFO [ecl/EKF] 23860000: reset position to ev position
INFO [ecl/EKF] 23860000: commencing external vision position fusion
INFO [ecl/EKF] 23860000: commencing external vision yaw fusion
3.建立通信
cd ~/XTDrone/communication
python multirotor_communication.py iris 0
4.启动键盘控制
cd ~/XTDrone/control/keyboard
python multirotor_keyboard_control.py iris 1 vel
五、HectorSLAM建图
1.安装依赖
安装HectorSLAM
sudo apt install ros-melodic-hector-slam*
安装map server保存地图
sudo apt install ros-melodic-map-server
复制相关文件
roscd hector_slam_launch
sudo cp ~/XTDrone/sensing/slam/laser_slam/hector_slam/hector_slam_xtdrone.launch launch/
sudo cp ~/XTDrone/sensing/slam/laser_slam/hector_slam/mapping_xtdrone.rviz rviz_cfg/mapping_xtdrone.rviz
roscd hector_imu_attitude_to_tf/
sudo cp ~/XTDrone/sensing/slam/laser_slam/hector_slam/hector_imu_xtdrone.launch launch/
roscd hector_mapping/
sudo cp ~/XTDrone/sensing/slam/laser_slam/hector_slam/hector_mapping_xtdrone.launch launch/
2.使用
启动仿真环境,这里用的是indoor3.launch,然后要把这个文件里的sdf改成iris_2d_lidar
roslaunch px4 indoor3.launch
启动HectorSLAM
roslaunch hector_slam_launch hector_slam_xtdrone.launch
如果你运行不出来可以看看当前的tf_tree
rosrun rqt_tf_tree rqt_tf_tree
启动通信脚本
cd ~/XTDrone/communication/
python multirotor_communication.py iris 0
同样的这里的iris要是别的机型也要换成相应的
将HectorSLAM输出的2D位姿和高度值(由1D激光测距仪获得),转换为mavros话题
cd ~/XTDrone/sensing/slam/laser_slam/script/
python laser_transfer.py iris 0 hector
启动键盘控制脚本,控制无人机飞行,注意不能飞太高,导致激光雷达扫不到围墙。
cd ~/XTDrone/control/keyboard/
python multirotor_keyboard_control.py iris 1 vel
绕着场地飞行保存地图,用于后面路径规划
rosrun map_server map_saver -f ~/XTDrone/motion_planning/2d/map/indoor3
这里要慢慢飞不然画的地图就很奇怪
六、Cartographer建图
1.安装依赖
安装Cartographer
sudo apt install ros-melodic-cartographer-ros
sudo apt install ros-melodic-cartographer-rviz
从XTD复制相关文件
roscd cartographer_ros
sudo cp -r ~/XTDrone/sensing/slam/laser_slam/cartographer/* ./
2.使用
启动indoor3.launch,这里还是和上面一样要改sdf
roslaunch px4 indoor3.launch
启动Cartographer
roslaunch cartographer_ros xtdrone_2d.launch
启动通信脚本
cd ~/XTDrone/communication/
python multirotor_communication.py iris 0
将cartographer输出的2D位姿和高度值(由1D激光测距仪获得),转换为mavros话题
cd ~/XTDrone/sensing/slam/laser_slam/script/
python laser_transfer.py iris 0 cartographer
启动键盘控制脚本,控制无人机飞行,注意不能飞太高,导致激光雷达扫不到围墙
cd ~/XTDrone/control/keyboard/
python multirotor_keyboard_control.py iris 1 vel
然后再保存地图
rosrun map_server map_saver -f ~/XTDrone/motion_planning/2d/map/indoor3
总的来说就是跟上面的HectorSLAM差不多只不过是不同的SLAM算法
七、二维运动规划
这一部分的运动规划可以任意选取上面两种二维视觉算法
这里以HectorSLAM为例
1.安装依赖
安装ros的规划库
sudo apt install -y ros-melodic-move-base \
ros-melodic-costmap-2d \
ros-melodic-dwa-local-planner \
ros-melodic-global-planner
先把launch文件里的rviz启动注释掉
roscd hector_slam_launch/launch/
sudo gedit hector_slam_xtdrone.launch
这里提一句这里用的所有相关文件都是可以px4还有XTD文件下找到的
之前在安装依赖的时候用的cp都是从这里复制出去的
2.在已经建好的地图进行规划
先用Cartographer已经建好的地图修改配置文件,使新发布的地图不会代替已经建好的
roscd hector_mapping/launch/
sudo gedit hector_mapping_xtdrone.launch
把发布地图服务改为false
<param name="advertise_map_service" value="false"/>
放开56行的话题名映射注释,将map映射为map_new,从而不被订阅使用
<remap from="/map" to="/map_new"/>
启动仿真环境
cd ~/PX4_Firmware
roslaunch px4 indoor3.launch
启动二维激光,但是这里启动的时候并不会打开rviz了,上面已经把这个文件里的rviz启动注释了
roslaunch hector_slam_launch hector_slam_xtdrone.launch
建立和PX4仿真的通信,同时发布位置真值
cd ~/XTDrone/communication
python multirotor_communication.py iris 0
将激光水平定位和高度真值数据通过MAVROS发给PX4
cd ~/XTDrone/sensing/slam/laser_slam/script
python laser_transfer.py iris 0 hector
启动运动规划(注意 2d_motion_planning.launch、move_base.launch和indoor3.yaml中的路径变量,要改成自己电脑对应的路径名)
cd ~/XTDrone/motion_planning/2d/launch
roslaunch 2d_motion_planning.launch
这个时候就会弹出rviz界面了
控制无人机起飞,如果您是用的takeoff模式起飞,起飞后需要切换到offboard模式
cd ~/XTDrone/control/keyboard
python multirotor_keyboard_control.py iris 1 vel
成功起飞之后要把键盘控制关掉,不然会与地图规划消息冲突
然后再切换到rviz,使用一个2D Nav Goal无人机就可以自己规划路线了
cd ~/PX4_Firmware
roslaunch px4 indoor4.launch
3.边建图边规划
修改HectorSLAM配置文件
roscd hector_mapping/launch/
sudo gedit hector_mapping_xtdrone.launch
把地图发布服务改成true
<param name="advertise_map_service" value="true"/>
注释掉map话题映射
<!--remap from="/map" to="/map_new"/-->
修改地图尺寸
<arg name="map_size" default="2048"/>
修改地图原点
<param name="map_start_x" value="0.5"/>
<param name="map_start_y" value="0.5" />
然后后面的操作就跟上面一样的了
八、三维激光SLAM
1.安装编译ALOAM
(1)安装ALOAM依赖
这里一定要记得编译ceres solver虽然这里不编译ALOAM仍然可以编译成功但是仿真跑不了
出现这种编译错误多编译几次
PCL:
sudo apt install libpcl-dev
(2)编译ALOAM
cp -r ~/XTDrone/sensing/slam/laser_slam/A-LOAM ~/catkin_try/src/
cp -r ~/XTDrone/sitl_config/gazebo_plugin/velodyne/* ~/catkin_try/src/ #这里是3D激光雷达插件
cd ~/catkin_try
catkin_make #或catkin build,取决于您的编译工具
我这里出现了这个错误不过不要紧,这是catkin_make编译崩溃导致的,可以多执行几遍,直至成功为止,或者也可以参考这篇文章就行设置
关于树莓派编译工作空间卡死情况的解决办法 - Yimiu - 博客园 (cnblogs.com)
然后一定要再bashrc下添加source ~/catkin_try/devel/setup.bash(这个功能包的名字用你自己的)
然后刷新以下bashrc
source /.bashrc
2.启动仿真
三维激光雷达有两个模型3d_lidar和3d_gpu_lidar,前者使用CPU计算,后者使用GPU计算,其他没有区别,您可以根据您的需要选择。在模型中可以设置激光雷达的线数,以3d_gpu_lidar.sdf为例(文件目录:/home/zhang/PX4Firmware/Tools/sitlgazebo/models/3d_gpu_lidar),官方教程用的32线程,您可以修改为其他线数,其他参数也都可以修改。注意刷新率不能改的太高,否则ALOAM算不过来。
<sensor name='3d_lidar' type='gpu_ray'>
<ray>
<scan>
<horizontal>
<samples>512</samples>
<resolution>1</resolution>
<min_angle>-3.1415926535897931</min_angle>
<max_angle>3.1415926535897931</max_angle>
</horizontal>
<vertical>
<samples>32</samples>
<min_angle>-0.2617993877991494365</min_angle>
<max_angle>0.2617993877991494365</max_angle>
</vertical>
</scan>
<range>
<min>0.2</min>
<max>30</max>
<resolution>0.01</resolution>
</range>
</ray>
<plugin name='3d_laser' filename='libgazebo_ros_velodyne_gpu_laser.so'>
<topicName>/velodyne_points</topicName>
<frameName>laser_3d</frameName>
<gaussianNoise>0.008</gaussianNoise>
</plugin>
<always_on>1</always_on>
<update_rate>15</update_rate>
<visualize>0</visualize>
</sensor>
将outdoor1.launch中的无人机换为iris_3d_gpu_lidar,然后启动仿真文件(更换教程在配置控制多旋翼无人机)
roslaunch px4 outdoor1.launch
这里会卡成这样,我这个换一个gazebo版本即可,我这里开始是gazebo9然后换成gazebo11结果还是不可以,然后又换回gazebo9不知道为什么又可以了,可能是别的版本的gazebo9
启动ALOAM
roslaunch aloam_velodyne aloam_velodyne_HDL_32.launch
这里我还是运行不了
目前能想到的原因是这是由显卡渲染的但是虚拟机里不能共用主机显卡,也安装不了显卡驱动,所以有没有可能是由于这个原因导致黑屏
九、三维路径规划
1.编译VINS-Fusion
编译VINS-Fusion
cp -r ~/XTDrone/sensing/slam/vio/VINS-Fusion ~/catkin_ws/src/
mkdir ~/catkin_ws/scripts/
cp ~/XTDrone/sensing/slam/vio/xtdrone_run_vio.sh ~/catkin_ws/scripts/
cd ~/catkin_ws
catkin_make #或catkin build,取决于您的编译工具
我在这里报错
是ceres这里出错,百度后发现是版本问题,所以我就把我的2.1版本删了换了 ceres1.14.0
先把相对应的ceres文件删除再执行彻底删除
sudo rm -r /usr/local/lib/cmake/Ceres
sudo rm -rf /usr/local/include/ceres /usr/local/lib/libceres.a
重新安装放到合适位置编译
cd ceres-solver-1.14.0
mkdir build && cd build
cmake ..
make -j4
sudo make install
2.启动VINS-Fusion仿真
先把EKF设置为视觉定位
PX4默认使用的EKF配置为融合GPS的水平位置与气压计高度。如果我们想使用视觉定位,就需要把修改配置文件。
● 注意,此修改意味着EKF融合来自mavros/vision_pose/pose的数据,并不是修改完无人机就可以视觉定位了,需要相关程序提供mavros/vision_pose/pose的数据,相关程序包括视觉SLAM、激光SLAM和获取Gazebo真值等。如果没有额外的视觉数据,想要飞行必须改回基于GPS和气压计的定位。
gedit ~/PX4_Firmware/ROMFS/px4fmu_common/init.d-posix/rcS
# GPS used
#param set EKF2_AID_MASK 1
# Vision used and GPS denied
param set EKF2_AID_MASK 24
# Barometer used for hight measurement
#param set EKF2_HGT_MODE 0
# Barometer denied and vision used for hight measurement
param set EKF2_HGT_MODE 3
重启仿真前,需要删除上一次记录在虚拟eeprom中的参数文件,否则仿真程序会读取该参数文件,导致本次rcS的修改不能生效
rm ~/.ros/eeprom/parameters*
rm -rf ~/.ros/sitl*
启动仿真程序,将launch文件中的sdf改为iris_stereo_camera.sdf
roslaunch px4 indoor1.launch
启动VINS-Fusion,注意其默认订阅的话题是iris_0的,如果要换别的vehicle,需要对应修改。另外临时文件存储路径也要对应修改。
gedit ~/catkin_ws/src/VINS-Fusion/config/xtdrone_sitl/px4_sitl_stereo_imu_config.yaml
imu_topic: "/iris_0/imu_gazebo"
image0_topic: "/iris_0/stereo_camera/left/image_raw"
image1_topic: "/iris_0/stereo_camera/right/image_raw"
output_path: "/home/robin/catkin_ws/vins_output"
.
.
.
pose_graph_save_path: "/home/robin/catkin_ws/vins_output/pose_graph/" # save and load path
这里没有改所以就继续用iris就可以了
启动VINS-Fusion
cd ~/catkin_ws
bash scripts/xtdrone_run_vio.sh
出现这种错误是由于没有刷新配置环境,在当前终端执行
source devel/setup.bash
然后再重新启动就可以了
由于VINS-Fusion发布的是Odometry类型的话题,我们要将其对应转为PX4所需的话题
cd ~/XTDrone/sensing/slam/vio
python vins_transfer.py iris 0
这时PX4仿真终端出现如下所示输出,代表视觉信息融合成功
INFO [ecl/EKF] 1213644000: reset position to ev position
INFO [ecl/EKF] 1213644000: commencing external vision position fusion
INFO [ecl/EKF] 1213644000: commencing external vision yaw fusion
然后建立通信,键盘控制起飞即可
cd ~/XTDrone/communication
python multirotor_communication.py iris 0
cd ~/XTDrone/control/keyboard
python multirotor_keyboard_control.py iris 1 vel
3.编译ego_planner
cp -r ~/XTDrone/motion_planning/3d/ego_planner ~/catkin_ws/src/
cd ~/catkin_ws/
catkin_make #或catkin build ego_planner
ego_planner需要输入深度图+相机位姿或是点云,深度图来源于realsense_camera,(记得把indoor1.launch的iris_stereo_camera换成iris_realsense_camera),相机位姿由VINS-Fusion计算得到,所以按照上步将飞机用键盘控制起飞后悬停,关闭键盘控制。