/** ****************************************************************************** * @addtogroup OpenPilotModules OpenPilot Modules * @{ * @addtogroup CameraStab Camera Stabilization Module * @brief Camera stabilization module * Updates accessory outputs with values appropriate for camera stabilization * @{ * * @file camerastab.c * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. * @brief Stabilize camera against the roll pitch and yaw of aircraft * * @see The GNU Public License (GPL) Version 3 * *****************************************************************************/ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /** * Output object: Accessory * * This module will periodically calculate the output values for stabilizing the camera * * UAVObjects are automatically generated by the UAVObjectGenerator from * the object definition XML file. * * Modules have no API, all communication to other modules is done through UAVObjects. * However modules may use the API exposed by shared libraries. * See the OpenPilot wiki for more details. * http://www.openpilot.org/OpenPilot_Application_Architecture * */ #include "openpilot.h" #include "accessorydesired.h" #include "attitudeactual.h" // // Configuration // #define SAMPLE_PERIOD_MS 50 // Private types // Private variables // Private functions static void attitudeUpdated(UAVObjEvent* ev); /** * Initialise the module, called on startup * \returns 0 on success or -1 if initialisation failed */ int32_t CameraStabInitialize(void) { static UAVObjEvent ev; ev.obj = AttitudeActualHandle(); ev.instId = 0; ev.event = 0; EventPeriodicCallbackCreate(&ev, attitudeUpdated, SAMPLE_PERIOD_MS / portTICK_RATE_MS); return 0; } static void attitudeUpdated(UAVObjEvent* ev) { if (ev->obj != AttitudeActualHandle()) return; float attitude; AccessoryDesiredData accessory; float rollConst = 1.0/35.0; float pitchConst = 1.0/35.0; float yawConst = 1.0/35.0; AttitudeActualRollGet(&attitude); accessory.AccessoryVal = attitude * rollConst; if(AccessoryDesiredInstSet(0, &accessory) != 0) AccessoryDesiredCreateInstance(); AttitudeActualPitchGet(&attitude); accessory.AccessoryVal = attitude * pitchConst; if(AccessoryDesiredInstSet(1, &accessory) != 0) AccessoryDesiredCreateInstance(); AttitudeActualYawGet(&attitude); accessory.AccessoryVal = attitude * yawConst; if(AccessoryDesiredInstSet(2, &accessory) != 0) AccessoryDesiredCreateInstance(); } /** * @} */ /** * @} */