Ardupilot Firmware'i Üzerinde Tilt Rotor Kaynak Kodunun İncelenmesi Üzerine Rapor
1. KISIMŞekil 1: Arduplane Kaynak KodlarıArdupilot arduplane kaynak kodu'nu incelediğimizde karşımıza C++ ve interface amacıyla yazılmış header dosyaları gözükmekte. Amacımız, tilt rotoru incelemek üzerine olduğu için kaynak kodlarının arasında tiltrotor.cpp ve tiltrotor.h kodunu görmekteyiz (bkz. Şekil 1). Bir sonraki sayfalarda bahsettiğimiz kaynak kodlarını açıklayacağız.tiltrotor.htiltrotor.h dosyasını incelemeye geçtiğimiz esnada bizi ilk include kısımları karşılamakta.#pragma once#include #include "transition.h"#include AP_Param: bir tür build edilmiş parametre dosyasıdır. Build edildiğinde C++ kodlarında kullanılmak amacıyla bir header file oluşturur. Bu header file ile yer kontrol yazılımı aracılığıyla (bknz. Mission Planner ve QGroundControl) veya manuel olarak oluşturulabilir. Param dosyaları cihazın ne tür olacağı, oluşturulduğu türde ne tür davranışlar sergileyeceğini belirleyen dosyalardır. Örneğin vtol uçak olarak davranış sergileyecek bir cihazın tailsitter mi yoksa multirotor mu olacağını bize bu parametreler belirler.transition: Uçağın durum geçişleri, complete durumları, yaw, pitch ve roll gibi değerlerin update'i bu kısımda yer almakta.// Örnek bir transition class'ıclass Transition{public: Transition(QuadPlane& _quadplane, AP_MotorsMulticopter*& _motors):quadplane(_quadplane),motors(_motors) {}; virtual void update() = 0; virtual void VTOL_update() = 0; virtual void force_transition_complete() = 0; virtual bool complete() const = 0; virtual void restart() = 0; virtual uint8_t get_log_transition_state() const = 0; virtual bool active_frwd() const = 0; virtual bool show_vtol_view() const = 0; virtual void set_FW_roll_pitch(int32_t& nav_pitch_cd, int32_t& nav_roll_cd) {}; virtual bool set_FW_roll_limit(int32_t& roll_limit_cd) { return false; }AP_Logger: İnsansız aracın, durum değişkenleri karşısında (örneğin: takeoff'dan flight mode'a geçmesi) verdiği Uyarı/Kabul/Red durumlarını terminal çıktısı ve log dosyası olarak veren logging kütüphanesi.Kaynak kodlarının tümünü incelediğimizde AP_Logger, transition ve AP_Param dosyalarının kaynak kodlarının bütününde import edildiğini ve kodların belirli bir şablona bağlı kalarak yapıyı ve mimariyi okunaklı bir şekilde geliştirdiğini anlayabiliriz.2. KISIM: tiltrotor.cppKısaca, insansız araçlardaki hareket mekaniğinin ve komutların durum dönüşümlerine bağlı olarak çalıştığını ve belirli parametrelere göre davranış sergilediğini; ayrıca ana C++ dosyasında kullanılacak tüm bileşenlerin header dosyasında tanımlandığını ve asıl kod ile algoritmanın tiltrotor.cpp üzerinde yürütüldüğünü anlamış olduk.2.1. void Tiltrotor::setup(): if (!enable.configured() && ((tilt_mask != 0) || (type == TILT_TYPE_BICOPTER))) { enable.set_and_save(1); } if (enable = 1) { const uint32_t mask = is_zero(new_throttle) ? 0 : tilt_mask.get(); // the motors are all the way forward, start using them for fwd thrust motors->output_motor_mask(new_throttle, mask, plane.rudder_dt); } } else { binary_slew(false); }}Yorum satırı bize şu bilgiyi veriyor:Eğer vtol modda değilsek:Tamamen sabit kanat modundayız. Eğimli motorlarıtamamen öne doğru hareket ettirin ve onları ileri motor olarak çalıştırın.`binary_slew(true)` Motorlari yatırmaya başlar."throttle command" verisini alıp, motorun anlayacağı bir dile çeviriyor. Bir nevi "birim dönüştürücü" diyebiliriz. if (current_tilt >= 1) { const uint32_t mask = is_zero(new_throttle) ? 0 : tilt_mask.get(); // the motors are all the way forward, start using them for fwd thrust motors->output_motor_mask(new_throttle, mask, plane.rudder_dt); }Bu kod parçacığının içindeki yorum satırı zaten bize gerekli bilgiyi vermişmotorlar tamamen öne doğru, ileri itiş için kullanmaya başlayani; `if(current_tilt) >= 1)` motorların tamamen öne doğru olup olmadığıyla ilgili bir koşul(statement).void Tiltrotor::continuous_update(void): // default to inactive _motors_active = false; // the maximum rate of throttle change float max_change; Motor durumu: varsayılan => inaktifitki değişiminin maksimum oranı `max_change` şu anki tahmine göre fonksiyon içerisinde declare edilip döngü veya statement içinde güncel throttle ile kıyaslanması durumunda maximumun atanacağı değişken olarak tanımlanmış olabilir. if (!quadplane.in_vtol_mode() && (!plane.arming.is_armed_and_safety_off() || !quadplane.assisted_flight)) { // we are in pure fixed wing mode. Move the tiltable motors all the way forward and run them as // a forward motor // option set then if disarmed move to VTOL position to prevent ground strikes, allow tilt forward in manual mode for testing const bool disarmed_tilt_up = !plane.arming.is_armed_and_safety_off() && (plane.control_mode != &plane.mode_manual) && quadplane.option_is_set(QuadPlane::Option::DISARMED_TILT_UP); slew(disarmed_tilt_up ? 0.0 : get_forward_flight_tilt()); max_change = tilt_max_change(false); float new_throttle = constrain_float(SRV_Channels::get_output_scaled(SRV_Channel::k_throttle)*0.01, 0, 1); if (current_tilt < get_fully_forward_tilt()) { current_throttle = constrain_float(new_throttle, current_throttle-max_change, current_throttle+max_change); } else { current_throttle = new_throttle; } if (!plane.arming.is_armed_and_safety_off()) { current_throttle = 0; } else { // prevent motor shutdown _motors_active = true; } if (!quadplane.motor_test.running) { // the motors are all the way forward, start using them for fwd thrust const uint32_t mask = is_zero(current_throttle) ? 0U : tilt_mask.get(); motors->output_motor_mask(current_throttle, mask, plane.rudder_dt); } return; }if (!quadplane.in_vtol_mode() && (!plane.arming.is_armed_and_safety_off() || !quadplane.assisted_flight)) {Bu parçacıktaki koşul şu;Araç şu an vtol modundaysa ve arm edilmemişse veyahut yardımlı uçuş aktif değilseve sonrasında şu yorum satırları bizi doğrulamış olurTamamen sabit kanat modundayız. Eğilebilir motorları tamamen öne doğru hareket ettirin ve ileri motor olarak çalıştırın. // option set then if disarmed move to VTOL position to prevent ground strikes, allow tilt forward in manual mode for testing const bool disarmed_tilt_up = !plane.arming.is_armed_and_safety_off() && (plane.control_mode != &plane.mode_manual) && quadplane.option_is_set(QuadPlane::Option::DISARMED_TILT_UP); slew(disarmed_tilt_up ? 0.0 : get_forward_flight_tilt());Bu parçacıktaki yorum satırı bize şunu söylüyor:Seçenek aktifse; motorlar kilitliyken (disarm) pervanelerin yere çarpmasını önlemek için VTOL konumuna geç, test işlemleri için manuel modda motorların ileri doğru yatmasına izin ver.Aslında baktığımız zaman, kodlardaki geliştirici kodları bizim bütün sorularımızın cevabını veriyor. Yorum satırlarındaki cümleleri kod satırlarındaki keywordlerle bağdaştırmaya çalışırsak gerçekten ilk bakışta kodun ne olduğunu anlayabiliyoruz.Açık kaynak kodların yeni projelere adapte olabilmesinin sebebi bu işte. Geliştirici işini iyi yapıyorsa çok fazla irdelememize gerek kalmıyor. Hem kod bakımından hem de yorum satırlarındaki notlar bakımından.Konumuza geri dönecek olursak bu if bloğu içerisinde olası farklı durumlarda kalkış esnasında çarpışma önleme(collision prevention) sağlanmakta. // remember the throttle level we're using for VTOL flight float motors_throttle = motors->get_throttle(); max_change = tilt_max_change(motors_throttle 1) Q_FWD_THR_USE tarafından belirlenen Q_AUTOTUNE hariç VTOL modlarında Q_FWD_THR_GAIN tarafından kontrol edilen ileri gaz kelebeği kullanımı. 2) Manuel ileri gaz kelebeği kontrolü ile QACRO, QSTABILIZE ve QHOVER için3) RC girişi veya hesaplanan ileri gaz değeri olmadan, açı