{"action":"created","comment":{"url":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/comments/340881462","pull_request_review_id":309551112,"id":340881462,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDM0MDg4MTQ2Mg==","diff_hunk":"@@ -0,0 +1,110 @@\n+#pragma once\n+\n+#include <AP_Common/AP_Common.h>\n+#include <AP_Param/AP_Param.h>\n+#include <AP_Math/AP_Math.h>\n+#include <AP_Logger/AP_Logger.h>\n+#include <AP_RPM/AP_RPM.h>\n+#include <AP_Motors/AP_Motors.h>\n+#include <AP_Motors/AP_MotorsHeli_RSC.h>\n+#include <AC_AttitudeControl/AC_AttitudeControl.h>\n+#include <AP_InertialNav/AP_InertialNav.h>\n+#include <Filter/Filter.h>\n+#include <Filter/LowPassFilter.h>\n+#include <AC_PID/AC_P.h>\n+\n+//Autorotation controller defaults\n+#define AROT_BAIL_OUT_TIME                            2.0f     // Default time for bail out controller to run (unit: s)\n+#define HEAD_SPEED_TARGET_RATIO                       1.0f     // Normalised target main rotor head speed (unit: -)\n+\n+// Head Speed (HS) controller specific default definitions\n+#define HS_CONTROLLER_COLLECTIVE_CUTOFF_FREQ          2.0f     // low-pass filter on accel error (unit: hz)\n+#define HS_CONTROLLER_HEADSPEED_P                     0.7f     // Default P gain for head speed controller (unit: -)\n+#define HS_CONTROLLER_ENTRY_COL_FLITER                0.35f    // Default low pass filter frequency during the entry phase (unit: Hz)\n+#define HS_CONTROLLER_GLIDE_COL_FLITER                0.05f    // Default low pass filter frequency during the glide phase (unit: Hz)\n+\n+// Speed Height controller specific default definitions for autorotation use\n+#define SPD_HGT_CONTROLLER_GND_SPEED_TARGET           1100.0f  // Default target ground speed for speed height controller (unit: cm/s)\n+#define SPD_HGT_CONTROLLER_MAX_ACCEL                  100.0f   // Default acceleration limit for speed height controller (unit: cm/s/s)\n+\n+class AC_Autorotation\n+{\n+public:\n+\n+    /// Constructor\n+AC_Autorotation(const AP_AHRS_View& ahrs,\n+                     const AP_InertialNav& inav,\n+                     AP_Motors& motors,\n+                     AC_AttitudeControl& attitude_control) :\n+    _ahrs(ahrs),\n+    _inav(inav),\n+    _motors(motors),\n+    _attitude_control(attitude_control),\n+    _p_hs(HS_CONTROLLER_HEADSPEED_P)\n+    {\n+        AP_Param::setup_object_defaults(this, var_info);\n+    }\n+\n+    //--------Functions--------\n+    void init_hs_controller(void);  //Initialise head speed controller\n+    bool update_hs_glide_controller(float dt);  //Update head speed controller\n+    float get_rpm(void) { return _current_rpm; }  //Function just returns the rpm as last read in this library\n+    float get_rpm(bool update_counter);  //Function fetches fresh rpm update and continues sensor health monitoring\n+    void set_target_head_speed(float ths) { _target_head_speed = ths; }  //Sets the normalised target head speed\n+    void set_col_cutoff_freq(float freq) { _col_cutoff_freq = freq; }  //Sets the collective low pass filter cut off frequency\n+    void set_param_values(int16_t* set_point_hs, int16_t* accel, int16_t* targ_s, float* td_alt, float* ent_freq, float* glide_freq, float* bail_time);  //Enables the parameter values to be retrieved by the autorotation flight mode\n+    float get_last_collective() { return _collective_out; }\n+    bool is_enable(void) { return _param_enable; }\n+\n+    // User Settable Parameters\n+    static const struct AP_Param::GroupInfo var_info[];\n+\n+\n+protected:\n+\n+    //--------Internal Variables--------\n+    float _current_rpm;\n+    float _collective_out = 0.0f;\n+    float _head_speed_error;         //Error between target head speed and current head speed.  Normalised by head speed set point RPM.\n+    uint16_t _log_counter = 0;\n+    float _col_cutoff_freq;          //Lowpass filter cutoff frequency (Hz) for collective\n+    uint8_t _unhealthy_rpm_counter;  //Counter used to track RPM sensor unhealthy signal\n+    uint8_t _healthy_rpm_counter;    //Counter used to track RPM sensor healthy signal\n+    float _target_head_speed;        //Normalised target head speed.  Normalised by head speed set point RPM.\n+    float _p_term_hs;                //Proportional contribution to collective setting\n+    float _ff_term_hs;               //Following trim feed forward contribution to collective setting\n+\n+    //--------Parameter Values--------\n+    AC_P _p_hs;\n+    AP_Int8  _param_enable;\n+    AP_Float _param_hs_p;\n+    AP_Int16 _param_head_speed_set_point;\n+    AP_Int16 _param_accel_max;\n+    AP_Int16 _param_target_speed;\n+    AP_Float _param_col_entry_cutoff_freq;\n+    AP_Float _param_col_glide_cutoff_freq;\n+    AP_Float _param_bail_time;\n+    AP_Int8  _param_rpm_instance;\n+\n+    AP_Float _param_td_alt;  //currently no parameter.  Will be used in future work.","path":"libraries/AC_Autorotation/AC_Autorotation.h","position":null,"original_position":89,"commit_id":"c4b5189dcaf786e9635bb80c700391c3e50e49c2","original_commit_id":"b99f6ffeb2a4f16e61370ce377f60885414e2cc4","user":{"login":"Gone4Dirt","id":34512430,"node_id":"MDQ6VXNlcjM0NTEyNDMw","avatar_url":"https://avatars1.githubusercontent.com/u/34512430?v=4","gravatar_id":"","url":"https://api.github.com/users/Gone4Dirt","html_url":"https://github.com/Gone4Dirt","followers_url":"https://api.github.com/users/Gone4Dirt/followers","following_url":"https://api.github.com/users/Gone4Dirt/following{/other_user}","gists_url":"https://api.github.com/users/Gone4Dirt/gists{/gist_id}","starred_url":"https://api.github.com/users/Gone4Dirt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Gone4Dirt/subscriptions","organizations_url":"https://api.github.com/users/Gone4Dirt/orgs","repos_url":"https://api.github.com/users/Gone4Dirt/repos","events_url":"https://api.github.com/users/Gone4Dirt/events{/privacy}","received_events_url":"https://api.github.com/users/Gone4Dirt/received_events","type":"User","site_admin":false},"body":"Variable is used, but it isn't used as a parameter in the its current form.  Have changed it to a float.","created_at":"2019-10-30T22:06:50Z","updated_at":"2019-10-30T22:06:51Z","html_url":"https://github.com/ArduPilot/ardupilot/pull/12108#discussion_r340881462","pull_request_url":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/12108","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/comments/340881462"},"html":{"href":"https://github.com/ArduPilot/ardupilot/pull/12108#discussion_r340881462"},"pull_request":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/12108"}},"in_reply_to_id":331339705},"pull_request":{"url":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/12108","id":309530527,"node_id":"MDExOlB1bGxSZXF1ZXN0MzA5NTMwNTI3","html_url":"https://github.com/ArduPilot/ardupilot/pull/12108","diff_url":"https://github.com/ArduPilot/ardupilot/pull/12108.diff","patch_url":"https://github.com/ArduPilot/ardupilot/pull/12108.patch","issue_url":"https://api.github.com/repos/ArduPilot/ardupilot/issues/12108","number":12108,"state":"open","locked":false,"title":"Trad Heli: [GSoC] Autonomous Autorotation - SITL only","user":{"login":"Gone4Dirt","id":34512430,"node_id":"MDQ6VXNlcjM0NTEyNDMw","avatar_url":"https://avatars1.githubusercontent.com/u/34512430?v=4","gravatar_id":"","url":"https://api.github.com/users/Gone4Dirt","html_url":"https://github.com/Gone4Dirt","followers_url":"https://api.github.com/users/Gone4Dirt/followers","following_url":"https://api.github.com/users/Gone4Dirt/following{/other_user}","gists_url":"https://api.github.com/users/Gone4Dirt/gists{/gist_id}","starred_url":"https://api.github.com/users/Gone4Dirt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Gone4Dirt/subscriptions","organizations_url":"https://api.github.com/users/Gone4Dirt/orgs","repos_url":"https://api.github.com/users/Gone4Dirt/repos","events_url":"https://api.github.com/users/Gone4Dirt/events{/privacy}","received_events_url":"https://api.github.com/users/Gone4Dirt/received_events","type":"User","site_admin":false},"body":"This PR is to merge the work done so far on the autonomous autorotation controller.  So far the Entry, Glide, and Bail Out phases have been developed to the point of being ready to incorporate into master.  As it is incomplete, this flight mode has been made SITL only.  Development is ongoing, however I would like for this to be merged into master at this stage to effectively act as a 'space saver' in the code and help me keep on top of maintaining the currency of the code with master.\r\n\r\nHere is a demo of the functionality and brief explaination of how to use the flight mode using Real Flight 8.\r\n\r\nhttps://youtu.be/rG3WAB25ctk\r\n\r\nSwitching into this flight mode is different to 'normal' flight modes.  This diagram illustrates the switchology.\r\n\r\n![Switchology_Flow_Diagram_Mk2](https://user-images.githubusercontent.com/34512430/63439928-e158b800-c426-11e9-91e9-fb9a54f4e5e7.png)\r\n\r\n\r\n**Autorotation Library**\r\n\r\nThis library holds all of the functions and parameters that are bespoke to the autorotation flight mode.  Future autorotation functions will be stored here.  The main two functions are _update_hs_glide_controller()_ and _get_rpm()_.\r\n\r\n_update_hs_glide_controller()_ is the head speed controller.  This manipulates the collective position to achieve and maintain head speed.  It utilises a simple P-term controller and a following trim.  The following trim applys a LPF to the previous collective setting to control the rate at which the trim can change.  During the entry phase the trim changes much quicker to achieve a sensible trim position.  The trim is slowed down during the glide.  This allows for fine tuning adjustments and reduces sensitivity to transient effects such as gusting winds.\r\n\r\n_get_rpm()_ interfaces with the RPM library, getting the correct RPM instance to be used for measuring the main rotor head speed. It also conducts sensor health monitoring and relays to the head speed controller if the sensor can be trusted or not.  A demonstration of the sensor switching and the controller behaviour with poor RPM sensor health can be seen here:\r\n\r\nhttps://youtu.be/6YBl-w4EowY\r\n\r\n**The parameters are as follows:**\r\n\r\n**AROT_ENABLE** - Enables the autorotation mode and displays the AROT parameters.\r\n\r\n**AROT_HS_P** - P gain for the head speed controller.  This parameter should need tuning.  It should work for all helis.\r\n\r\n**AROT_HS_SP** - Set Point for the head speed controller.  This is the target RPM for the main rotor.  Start by using the hover head speed\r\nfor your aircraft.\r\n\r\n**AROT_TARG_SP** - Target forward speed (cm/s).  This is the target speed passed to the speed height controller.\r\n\r\n**AROT_COL_FILT_E** - The low pass filter cut off frequency (Hz), applied to the collective during the entry phase.  This shouldn't need tuning.\r\nHowever, if using a large heli with significant inertia in main rotor, and the head speed hughly over-shoots the target RPM (>450+ RPM) then \r\nconsider reducing this value a little.  Conversly, very small helis with low inertia may need to increase the frequency.  The default value \r\nwill work for all sizes though.  This value should be greater than AROT_COL_FILT_G.\r\n\r\n**AROT_COL_FILT_G** - The low pass filter cut off frequency (Hz), applied to the collective during the glide phase.  This shouldn't need tuning.\r\nHowever, if using a large heli with significant inertia in main rotor, and the head speed oscillates about target RPM (+/-50 RPM), whilst not \r\nmanouvering, then consider reducing this value a little.  Conversly, very small helis with low inertia may need to increase the frequency.  \r\nThe default value will work for all sizes though.  This value should be smaller than AROT_COL_FILT_E.\r\n\r\n**AROT_AS_ACC_MAX** - The maximum forward acceleration applied to the speed-height controller (cm/s/s).\r\n\r\n**AROT_BAIL_TIME** - The time in seconds between initiating the bail out phase and hand over to the new flight mode.\r\n\r\n**AROT_HS_SENSOR** - The RPM sensor instance to be used to measure main rotor head speed.  0 - RPM Sensor 1, 1 - RPM sensor 2.  Must be 0 in SITL with real flight.\r\n\r\n\r\n**Speed Height Library**\r\n\r\nThis library holds the functions for the forward speed/pitch control.  This library was cherry-picked from @bnsgeyer 's L1-nav controller.  I have modified it  slightly.  I moved the forward speed  calculation into its own function, to allow it to be used by _mode_autorotation.cpp_.  I removed the D-term as it is unnecessary/doesn't contribute must to this controller.  The controller uses the PID library to convert the desired velocity into a desired acceleration.  The acceleration is then limited to prevent over pitching and ensure smooth transitions.  The acceleration is then converted into a pitch target using a little geometry.  The pitch target is retrieved by _mode_autorotation.cpp_ and passed to the attitude controller.\r\n\r\n**The parameters are as follows:**\r\n\r\n**SPDHGT_VEL_P** - P term gain\r\n\r\n**SPDHGT_VEL_I** - I term gain\r\n\r\n**SPDHGT_VEL_D** - D term gain.  Not used but shows up as part of the PID library.\r\n\r\n**SPDHGT_VEL_FF** - Feed forward term gain\r\n\r\n**SPDHGT_VEL_IMAX** - I term limit.\r\n\r\n**SPDHGT_VEL_FLTT** - Target filter\r\n\r\n**SPDHGT_VEL_FLTE** - Error filter\r\n\r\n**SPDHGT_VEL_FLTD** - D term filter.   Not used but shows up as part of the PID library.","created_at":"2019-08-21T14:29:49Z","updated_at":"2019-10-30T22:06:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e1ad5a5b42f3a6a5695fdd719a4135887826765b","assignee":null,"assignees":[],"requested_reviewers":[{"login":"ChristopherOlson","id":22397132,"node_id":"MDQ6VXNlcjIyMzk3MTMy","avatar_url":"https://avatars1.githubusercontent.com/u/22397132?v=4","gravatar_id":"","url":"https://api.github.com/users/ChristopherOlson","html_url":"https://github.com/ChristopherOlson","followers_url":"https://api.github.com/users/ChristopherOlson/followers","following_url":"https://api.github.com/users/ChristopherOlson/following{/other_user}","gists_url":"https://api.github.com/users/ChristopherOlson/gists{/gist_id}","starred_url":"https://api.github.com/users/ChristopherOlson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ChristopherOlson/subscriptions","organizations_url":"https://api.github.com/users/ChristopherOlson/orgs","repos_url":"https://api.github.com/users/ChristopherOlson/repos","events_url":"https://api.github.com/users/ChristopherOlson/events{/privacy}","received_events_url":"https://api.github.com/users/ChristopherOlson/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":25281236,"node_id":"MDU6TGFiZWwyNTI4MTIzNg==","url":"https://api.github.com/repos/ArduPilot/ardupilot/labels/TradHeli","name":"TradHeli","color":"02e10c","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/12108/commits","review_comments_url":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/12108/comments","review_comment_url":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ArduPilot/ardupilot/issues/12108/comments","statuses_url":"https://api.github.com/repos/ArduPilot/ardupilot/statuses/c4b5189dcaf786e9635bb80c700391c3e50e49c2","head":{"label":"Gone4Dirt:AROT-Master","ref":"AROT-Master","sha":"c4b5189dcaf786e9635bb80c700391c3e50e49c2","user":{"login":"Gone4Dirt","id":34512430,"node_id":"MDQ6VXNlcjM0NTEyNDMw","avatar_url":"https://avatars1.githubusercontent.com/u/34512430?v=4","gravatar_id":"","url":"https://api.github.com/users/Gone4Dirt","html_url":"https://github.com/Gone4Dirt","followers_url":"https://api.github.com/users/Gone4Dirt/followers","following_url":"https://api.github.com/users/Gone4Dirt/following{/other_user}","gists_url":"https://api.github.com/users/Gone4Dirt/gists{/gist_id}","starred_url":"https://api.github.com/users/Gone4Dirt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Gone4Dirt/subscriptions","organizations_url":"https://api.github.com/users/Gone4Dirt/orgs","repos_url":"https://api.github.com/users/Gone4Dirt/repos","events_url":"https://api.github.com/users/Gone4Dirt/events{/privacy}","received_events_url":"https://api.github.com/users/Gone4Dirt/received_events","type":"User","site_admin":false},"repo":{"id":145554355,"node_id":"MDEwOlJlcG9zaXRvcnkxNDU1NTQzNTU=","name":"ardupilot","full_name":"Gone4Dirt/ardupilot","private":false,"owner":{"login":"Gone4Dirt","id":34512430,"node_id":"MDQ6VXNlcjM0NTEyNDMw","avatar_url":"https://avatars1.githubusercontent.com/u/34512430?v=4","gravatar_id":"","url":"https://api.github.com/users/Gone4Dirt","html_url":"https://github.com/Gone4Dirt","followers_url":"https://api.github.com/users/Gone4Dirt/followers","following_url":"https://api.github.com/users/Gone4Dirt/following{/other_user}","gists_url":"https://api.github.com/users/Gone4Dirt/gists{/gist_id}","starred_url":"https://api.github.com/users/Gone4Dirt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Gone4Dirt/subscriptions","organizations_url":"https://api.github.com/users/Gone4Dirt/orgs","repos_url":"https://api.github.com/users/Gone4Dirt/repos","events_url":"https://api.github.com/users/Gone4Dirt/events{/privacy}","received_events_url":"https://api.github.com/users/Gone4Dirt/received_events","type":"User","site_admin":false},"html_url":"https://github.com/Gone4Dirt/ardupilot","description":"ArduPlane, ArduCopter, ArduRover source","fork":true,"url":"https://api.github.com/repos/Gone4Dirt/ardupilot","forks_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/forks","keys_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/teams","hooks_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/hooks","issue_events_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/issues/events{/number}","events_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/events","assignees_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/assignees{/user}","branches_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/branches{/branch}","tags_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/tags","blobs_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/git/refs{/sha}","trees_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/statuses/{sha}","languages_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/languages","stargazers_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/stargazers","contributors_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/contributors","subscribers_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/subscribers","subscription_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/subscription","commits_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/commits{/sha}","git_commits_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/git/commits{/sha}","comments_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/comments{/number}","issue_comment_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/issues/comments{/number}","contents_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/contents/{+path}","compare_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/merges","archive_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/downloads","issues_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/issues{/number}","pulls_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/pulls{/number}","milestones_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/milestones{/number}","notifications_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/labels{/name}","releases_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/releases{/id}","deployments_url":"https://api.github.com/repos/Gone4Dirt/ardupilot/deployments","created_at":"2018-08-21T11:26:51Z","updated_at":"2019-09-21T11:42:59Z","pushed_at":"2019-10-29T18:14:29Z","git_url":"git://github.com/Gone4Dirt/ardupilot.git","ssh_url":"git@github.com:Gone4Dirt/ardupilot.git","clone_url":"https://github.com/Gone4Dirt/ardupilot.git","svn_url":"https://github.com/Gone4Dirt/ardupilot","homepage":"http://ardupilot.org/","size":144022,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ArduPilot:master","ref":"master","sha":"642935fd43f9de6abfa15526cfc62474f70e49ab","user":{"login":"ArduPilot","id":17919847,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3OTE5ODQ3","avatar_url":"https://avatars3.githubusercontent.com/u/17919847?v=4","gravatar_id":"","url":"https://api.github.com/users/ArduPilot","html_url":"https://github.com/ArduPilot","followers_url":"https://api.github.com/users/ArduPilot/followers","following_url":"https://api.github.com/users/ArduPilot/following{/other_user}","gists_url":"https://api.github.com/users/ArduPilot/gists{/gist_id}","starred_url":"https://api.github.com/users/ArduPilot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ArduPilot/subscriptions","organizations_url":"https://api.github.com/users/ArduPilot/orgs","repos_url":"https://api.github.com/users/ArduPilot/repos","events_url":"https://api.github.com/users/ArduPilot/events{/privacy}","received_events_url":"https://api.github.com/users/ArduPilot/received_events","type":"Organization","site_admin":false},"repo":{"id":7512484,"node_id":"MDEwOlJlcG9zaXRvcnk3NTEyNDg0","name":"ardupilot","full_name":"ArduPilot/ardupilot","private":false,"owner":{"login":"ArduPilot","id":17919847,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3OTE5ODQ3","avatar_url":"https://avatars3.githubusercontent.com/u/17919847?v=4","gravatar_id":"","url":"https://api.github.com/users/ArduPilot","html_url":"https://github.com/ArduPilot","followers_url":"https://api.github.com/users/ArduPilot/followers","following_url":"https://api.github.com/users/ArduPilot/following{/other_user}","gists_url":"https://api.github.com/users/ArduPilot/gists{/gist_id}","starred_url":"https://api.github.com/users/ArduPilot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ArduPilot/subscriptions","organizations_url":"https://api.github.com/users/ArduPilot/orgs","repos_url":"https://api.github.com/users/ArduPilot/repos","events_url":"https://api.github.com/users/ArduPilot/events{/privacy}","received_events_url":"https://api.github.com/users/ArduPilot/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/ArduPilot/ardupilot","description":"ArduPlane, ArduCopter, ArduRover source","fork":false,"url":"https://api.github.com/repos/ArduPilot/ardupilot","forks_url":"https://api.github.com/repos/ArduPilot/ardupilot/forks","keys_url":"https://api.github.com/repos/ArduPilot/ardupilot/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ArduPilot/ardupilot/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ArduPilot/ardupilot/teams","hooks_url":"https://api.github.com/repos/ArduPilot/ardupilot/hooks","issue_events_url":"https://api.github.com/repos/ArduPilot/ardupilot/issues/events{/number}","events_url":"https://api.github.com/repos/ArduPilot/ardupilot/events","assignees_url":"https://api.github.com/repos/ArduPilot/ardupilot/assignees{/user}","branches_url":"https://api.github.com/repos/ArduPilot/ardupilot/branches{/branch}","tags_url":"https://api.github.com/repos/ArduPilot/ardupilot/tags","blobs_url":"https://api.github.com/repos/ArduPilot/ardupilot/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ArduPilot/ardupilot/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ArduPilot/ardupilot/git/refs{/sha}","trees_url":"https://api.github.com/repos/ArduPilot/ardupilot/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ArduPilot/ardupilot/statuses/{sha}","languages_url":"https://api.github.com/repos/ArduPilot/ardupilot/languages","stargazers_url":"https://api.github.com/repos/ArduPilot/ardupilot/stargazers","contributors_url":"https://api.github.com/repos/ArduPilot/ardupilot/contributors","subscribers_url":"https://api.github.com/repos/ArduPilot/ardupilot/subscribers","subscription_url":"https://api.github.com/repos/ArduPilot/ardupilot/subscription","commits_url":"https://api.github.com/repos/ArduPilot/ardupilot/commits{/sha}","git_commits_url":"https://api.github.com/repos/ArduPilot/ardupilot/git/commits{/sha}","comments_url":"https://api.github.com/repos/ArduPilot/ardupilot/comments{/number}","issue_comment_url":"https://api.github.com/repos/ArduPilot/ardupilot/issues/comments{/number}","contents_url":"https://api.github.com/repos/ArduPilot/ardupilot/contents/{+path}","compare_url":"https://api.github.com/repos/ArduPilot/ardupilot/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ArduPilot/ardupilot/merges","archive_url":"https://api.github.com/repos/ArduPilot/ardupilot/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ArduPilot/ardupilot/downloads","issues_url":"https://api.github.com/repos/ArduPilot/ardupilot/issues{/number}","pulls_url":"https://api.github.com/repos/ArduPilot/ardupilot/pulls{/number}","milestones_url":"https://api.github.com/repos/ArduPilot/ardupilot/milestones{/number}","notifications_url":"https://api.github.com/repos/ArduPilot/ardupilot/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ArduPilot/ardupilot/labels{/name}","releases_url":"https://api.github.com/repos/ArduPilot/ardupilot/releases{/id}","deployments_url":"https://api.github.com/repos/ArduPilot/ardupilot/deployments","created_at":"2013-01-09T00:58:52Z","updated_at":"2019-10-30T21:24:36Z","pushed_at":"2019-10-30T21:24:32Z","git_url":"git://github.com/ArduPilot/ardupilot.git","ssh_url":"git@github.com:ArduPilot/ardupilot.git","clone_url":"https://github.com/ArduPilot/ardupilot.git","svn_url":"https://github.com/ArduPilot/ardupilot","homepage":"http://ardupilot.org/","size":145441,"stargazers_count":4450,"watchers_count":4450,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":8433,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":1623,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":8433,"open_issues":1623,"watchers":4450,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/12108"},"html":{"href":"https://github.com/ArduPilot/ardupilot/pull/12108"},"issue":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/issues/12108"},"comments":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/issues/12108/comments"},"review_comments":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/12108/comments"},"review_comment":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/12108/commits"},"statuses":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/statuses/c4b5189dcaf786e9635bb80c700391c3e50e49c2"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"Gone4Dirt"}}