{"action":"created","comment":{"url":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/comments/166814160","pull_request_review_id":94936517,"id":166814160,"diff_hunk":"@@ -216,21 +235,55 @@ void AC_WPNav::loiter_soften_for_landing()\n \n     // set target position to current position\n     _pos_control.set_xy_target(curr_pos.x, curr_pos.y);\n-    _pos_control.freeze_ff_xy();\n }\n \n-/// set_pilot_desired_acceleration - sets pilot desired acceleration from roll and pitch stick input\n-void AC_WPNav::set_pilot_desired_acceleration(float control_roll, float control_pitch)\n+/// set pilot desired acceleration in centi-degrees\n+//   dt should be the time (in seconds) since the last call to this function\n+void AC_WPNav::set_pilot_desired_acceleration(float euler_roll_angle_cd, float euler_pitch_angle_cd, float dt)\n {\n-    // convert pilot input to desired acceleration in cm/s/s\n-    _pilot_accel_fwd_cms = -control_pitch * _loiter_accel_cmss / 4500.0f;\n-    _pilot_accel_rgt_cms = control_roll * _loiter_accel_cmss / 4500.0f;\n+    // Convert from centidegrees on public interface to radians\n+    const float euler_roll_angle = radians(euler_roll_angle_cd*0.01f);\n+    const float euler_pitch_angle = radians(euler_pitch_angle_cd*0.01f);\n+\n+    // difference between where we think we should be and where we want to be\n+    Vector2f angle_error(wrap_PI(euler_roll_angle-_loiter_predicted_euler_angle.x), wrap_PI(euler_pitch_angle-_loiter_predicted_euler_angle.y));\n+\n+    // calculate the angular velocity that we would expect given our desired and predicted attitude\n+    _attitude_control.input_shaping_rate_predictor(angle_error, _loiter_predicted_euler_rate, dt);\n+\n+    // update our predicted attitude based on our predicted angular velocity\n+    _loiter_predicted_euler_angle += _loiter_predicted_euler_rate * dt;\n+\n+    // convert our desired attitude to an acceleration vector assuming we are hovering\n+    const float pilot_cos_pitch_target = cosf(euler_pitch_angle);\n+    const float pilot_accel_rgt_cms = GRAVITY_MSS*100.0f * tanf(euler_roll_angle)/pilot_cos_pitch_target;\n+    const float pilot_accel_fwd_cms = -GRAVITY_MSS*100.0f * tanf(euler_pitch_angle);\n+\n+    // convert our predicted attitude to an acceleration vector assuming we are hovering\n+    const float pilot_predicted_cos_pitch_target = cosf(_loiter_predicted_euler_angle.y);\n+    const float pilot_predicted_accel_rgt_cms = GRAVITY_MSS*100.0f * tanf(_loiter_predicted_euler_angle.x)/pilot_predicted_cos_pitch_target;\n+    const float pilot_predicted_accel_fwd_cms = -GRAVITY_MSS*100.0f * tanf(_loiter_predicted_euler_angle.y);\n+\n+    // rotate acceleration vectors input to lat/lon frame\n+    _loiter_desired_accel.x = (pilot_accel_fwd_cms*_ahrs.cos_yaw() - pilot_accel_rgt_cms*_ahrs.sin_yaw());\n+    _loiter_desired_accel.y = (pilot_accel_fwd_cms*_ahrs.sin_yaw() + pilot_accel_rgt_cms*_ahrs.cos_yaw());\n+    _loiter_predicted_accel.x = (pilot_predicted_accel_fwd_cms*_ahrs.cos_yaw() - pilot_predicted_accel_rgt_cms*_ahrs.sin_yaw());\n+    _loiter_predicted_accel.y = (pilot_predicted_accel_fwd_cms*_ahrs.sin_yaw() + pilot_predicted_accel_rgt_cms*_ahrs.cos_yaw());\n }\n \n /// get_loiter_stopping_point_xy - returns vector to stopping point based on a horizontal position and velocity\n void AC_WPNav::get_loiter_stopping_point_xy(Vector3f& stopping_point) const\n {\n-\t_pos_control.get_stopping_point_xy(stopping_point);\n+    _pos_control.get_stopping_point_xy(stopping_point);\n+}\n+\n+/// get_loiter_angle_max - returns the maximum lean angle in loiter mode\n+float AC_WPNav::get_loiter_angle_max_cd() const\n+{\n+    if (is_zero(_loiter_angle_max)){\n+        return MIN(_attitude_control.lean_angle_max()*2.0f/3.0f, _pos_control.get_lean_angle_max_cd()*2.0f/3.0f);","path":"libraries/AC_WPNav/AC_WPNav.cpp","position":237,"original_position":237,"commit_id":"39b4d90360538f255e60f2e17b3f176bde0fa821","original_commit_id":"39b4d90360538f255e60f2e17b3f176bde0fa821","user":{"login":"rmackay9","id":1498098,"avatar_url":"https://avatars2.githubusercontent.com/u/1498098?v=4","gravatar_id":"","url":"https://api.github.com/users/rmackay9","html_url":"https://github.com/rmackay9","followers_url":"https://api.github.com/users/rmackay9/followers","following_url":"https://api.github.com/users/rmackay9/following{/other_user}","gists_url":"https://api.github.com/users/rmackay9/gists{/gist_id}","starred_url":"https://api.github.com/users/rmackay9/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmackay9/subscriptions","organizations_url":"https://api.github.com/users/rmackay9/orgs","repos_url":"https://api.github.com/users/rmackay9/repos","events_url":"https://api.github.com/users/rmackay9/events{/privacy}","received_events_url":"https://api.github.com/users/rmackay9/received_events","type":"User","site_admin":false},"body":"sure, moved 2/3 outside of the MIN","created_at":"2018-02-08T01:59:11Z","updated_at":"2018-02-08T01:59:11Z","html_url":"https://github.com/ArduPilot/ardupilot/pull/7659#discussion_r166814160","pull_request_url":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/7659","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/comments/166814160"},"html":{"href":"https://github.com/ArduPilot/ardupilot/pull/7659#discussion_r166814160"},"pull_request":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/7659"}},"in_reply_to_id":166753448},"pull_request":{"url":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/7659","id":167063665,"html_url":"https://github.com/ArduPilot/ardupilot/pull/7659","diff_url":"https://github.com/ArduPilot/ardupilot/pull/7659.diff","patch_url":"https://github.com/ArduPilot/ardupilot/pull/7659.patch","issue_url":"https://api.github.com/repos/ArduPilot/ardupilot/issues/7659","number":7659,"state":"open","locked":false,"title":"Copter: Leonard's new Loiter (attempt 3) and improved EKF reset handling","user":{"login":"rmackay9","id":1498098,"avatar_url":"https://avatars2.githubusercontent.com/u/1498098?v=4","gravatar_id":"","url":"https://api.github.com/users/rmackay9","html_url":"https://github.com/rmackay9","followers_url":"https://api.github.com/users/rmackay9/followers","following_url":"https://api.github.com/users/rmackay9/following{/other_user}","gists_url":"https://api.github.com/users/rmackay9/gists{/gist_id}","starred_url":"https://api.github.com/users/rmackay9/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmackay9/subscriptions","organizations_url":"https://api.github.com/users/rmackay9/orgs","repos_url":"https://api.github.com/users/rmackay9/repos","events_url":"https://api.github.com/users/rmackay9/events{/privacy}","received_events_url":"https://api.github.com/users/rmackay9/received_events","type":"User","site_admin":false},"body":"This is a replacement for PR: https://github.com/ArduPilot/ardupilot/pull/7606\r\n\r\nThe main purpose of this PR is to facilitate the use of Acceleration, Velocity, and Position injection into the Position Controller. This gives us faster reaction times when navigating.  This lays the ground work to allow us to move away from a leash controlled navigation system and instead move to a precise position controlled system.\r\n\r\nThe new loiter controller makes use of the Acceleration feed forward capability to directly inject the pilot commanded acceleration into the Attitude controller. This results in a more direct feeling of control for the pilot but it also means that we need to do some work predicting what the resultant accelerations will be so that we can accurately update our expected velocity and position. This is the purpose of the input-shaping-rate-predictor.\r\n\r\nAC_AttitudeController changes:\r\n\r\n- smoothing_gain is provided by a new set_smoothing_gain() functions instead of being passed into each call to input_euler_angle_xxx.  This is an intermediate step, the longer-term plan is to move the RC_FEEL_RP parameter (from which the smoothing gain is calculated) into the attitude controller.\r\n- add accessor for maximum pitch/roll/yaw acceleration\r\n- add angular velocity limits (aka rotational rate maximums), these are held in ATC_ANG_V_R/P/Y_MAX parameters\r\n- add input-shaping-rate-predictor which is used by AC_WPNav's Loiter.  Maybe @lthall can explain what it's for.\r\n- some renaming of members\r\n\r\nAC_PosControl changes: \r\n\r\n- add acceleration feed-forward.  Again @lthall should explain.\r\n- horizontal position control methods (i.e. pos_to_rate_xy, rate_to_accel_xy and accel_to_lean_angles) are each consolidated into single method (called run_xy_controller).  This is a non-functional change that @lthall thinks makes it easier to read.  Same is done for the z-axis position control methods.\r\n- velocity PID gains are doubled.  This gain increase is required or the new controller's error correction response is too weak.  We should consider whether we want to automatically scale all users existing gains instead of just increasing the defaults.  Very few users actually adjust these gains but a safer thing to do would be to automatically change the scaling.\r\n- PSC_ANGLE_MAX parameter added to allow controlling the maximum lean angle in all modes that use the position controller (Loiter, Auto, etc).  It still has a maximum lean angle of 45degrees enforced by the POSCONROL_ACCEL_XY_MAX definition.\r\n- add set_leash_length_xy() to allow the caller (i.e. AC_WPNav) to limit the maximum position error the controller will use.  I believe there will be a problem though if AC_WPNav uses this and then the user sends a do-change-speed command to the vehicle.\r\n\r\nLoiter changes (in AC_WPNav):\r\n\r\n- Loiter gets active braking.  rate of braking can be configured with WPNAV_BRK_JERK, BRK_ACCEL and BRK_DELAY parameters\r\n- Another maximum lean angle limit (WPNAV_LOIT_ANGM).\r\n\r\nVehicle code changes are mostly just to integrate the above changes.\r\n\r\n","created_at":"2018-02-05T06:00:17Z","updated_at":"2018-02-08T01:59:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8f3ec6d3e72b930bf5a0cabc00d32c6b7c600eba","assignee":null,"assignees":[],"requested_reviewers":[{"login":"tridge","id":831867,"avatar_url":"https://avatars2.githubusercontent.com/u/831867?v=4","gravatar_id":"","url":"https://api.github.com/users/tridge","html_url":"https://github.com/tridge","followers_url":"https://api.github.com/users/tridge/followers","following_url":"https://api.github.com/users/tridge/following{/other_user}","gists_url":"https://api.github.com/users/tridge/gists{/gist_id}","starred_url":"https://api.github.com/users/tridge/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tridge/subscriptions","organizations_url":"https://api.github.com/users/tridge/orgs","repos_url":"https://api.github.com/users/tridge/repos","events_url":"https://api.github.com/users/tridge/events{/privacy}","received_events_url":"https://api.github.com/users/tridge/received_events","type":"User","site_admin":false}],"requested_teams":[],"milestone":null,"commits_url":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/7659/commits","review_comments_url":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/7659/comments","review_comment_url":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ArduPilot/ardupilot/issues/7659/comments","statuses_url":"https://api.github.com/repos/ArduPilot/ardupilot/statuses/39b4d90360538f255e60f2e17b3f176bde0fa821","head":{"label":"rmackay9:lthall-new-loiter13","ref":"lthall-new-loiter13","sha":"39b4d90360538f255e60f2e17b3f176bde0fa821","user":{"login":"rmackay9","id":1498098,"avatar_url":"https://avatars2.githubusercontent.com/u/1498098?v=4","gravatar_id":"","url":"https://api.github.com/users/rmackay9","html_url":"https://github.com/rmackay9","followers_url":"https://api.github.com/users/rmackay9/followers","following_url":"https://api.github.com/users/rmackay9/following{/other_user}","gists_url":"https://api.github.com/users/rmackay9/gists{/gist_id}","starred_url":"https://api.github.com/users/rmackay9/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmackay9/subscriptions","organizations_url":"https://api.github.com/users/rmackay9/orgs","repos_url":"https://api.github.com/users/rmackay9/repos","events_url":"https://api.github.com/users/rmackay9/events{/privacy}","received_events_url":"https://api.github.com/users/rmackay9/received_events","type":"User","site_admin":false},"repo":{"id":7716869,"name":"rmackay9-ardupilot","full_name":"rmackay9/rmackay9-ardupilot","owner":{"login":"rmackay9","id":1498098,"avatar_url":"https://avatars2.githubusercontent.com/u/1498098?v=4","gravatar_id":"","url":"https://api.github.com/users/rmackay9","html_url":"https://github.com/rmackay9","followers_url":"https://api.github.com/users/rmackay9/followers","following_url":"https://api.github.com/users/rmackay9/following{/other_user}","gists_url":"https://api.github.com/users/rmackay9/gists{/gist_id}","starred_url":"https://api.github.com/users/rmackay9/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmackay9/subscriptions","organizations_url":"https://api.github.com/users/rmackay9/orgs","repos_url":"https://api.github.com/users/rmackay9/repos","events_url":"https://api.github.com/users/rmackay9/events{/privacy}","received_events_url":"https://api.github.com/users/rmackay9/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rmackay9/rmackay9-ardupilot","description":"Randy's fork of ArduPilot","fork":true,"url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot","forks_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/forks","keys_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/teams","hooks_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/hooks","issue_events_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/issues/events{/number}","events_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/events","assignees_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/assignees{/user}","branches_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/branches{/branch}","tags_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/tags","blobs_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/git/refs{/sha}","trees_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/statuses/{sha}","languages_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/languages","stargazers_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/stargazers","contributors_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/contributors","subscribers_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/subscribers","subscription_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/subscription","commits_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/commits{/sha}","git_commits_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/git/commits{/sha}","comments_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/comments{/number}","issue_comment_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/issues/comments{/number}","contents_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/contents/{+path}","compare_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/merges","archive_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/downloads","issues_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/issues{/number}","pulls_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/pulls{/number}","milestones_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/milestones{/number}","notifications_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/labels{/name}","releases_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/releases{/id}","deployments_url":"https://api.github.com/repos/rmackay9/rmackay9-ardupilot/deployments","created_at":"2013-01-20T13:54:04Z","updated_at":"2017-10-22T06:09:41Z","pushed_at":"2018-02-07T23:31:25Z","git_url":"git://github.com/rmackay9/rmackay9-ardupilot.git","ssh_url":"git@github.com:rmackay9/rmackay9-ardupilot.git","clone_url":"https://github.com/rmackay9/rmackay9-ardupilot.git","svn_url":"https://github.com/rmackay9/rmackay9-ardupilot","homepage":"","size":99411,"stargazers_count":12,"watchers_count":12,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":14,"mirror_url":null,"archived":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"},"forks":14,"open_issues":0,"watchers":12,"default_branch":"master"}},"base":{"label":"ArduPilot:master","ref":"master","sha":"1103e92884eaf1ad5cf66b8812e61c0d9d3d86b7","user":{"login":"ArduPilot","id":17919847,"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,"name":"ardupilot","full_name":"ArduPilot/ardupilot","owner":{"login":"ArduPilot","id":17919847,"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},"private":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":"2018-02-07T22:48:58Z","pushed_at":"2018-02-08T00:54:39Z","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":95372,"stargazers_count":2980,"watchers_count":2980,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5938,"mirror_url":null,"archived":false,"open_issues_count":1033,"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"},"forks":5938,"open_issues":1033,"watchers":2980,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/7659"},"html":{"href":"https://github.com/ArduPilot/ardupilot/pull/7659"},"issue":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/issues/7659"},"comments":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/issues/7659/comments"},"review_comments":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/7659/comments"},"review_comment":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/pulls/7659/commits"},"statuses":{"href":"https://api.github.com/repos/ArduPilot/ardupilot/statuses/39b4d90360538f255e60f2e17b3f176bde0fa821"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"rmackay9"}}