1、前言
无人机仿真主要分为两类:硬件在环仿真(HITL)和软件在环仿真(SITL全称Software in the loop)。
无人机软件在环仿真是指完全用计算机来模拟出无人机飞行时的状态,而硬件在环仿真是指计算机连接飞控板来测试飞控软件是否可以流畅运行。一般来说硬件在环仿真若没有加上真实的转台进行测试的话,其与软件在环仿真没有很大的区别。
在无须解决在研发过程中的硬件问题带来的麻烦,并且可以直观的调试代码,搭建一套无人机仿真系统,对于研发来说好处是数不剩数的。
2、rotors介绍
RotorS 是ETH(苏黎世联邦理工大学)研究团队开发的一个ROS包,GITHUB地址 提供了几种多旋翼仿真模型,例如
- List item
- AscTec
- Hummingbird
- AscTec Pelican
- AscTec Firefly
但是仿真系统不限于使用这几种模型
AscTec 是 德国Ascending Technologies公司的缩写。
是很早的无人机了,实物张下面这个样子:
仿真系统中包含很多种仿真传感器,都可以安装在无人机上,例如:
- IMU
- 里程计
- 视觉惯导相机
功能包中包含了两种控制器,后面会详细介绍控制器的实现
3、rotors安装
rotors官网提供的配置教程是Ubuntu 16.04 with ROS Kinetic、Ubuntu 14.04 with ROS Indigo , 这里我的配置是Ubuntu 18.04 with ROS melodic
安装前已经安装好了ROS melodic和gazebo11(melodic默认安装的是gazebo9,但9不太稳定,升级为11了)
(1)安装依赖安装包
# 如果是其他ros版本就把melodic改为自己ros版本名字
sudo apt-get install ros-melodic-joy ros-melodic-octomap-ros python-wstool python-catkin-tools protobuf-compiler
sudo apt-get install libgeographic-dev ros-melodic-geographic-msgs
(2)创建文件夹并初始化工作空间
mkdir -p ~/UAV_rotors/src
cd ~/UAV_rotors/src
catkin_init_workspace
(3)git下载rotors源码
cd ~/UAV_rotors/src
git clone git@github.com:ethz-asl/rotors_simulator.git
git clone git@github.com:ethz-asl/mav_comm.git
git clone git@github.com:ethz-asl/glog_catkin.git
git clone git@github.com:catkin/catkin_simple.git
注意这里git需要提前登录github账号并绑定自己电脑ssh,否则不能正常git,绑定方法参考这个
(4)编译源码
cd ~/UAV_rotors
catkin init # 只需运行一次,后续如果修改源码重新编译不需要再执行
catkin build
# 在.bashrc文件中添加环境变量
source ~/UAV_rotors/devel/setup.bash
编译一切正常会输出如下结果:
但不出意外的话,大家或多或少会报一些错误,下面是我编译过程中的遇到的错误(编译过程中优先解决编译错误地方,编译警告的先放着):
问题:
解决:
安装编译glog库,安装方法如下:
# 安装gflags
git clone https://github.com/gflags/gflags.git
cd gflags
mkdir build && cd build
cmake .. -DGFLAGS_NAMESPACE=google -DCMAKE_CXX_FLAGS=-fPIC ..
make -j4
sudo make install
# 安装glog
git clone https://github.com/google/glog
cd glog
mkdir build && cd build
cmake -DGFLAGS_NAMESPACE=google -DCMAKE_CXX_FLAGS=-fPIC -DBUILD_SHARED_LIBS=ON ..
make -j4
sudo make install
如果编译安装过程中报错说cmake版本太低需要升级版本,可参考这个
(5)运行rotors
rotors中有许多种机型,包括固定翼、多旋翼等,这里以四旋翼为例,进行仿真,在终端运行下面命令:
roslaunch rotors_gazebo mav_hovering_example.launch mav_name:=firefly world_name:=basic
执行之后,gazebo会自动启动,出现下面的画面,则表示大功告成:
4、launch文件说明
在~/UAV_rotors/src/rotors_simulator/rotors_gazebo/launch
文件夹中有许多启动程序的launch文件,使用较多的有两个:mav_hovering_example.launch
和mav_hovering_example_with_vi_sensor.launch
,后者比前者多启动了深度摄像头传感器。
我们来看看mav_hovering_example_with_vi_sensor.launch
:
<!-- 启动无人机仿真,带深度摄像头传感器 -->
<!-- 参数: -->
<!-- mav_name:无人机类型,可以在rotors_description/urdf中查看型号-->
<!-- 六翼无人机:firefly、neo11、neo9-->
<!-- 四翼无人机:pelican、ardrone、asymmetric_quadrotor、hummingbird、iris-->
<!-- world_name:仿真环境,可选择worlds文件夹下的文件-->
<launch>
<arg name="mav_name" default="firefly"/>
<arg name="world_name" default="basic"/>
<arg name="enable_logging" default="false" />
<arg name="enable_ground_truth" default="true" />
<arg name="log_file" default="$(arg mav_name)" />
<env name="GAZEBO_MODEL_PATH" value="${GAZEBO_MODEL_PATH}:$(find rotors_gazebo)/models"/>
<env name="GAZEBO_RESOURCE_PATH" value="${GAZEBO_RESOURCE_PATH}:$(find rotors_gazebo)/models"/>
<!-- 启动gazebo -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find rotors_gazebo)/worlds/$(arg world_name).world" />
<!-- <arg name="debug" value="true"/> -->
<arg name="paused" value="true"/>
<!-- <arg name="gui" value="false"/> -->
<!-- <arg name="verbose" value="true"/> -->
</include>
<group ns="$(arg mav_name)">
<!-- 导入无人机模型 -->
<include file="$(find rotors_gazebo)/launch/spawn_mav.launch">
<arg name="mav_name" value="$(arg mav_name)" />
<arg name="model" value="$(find rotors_description)/urdf/mav_with_vi_sensor.gazebo" />
<arg name="enable_logging" value="$(arg enable_logging)" />
<arg name="enable_ground_truth" value="$(arg enable_ground_truth)" />
<arg name="log_file" value="$(arg log_file)"/>
</include>
<!-- 启动无人机控制节点 -->
<node name="lee_position_controller_node" pkg="rotors_control" type="lee_position_controller_node" output="screen">
<rosparam command="load" file="$(find rotors_gazebo)/resource/lee_controller_$(arg mav_name).yaml" />
<rosparam command="load" file="$(find rotors_gazebo)/resource/$(arg mav_name).yaml" />
<remap from="odometry" to="odometry_sensor1/odometry" />
</node>
<!-- 启动无人机轨迹控制命令节点 -->
<node name="hovering_example" pkg="rotors_gazebo" type="hovering_example" output="screen"/>
<!-- 启动仿真关节节点 -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
</group>
</launch>
launch文件中有两个比较重要的参数:一个是mav_name 无人机型号,这个可以在rotors_description/urdf
文件夹下查看有那些无人机型号的建模文件;一个是world_name 仿真环境名字,这个可以在rotors_gazebo/worlds
文件夹中查看,需要注意的是如果选择比较复杂的world_name 如 outdoor,仿真环境会加载gazebo官方的一些模型,如果你没有提前下载好这些模型,会导致gazebo打不开,因为此时gazebo正在联网下载这些模型,需要自己提前把官方的全部模型下载到gazebo中。
此外launch还加载了两个节点程序:lee_position_controller_node 、 hovering_example,前者就是无人机的控制节点,后者是给无人机发送轨迹点节点 , 后面会解释说明这两个节点。