发布时间:2023-11-28 16:30
转载自:https://blog.csdn.net/weixin_39611546/article/details/111637741
weixin_39611546 2020-11-22 08:49:58 85 收藏 1
文章标签: gazebo 直接获取传感器数据
版权
贴一下最近搞的gazebo和px4的总结,仅代表个人经验,如有纰漏请多指教
虽然环境没有airsim那么真实,但不得不说,gazebo和px4的官网教程维护的还是很好,而且gazebo更易于理解和掌握,以下是我安装和使用时所参考的主要教程:
Gazebo仿真 - Amov-wiki 0.0.1 文档amov-wiki.readthedocs.io
Introduction · PX4 Developer Guidedev.px4.io
https://github.com/mavlink/mavros/blob/master/mavros/README.md#installationgithub.com Gazebo : Tutorialsgazebosim.org 连接到ROS | PX4中文维基fantasyjxf.gitbooks.io
一、安装
安装过程主要参考了链接1,配置环境是Ubuntu16.04+gazebo9+ros kinetic,安装过程中的主要问题如下。
问题1:本来系统自带的是ros原生的gazebo7,但是后来配置好了后发现,始终无法可视化,以及一些奇怪的库的报错,后来google后将gazebo7卸载重装gazebo9后解决。
问题2:git submodule update --init --recursive安装慢,建议挂代理下载。
问题3:gazebo黑屏问题,https://bitbucket.org/osrf/gazebo_models/downloads/在这里下载各种model,放到~/.gazebo/models下
问题4:mavros的geographiclib库有问题,这里建议使用源码安装,在工作空间运行mavros即可。
二、gazebo理解
gazebo的仿真器还是很好理解的,比起ue4+airsim开发过程要简单很多(毕竟ue4是为游戏开发的,工程要庞大的多),我理解的gazebo的主要开发环境就是world了,在.world文件中可以配置好环境信息以及各种model信息。而model就是我们需要插入到环境中的模型,具体配置是由.sdf文件和其他相关文件决定的,很方便自己编写和定制。而如果要操控model,就需要编写plugin来进行控制,都是cpp的脚本,配置好sdf中的
px4的环境启动:安装好后,在Firmware文件夹下输入make posix_sitl_default gazebo即可启动gazebo的px4仿真。
可以看到此时的world中只有飞机和地形图,链接5中5.2提到可以change 此时的默认world,在Tools/sitl_gazebo/worlds中修改iris.world即可,方便进行开发。
三、环境搭建
参考链接4的building editor,建立好标准的室内环境保存好model模型,然后加入到Tools/sitl_gazebo/models中。如下图:
之后修改iris.world文件中的
model://indoor
2.55 0.09 0 0 0 0
刚写好的model即可。
接下来是编写移动物体,参考链接4中Category: Build a Robot教程,可以看到有两种方法可以编写world中的移动物体。
第一种方法:加入plugin来控制物体(例如教程中配置激光雷达的闭环旋转),而且外部程序是可以和仿真器进行communication的,gazebo本身的机制是server-client类似于ros,仿真器中的物体信息可以publish出来,我们可以编写脚本对其信息订阅,然后利用此信息进行其他上层规划(当然后面可以用更为直接的gazebo-ros来免去编写communication脚本这一步)。
第二种方法:适用于gazebo8+,免去了编写plugin的过程,直接在.world模型中加入
在world中添加了移动的柱子,如下:
0.2
2
四、connect to ros
px4和mavros结合使用,可以很方便我们在ros中拿到无人机当前的各种信息,以此来进行后续的算法开发。px4.launch可以链接子网内和本地的端口,以此拿到数据。
PX4 communicates with the simulator (e.g. Gazebo) to receive sensor data from the simulated world and send motor and actuator values. It communicates with the GCS and an Offboard API (e.g. ROS) to send telemetry from the simulated environment and receive commands.
mavros的框图如下:
在正常的启动过程中,我们先是启动px4的gazebo然后启动mavros。
make posix_sitl_default gazebo
#然后启动mavros拿到数据
roslaunch mavros px4.launch fcu_url:=\"udp://:14540@127.0.0.1:14557\"
这样我们通过rostopic可以看到相应的话题了。但是这里的mavros只是针对px4的,也就是所有的话题信息中并没有world中其他机器人的信息,例如刚刚添加的移动柱子。
除了mavros,gazebo本身就提供了将server的话题包装好发到roscore的gazebo-ros-pkgs包。
roslaunch gazebo_ros empty_world.launch
#我们可以拿到gazebo world中的所有信息。
如果想要修改Gazebo仿真,使其能够将额外的传感器信息直接发布到ROS主题,例如Gazebo ROS激光传感器信息,那么必须通过适当的ROS包装器来启动Gazebo,不能直接使用make posix_sitl_default gazebo来进行启动,否则gazebo本身无法连接到ros上。通过以下指令实现:
cd
make posix_sitl_default
source ~/catkin_ws/devel/setup.bash # (optional)
source Tools/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)/Tools/sitl_gazebo
roslaunch px4 posix_sitl.launch
#这几步就是source相应的环境,方便模型能够被找到,然后wrap了empty_world.launch以及px4
的相应配置。
这一步运行完,实际上是在空的world中实现了ros和px4配置。
可以使用mavros_posix_sitl.launch同时启动mavros:
cd
make posix_sitl_default
source ~/catkin_ws/devel/setup.bash # (optional)
source Tools/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)/Tools/sitl_gazebo
roslaunch px4 mavros_posix_sitl.launch
#wrap了empty_world.launch以及px4的相应配置和mavros的启动。
这时在launch中修改world配置即可实现所需要的环境:
gazebo)/worlds/iris.world\"/>