运行环境:ubuntu20.04
1.配置Ardupilot源码以及仿真环境
1.下载ardupilot源码
git clone https://github.com/ArduPilot/ardupilot
cd ardupilot
git submodule update --init --recursive
2.配置环境:
Tools/environment_install/install-prereqs-ubuntu.sh -y
. ~/.profile
3.检查:
cd ardupilot/ArduCopter
sim_vehicle.py --console --map
如果正常的话应该是这个页面:
2.配置QGC以及仿真
1.授予权限,安装依赖
sudo usermod -a -G dialout $USER
sudo apt-get remove modemmanager -y
sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-gl -y
sudo apt install libfuse2 -y
sudo apt install libxcb-xinerama0 libxkbcommon-x11-0 libxcb-cursor-dev -y
2.下载QGC
打开链接,下载: QGroundControl.AppImage.
3.安装/运行:
chmod +x ./QGroundControl.AppImage
./QGroundControl.AppImage (or double click)
4.检查
先按照上面一样仿真,然后启动QGC,可以看见QGC自动连上了飞行器
这是因为仿真会自动打开127.0.0.1:14550输出口,和QGC默认的接口相同,所以不需要额外的配置就可以自动连接
3.配置ardupilot_gazebo以及仿真
1.下载ardupilot_gazebo并编译:
git clone <a href="https://github.com/khancyr/ardupilot_gazebo" target="_blank">https://github.com/khancyr/ardupilot_gazebo</a>
cd ardupilot_gazebo
mkdir build
cd build
cmake ..
make -j4
sudo make install
2.配置环境变量
echo 'source /usr/share/gazebo/setup.sh' >> ~/.bashrc
echo 'export GAZEBO_MODEL_PATH=~/ardupilot_gazebo/models' >> ~/.bashrc
echo 'export GAZEBO_RESOURCE_PATH=~/ardupilot_gazebo/worlds:${GAZEBO_RESOURCE_PATH}' >> ~/.bashrc
source ~/.bashrc
如果正确配置,那么在~/.bashrc文件中可以看到:
3. 先启动 gazebo 地图
gazebo --verbose worlds/iris_arducopter_runway.world
第一次打开地图可能会花费较长时间,这是正常现象,不必慌张
4.然后打开ArduPilot代码中的sitl模式
cd ~/ardupilot/ArduCopter
../Tools/autotest/sim_vehicle.py -f gazebo-iris --console --map
这时用QGC控制无人机飞行也可以在gazebo中直观的看到飞行了
4.配置mavros以及仿真
1.安装mavros
教程很多,可以自行搜索,对于要二次开发的开发者,推荐通过源码安装
2.配置输出端口
首先我们需要在打开仿真的终端里增加一个输出端口:
output add 127.0.0.1:14551
然后打开mavros/launch/apm.launch文件,修改fcu_url参数
<arg name="fcu_url" default="udp://:14551@127.0.0.1" />
3.检查
启动mavros
roslaunch mavros apm.launch
随便打印一个反映无人机状态的话题,观察是否有输出,例如:
rostopic echo mavros/imu/data
如果正常,那么整个仿真环境就搭建好了,用你想要的方式放飞你的无人机吧!
附加问题:
启动mavros警告:PositionTargetGlobal failed because no origin
出现警告的原因是mavros节点没有接收到“global_position/gp_origin”(事实上是/mavros/global_position/gp_origin)的话题来初始化原点。这导致is_map_init一直保持为false,触发了警告信息的打印。可以通过自己编写一个节点,手动发布自定义的原点位置信息。
1.创建发布原点信息的节点
在mavros的源码目录(mavros_ws/src/mavros/mavros/src/)下,创建一个名为pub_origin.cpp
的文件,内容如下:
// pub_origin.cpp
#include <ros/ros.h>
#include <geographic_msgs/GeoPointStamped.h>
int main(int argc, char **argv)
{
ros::init(argc, argv, "pub_origin");
ros::NodeHandle nh("~");
ros::Publisher gp_origin_pub = nh.advertise<geographic_msgs::GeoPointStamped>("/mavros/global_position/gp_origin", 10);
ros::Rate rate(10.0);
// Read parameters
double latitude, longitude, altitude;
nh.param<double>("latitude", latitude, 0.0);
nh.param<double>("longitude", longitude, 0.0);
nh.param<double>("altitude", altitude, 0.0);
geographic_msgs::GeoPointStamped gp_origin;
gp_origin.header.stamp = ros::Time::now();
gp_origin.header.frame_id = "map";
gp_origin.position.latitude = latitude;
gp_origin.position.longitude = longitude;
gp_origin.position.altitude = altitude;
while (ros::ok()) {
gp_origin_pub.publish(gp_origin);
ros::spinOnce();
rate.sleep();
}
return 0;
}
2.修改launch文件
在mavros的launch目录下找到node.launch文件,加入以下内容
<node pkg="mavros" type="pub_origin_node" name="pub_origin" output="$(arg log_output)">
<param name="latitude" value="0.0" />
<param name="longitude" value="0.0" />
<param name="altitude" value="0.0" />
</node>
3.修改CMakeLists.txt文件
在mavros的CMakeLists.txt文件中,加入以下内容:
add_executable(pub_origin_node src/pub_origin.cpp)
target_link_libraries(pub_origin_node mavros ${catkin_LIBRARIES})
4.重新编译工作空间即可解决问题
参考文献:
apm软件仿真+QGC地面站 环境搭建_qgc仿真连接-CSDN博客
https://zhuanlan.zhihu.com/p/146671667