#include "pios.h" #include "pios_sim_priv.h" #include "sim_model.h" struct pios_sim_state pios_sim_state = { .accels = {0, 0, 0}, .gyros = {0, 0, 0}, .mag = {0, 0, 0}, .baro = {0}, .q = {1, 0, 0, 0}, .velocity = {0, 0, 0}, .position = {0, 0, 0}, .actuator = {0, 0, 0, 0, 0, 0, 0, 0} }; /** * Initialize the model in the external library * @returns 0 for success, -1 if fails to initialize external library */ int PIOS_SIM_Init() { if (sim_model_init() != 0) return -1; return 0; } /** * Step the model simulation in the external library * @returns 0 for success, -1 for failure to step external library */ int PIOS_SIM_Step(float dT) { if (sim_model_step(dT, &pios_sim_state) != 0) return -1; return 0; } /** * Set the actuator inputs to the model * @param[in] actuator pointer to an array of actuators to set * @param[in] nchannels number of channels that are valid coming in */ void PIOS_SIM_SetActuator(float * actuator, int nchannels) { for (int i = 0; i < NELEMENTS(pios_sim_state.actuator) && i < nchannels; i++) pios_sim_state.actuator[i] = actuator[i]; } /** * Get the accelerometer data from the simulation model * @param[out] pointer to store the accelerometer data in */ void PIOS_SIM_GetAccels(float * accels) { for (int i = 0; i < NELEMENTS(pios_sim_state.accels); i++) accels[i] = pios_sim_state.accels[i]; } /** * Get the gyro data from the simulation model * @param[out] pointer to store the gyro data in */ void PIOS_SIM_GetGyros(float * gyros) { for (int i = 0; i < NELEMENTS(pios_sim_state.accels); i++) gyros[i] = pios_sim_state.gyros[i]; } /** * Get the current attitude from the simulation model * @param[out] quat pointer to store the quaternion attitude in */ void PIOS_SIM_GetAttitude(float * q) { for (int i = 0; i < NELEMENTS(pios_sim_state.q); i++) q[i] = pios_sim_state.q[i]; } /** * Get the current positiom from the simulation model * @param[out] position pointer to store the current position in (cm in NED * frame) */ void PIOS_SIM_GetVelocity(float * velocity) { for (int i = 0; i < NELEMENTS(pios_sim_state.velocity); i++) velocity[i] = pios_sim_state.velocity[i]; } /** * Get the current positiom from the simulation model * @param[out] position pointer to store the current position in (cm in NED * frame) */ void PIOS_SIM_GetPosition(float * position) { for (int i = 0; i < NELEMENTS(pios_sim_state.position); i++) position[i] = pios_sim_state.position[i]; }