diff --git a/conf/modules/fdm_gazebo.xml b/conf/modules/fdm_gazebo.xml index e82be8201f..7cc6fb6344 100644 --- a/conf/modules/fdm_gazebo.xml +++ b/conf/modules/fdm_gazebo.xml @@ -9,75 +9,100 @@ Usage: 1. Make sure gazebo 7 or 8 is installed. (sudo apt-get install gazebo8 libgazebo8-dev) 2. Prepare the Gazebo world and model: - a) Prepare the UAV model (see conf/simulator/gazebo/models/ardrone/): - Place the aircraft model in the conf/simulator/gazebo/models/ - folder, this folder is added to Gazebo's search path when NPS is - launched. - Gazebo uses a Front, Left, Up coordinate system for aircraft, so - make sure the +x axis points forwards. - The model should include a link for each motor with the same names - as those listed in NPS_ACTUATOR_NAMES (see below), e.g. 'nw_motor'. - Camera links should have the name specified in .dev_name in the - corresponding video_config_t struct, see sw/airborne/boards/pc_sim.h - and sw/airborne/modules/computer_vision/video_thread_nps.c. - b) Prepare the world (see conf/simulator/gazebo/worlds/ardrone.world). - Pay attention to the following: - The real-time update rate should be set to zero, as this is - already handled by Paparazzi: - <physics type="ode"> - <max_step_size>0.001</max_step_size> - <real_time_update_rate>0</real_time_update_rate><!-- Handled by Paparazzi! --> - </physics> - Spherical coordinates should be provided for navigation. - At this moment, there is an issue where Gazebo incorrectly - uses a WSU coordinate system instead of ENU. This can be fixed - by setting the heading to 180 degrees as shown below: - <spherical_coordinates> - <surface_model>EARTH_WGS84</surface_model> - <latitude_deg>51.9906</latitude_deg> - <longitude_deg>4.37679</longitude_deg> - <elevation>0</elevation> - <heading_deg>180</heading_deg><!-- Temporary fix for issue https://bitbucket.org/osrf/gazebo/issues/2022/default-sphericalcoordinates-frame-should --> - </spherical_coordinates> + 1. Prepare the UAV model (see conf/simulator/gazebo/models/ardrone/): + - Place the aircraft model in the conf/simulator/gazebo/models/ + folder, this folder is added to Gazebo's search path when NPS is + launched. + - Gazebo uses a Front, Left, Up coordinate system for aircraft, so + make sure the +x axis points forwards. + - The model should include a link for each motor with the same names + as those listed in NPS_ACTUATOR_NAMES (see below), e.g. 'nw_motor'. + - Camera links should have the name specified in .dev_name in the + corresponding video_config_t struct, see sw/airborne/boards/pc_sim.h + and sw/airborne/modules/computer_vision/video_thread_nps.c. + 2. Prepare the world (see conf/simulator/gazebo/worlds/ardrone.world). + Pay attention to the following: + - The real-time update rate should be set to zero, as this is + already handled by Paparazzi: + @code{.xml} + <physics type="ode"> + <max_step_size>0.001</max_step_size> + <real_time_update_rate>0</real_time_update_rate><!-- Handled by Paparazzi! --> + </physics> + @endcode + - Spherical coordinates should be provided for navigation. + At this moment, there is an issue where Gazebo incorrectly + uses a WSU coordinate system instead of ENU. This can be fixed + by setting the heading to 180 degrees as shown below: + @code{.xml} + <spherical_coordinates> + <surface_model>EARTH_WGS84</surface_model> + <latitude_deg>51.9906</latitude_deg> + <longitude_deg>4.37679</longitude_deg> + <elevation>0</elevation> + <heading_deg>180</heading_deg><!-- Temporary fix for issue https://bitbucket.org/osrf/gazebo/issues/2022/default-sphericalcoordinates-frame-should --> + </spherical_coordinates> + @endcode 3. Prepare the airframe file (see examples/ardrone2_gazebo.xml): - a) Select Gazebo as the FDM (Flight Dynamics Model) - <target name="nps" board="pc"> - <module name="fdm" type="gazebo"/> - </target> - b) Add actuator thrusts and torques to the SIMULATOR section: - <section name="SIMULATOR" prefix="NPS_"> - <define name="ACTUATOR_NAMES" value="nw_motor, ne_motor, se_motor, sw_motor" type="string[]"/> - <define name="ACTUATOR_THRUSTS" value="1.55, 1.55, 1.55, 1.55" type="float[]"/> - <define name="ACTUATOR_TORQUES" value="0.155, -0.155, 0.155, -0.155" type="float[]"/> - ... - <section> - The thrusts and torques are expressed in SI units (N, Nm) and should - be in the same order as the ACTUATOR_NAMES. - c) In the same section, bypass the AHRS and INS as these are not - supported yet: - <section name="SIMULATOR" prefix="NPS_"> - ... - <define name="BYPASS_AHRS" value="1"/> - <define name="BYPASS_INS" value="1"/> - ... - <section> - d) If required, enable video thread simulation: - <section name="SIMULATOR" prefix="NPS_"> - ... - <define name="SIMULATE_VIDEO" value="1"/> - ... - <section> - e) If required, specify the Gazebo world and aircraft name: - <section name="SIMULATOR" prefix="NPS_"> - ... - <define name="GAZEBO_WORLD" value="my_world.world"/> - <define name="GAZEBO_AC_NAME" value="my_uav"/> - <section> - 4. Make sure all included modules work with nps. At the moment, most of - the modules that depend on video_thread are only built when ap is - selected as the target. As a quick fix, try to remove the target - attribute from the makefile element in the module xml, e.g.: - <makefile target="ap"> ---> <makefile> + 1. Select Gazebo as the FDM (Flight Dynamics Model) + @code{.xml} + <target name="nps" board="pc"> + <module name="fdm" type="gazebo"/> + </target> + @endcode + 2. Add actuator thrusts and torques to the SIMULATOR section: + @code{.xml} + <section name="SIMULATOR" prefix="NPS_"> + <define name="ACTUATOR_NAMES" value="nw_motor, ne_motor, se_motor, sw_motor" type="string[]"/> + <define name="ACTUATOR_THRUSTS" value="1.55, 1.55, 1.55, 1.55" type="float[]"/> + <define name="ACTUATOR_TORQUES" value="0.155, -0.155, 0.155, -0.155" type="float[]"/> + ... + <section> + @endcode + The thrusts and torques are expressed in SI units (N, Nm) and should + be in the same order as the ACTUATOR_NAMES. + 3. In the same section, bypass the AHRS and INS as these are not + supported yet: + @code{.xml} + <section name="SIMULATOR" prefix="NPS_"> + ... + <define name="BYPASS_AHRS" value="1"/> + <define name="BYPASS_INS" value="1"/> + ... + </section> + @endcode + 4. If required, enable video thread simulation: + @code{.xml} + <section name="SIMULATOR" prefix="NPS_"> + ... + <define name="SIMULATE_VIDEO" value="1"/> + ... + </section> + @endcode + 5. If required, set the aircraft model in the airframe file: + @code{.xml} + <section name="SIMULATOR" prefix="NPS_"> + ... + <define name="GAZEBO_AC_NAME" value="my_uav"/> + </section> + @endcode + 6. Make sure all included modules work with nps. At the moment, most of + the modules that depend on video_thread are only built when ap is + selected as the target. To fix this, add nps to the target attribute + in the module xml, e.g.: + @code{.xml} + <makefile target="ap|nps"> + @endcode + 4. If required, set the simulation environment in the flight plan file: + @code{.xml} + <flight_plan ...> + <header> + ... + #define NPS_GAZEBO_WORLD "my.world" + </header> + ... + <flight_plan> + @endcode
diff --git a/sw/simulator/nps/nps_fdm_gazebo.cpp b/sw/simulator/nps/nps_fdm_gazebo.cpp index 1018c5c9fe..8acffb2395 100644 --- a/sw/simulator/nps/nps_fdm_gazebo.cpp +++ b/sw/simulator/nps/nps_fdm_gazebo.cpp @@ -51,6 +51,7 @@ extern "C" { #include "nps_autopilot.h" #include "generated/airframe.h" +#include "generated/flight_plan.h" #include "autopilot.h" #include "math/pprz_isa.h"