{"action":"created","comment":{"url":"https://api.github.com/repos/mavlink/mavros/pulls/comments/34554795","id":34554795,"diff_hunk":"@@ -0,0 +1,470 @@\n+/**\n+ * @brief Offboard control test\n+ * @file offboard_control.h\n+ * @author Nuno Marques <n.marques21@hotmail.com>\n+ * @author Andre Nguyen <andre-phu-van.nguyen@polymtl.ca>\n+ *\n+ * @addtogroup sitl_test\n+ * @{\n+ */\n+/*\n+ * Copyright 2015 Nuno Marques, Andre Nguyen.\n+ *\n+ * This file is part of the mavros package and subject to the license terms\n+ * in the top-level LICENSE file of the mavros repository.\n+ * https://github.com/mavlink/mavros/tree/master/LICENSE.md\n+ */\n+\n+#include <mavros/mavros.h>\n+#include <sitl_test/sitl_test.h>\n+#include <sitl_test/test_type.h>\n+\n+#include <geometry_msgs/Point.h>\n+#include <geometry_msgs/PoseStamped.h>\n+#include <geometry_msgs/TwistStamped.h>\n+\n+namespace testtype {\n+/**\n+ * @brief Offboard controller tester\n+ *\n+ * Tests offboard position, velocity and acceleration control\n+ *\n+ */\n+class OffboardControl {\n+public:\n+\tOffboardControl() :\n+\t\tnh_sp(\"~\"),\n+\t\tmode(\"position\"),\n+\t\tshape(\"square\")\n+\t{ };\n+\n+\t/* -*- main routine -*- */\n+\n+\tvoid spin(int argc, char *argv[]) {\n+\t\t/**\n+\t\t * @brief Setpoint control mode selector\n+\t\t *\n+\t\t * Available modes:\n+\t\t * - position\n+\t\t * - velocity\n+\t\t * - acceleration\n+\t\t */\n+\t\tnh_sp.param<std::string>(\"mode\", mode, \"position\");\n+\n+\t\t/**\n+\t\t * @brief Setpoint path shape selector\n+\t\t *\n+\t\t * Available shapes:\n+\t\t * - square\n+\t\t * - circle\n+\t\t * - eight\n+\t\t * - ellipse (in 3D space)\n+\t\t */\n+\t\tnh_sp.param<std::string>(\"shape\", shape, \"square\");\n+\n+\t\tros::Rate loop_rate(10);\n+\n+\t\tROS_INFO(\"SITL Test: Offboard control test running!\");\n+\n+\t\tif (mode.compare(\"position\") == 0) {\n+\t\t\tROS_INFO(\"Position control mode selected.\");\n+\t\t\tif (shape.compare(\"square\") == 0) {\n+\t\t\t\tROS_INFO(\"Test option: square-shaped path...\");\n+\t\t\t\tsquare_path_motion(loop_rate);\n+\t\t\t}\n+\t\t\telse if (shape.compare(\"circle\") == 0) {\n+\t\t\t\tROS_INFO(\"Test option: circle-shaped path...\");\n+\t\t\t\tcircle_path_motion(loop_rate);\n+\t\t\t}\n+\t\t\telse if (shape.compare(\"eight\") == 0) {\n+\t\t\t\tROS_INFO(\"Test option: eight-shaped path...\");\n+\t\t\t\teight_path_motion(loop_rate);\n+\t\t\t}\n+\t\t\telse if (shape.compare(\"ellipse\") == 0) {\n+\t\t\t\tROS_INFO(\"Test option: ellipse-shaped path...\");\n+\t\t\t\tellipse_path_motion(loop_rate);\n+\t\t\t}\n+\t\t}\n+\t\telse if (mode.compare(\"velocity\") == 0) {\n+\t\t\tROS_INFO(\"Velocity control mode selected.\");\n+\t\t\tif (shape.compare(\"square\") == 0) {\n+\t\t\t\tROS_INFO(\"Test option: square-shaped path...\");\n+\t\t\t\tsquare_path_motion(loop_rate);\n+\t\t\t}\n+\t\t\telse if (shape.compare(\"circle\") == 0) {\n+\t\t\t\tROS_INFO(\"Test option: circle-shaped path...\");\n+\t\t\t\tcircle_path_motion(loop_rate);\n+\t\t\t}\n+\t\t\telse if (shape.compare(\"eight\") == 0) {\n+\t\t\t\tROS_INFO(\"Test option: eight-shaped path...\");\n+\t\t\t\teight_path_motion(loop_rate);\n+\t\t\t}\n+\t\t\telse if (shape.compare(\"ellipse\") == 0) {\n+\t\t\t\tROS_INFO(\"Test option: ellipse-shaped path...\");\n+\t\t\t\tellipse_path_motion(loop_rate);\n+\t\t\t}\n+\t\t}\n+\t\telse if (mode.compare(\"acceleration\") == 0) {\n+\t\t\tROS_INFO(\"Velocity control mode selected.\");\n+\t\t\t//TODO\n+\t\t\treturn;\n+\t\t}\n+\t}\n+\n+private:\n+\tros::NodeHandle nh_sp;\n+\tros::Publisher local_pos_sp_pub;\n+\tros::Publisher vel_sp_pub;\n+\tros::Subscriber local_pos_sub;\n+\n+\tstd::string mode;\n+\tstd::string shape;\n+\n+\tgeometry_msgs::PoseStamped localpos;\n+\tgeometry_msgs::PoseStamped ps;\n+\n+\tgeometry_msgs::TwistStamped vs;\n+\n+\t/* -*- alias -*- */\n+    #define X  ps.pose.position.x\n+    #define Y  ps.pose.position.y\n+    #define Z  ps.pose.position.z\n+    #define VX  vs.twist.linear.x\n+    #define VY  vs.twist.linear.y\n+    #define VZ  vs.twist.linear.z\n+    #define sp_X  pos_setpoint().x\n+    #define sp_Y  pos_setpoint().y\n+    #define sp_Z  pos_setpoint().z\n+    #define current_x localpos.pose.position.x\n+    #define current_y localpos.pose.position.y\n+    #define current_z localpos.pose.position.z\n+\n+\t/* -*- helper functions -*- */\n+\n+\t/**\n+\t * @brief Defines single position setpoint\n+\t */\n+\tgeometry_msgs::Point pos_setpoint(){\n+\t\tgeometry_msgs::Point sp;\n+\t\t/** @todo Give possibility to user define amplitude of movement (square corners coordinates)*/\n+\t\tsp.x = 2.0f;\t// meters\n+\t\tsp.y = 2.0f;\n+\t\tsp.z = 1.0f;\n+\t\treturn sp;\n+\t}\n+\n+\t/**\n+\t * @brief Defines circle path\n+\t */\n+\tgeometry_msgs::PoseStamped circle_shape(int angle){\n+\t\tgeometry_msgs::PoseStamped sp;\n+\t\tdouble r = 5.0f;// 5 meters radius\n+\n+\t\tsp.pose.position.x = r * cos(angle * M_PI / 180.0f);\n+\t\tsp.pose.position.y = r * sin(angle * M_PI / 180.0f);\n+\t\tsp.pose.position.z = 1.0f;\n+\n+\t\treturn sp;\n+\t}\n+\n+\t/**\n+\t * @brief Defines Gerono lemniscate path\n+\t */\n+\tgeometry_msgs::PoseStamped eight_shape(int angle){\n+\t\tgeometry_msgs::PoseStamped sp;\n+\t\tdouble a = 5.0f;// vertical tangent with 5 meters size\n+\n+\t\tsp.pose.position.x = a * cos(angle * M_PI / 180.0f);\n+\t\tsp.pose.position.y = a * sin(angle * M_PI / 180.0f) * cos(angle * M_PI / 180.0f);\n+\t\tsp.pose.position.z = 1.0f;\n+\n+\t\treturn sp;\n+\t}\n+\n+\t/**\n+\t * @brief Defines ellipse path\n+\t */\n+\tgeometry_msgs::PoseStamped ellipse_shape(int angle){\n+\t\tgeometry_msgs::PoseStamped sp;\n+\t\tdouble a = 5.0f;// major axis\n+\t\tdouble b = 2.0f;// minor axis\n+\n+\t\t// using spherical coordinates (rotation around y-axis)\n+\t\tsp.pose.position.x = a * cos(angle * M_PI / 180.0f);\n+\t\tsp.pose.position.y = 0.0f;\n+\t\tsp.pose.position.z = 2.5f + b*sin(angle * M_PI / 180.0f);\n+\n+\t\treturn sp;\n+\t}\n+\n+\t/**\n+\t * @brief Square path motion routine\n+\t */\n+\tvoid square_path_motion(ros::Rate loop_rate){\n+\t\tuint8_t pos_target = 0;\n+\n+\t\tlocal_pos_sp_pub = nh_sp.advertise<geometry_msgs::PoseStamped>(\"/mavros/setpoint_position/local\", 10);","path":"test_mavros/include/tests/offboard_control.h","position":206,"original_position":206,"commit_id":"e0b55a35dd3d40d49c68a1ab20b0ba477557e39a","original_commit_id":"e0b55a35dd3d40d49c68a1ab20b0ba477557e39a","user":{"login":"TSC21","id":5048656,"avatar_url":"https://avatars.githubusercontent.com/u/5048656?v=3","gravatar_id":"","url":"https://api.github.com/users/TSC21","html_url":"https://github.com/TSC21","followers_url":"https://api.github.com/users/TSC21/followers","following_url":"https://api.github.com/users/TSC21/following{/other_user}","gists_url":"https://api.github.com/users/TSC21/gists{/gist_id}","starred_url":"https://api.github.com/users/TSC21/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TSC21/subscriptions","organizations_url":"https://api.github.com/users/TSC21/orgs","repos_url":"https://api.github.com/users/TSC21/repos","events_url":"https://api.github.com/users/TSC21/events{/privacy}","received_events_url":"https://api.github.com/users/TSC21/received_events","type":"User","site_admin":false},"body":"Hmm ok. I'll see what I can do.","created_at":"2015-07-14T10:28:59Z","updated_at":"2015-07-14T10:28:59Z","html_url":"https://github.com/mavlink/mavros/pull/337#discussion_r34554795","pull_request_url":"https://api.github.com/repos/mavlink/mavros/pulls/337","_links":{"self":{"href":"https://api.github.com/repos/mavlink/mavros/pulls/comments/34554795"},"html":{"href":"https://github.com/mavlink/mavros/pull/337#discussion_r34554795"},"pull_request":{"href":"https://api.github.com/repos/mavlink/mavros/pulls/337"}}},"pull_request":{"url":"https://api.github.com/repos/mavlink/mavros/pulls/337","id":39710749,"html_url":"https://github.com/mavlink/mavros/pull/337","diff_url":"https://github.com/mavlink/mavros/pull/337.diff","patch_url":"https://github.com/mavlink/mavros/pull/337.patch","issue_url":"https://api.github.com/repos/mavlink/mavros/issues/337","number":337,"state":"open","locked":false,"title":"SITL tests architecture","user":{"login":"TSC21","id":5048656,"avatar_url":"https://avatars.githubusercontent.com/u/5048656?v=3","gravatar_id":"","url":"https://api.github.com/users/TSC21","html_url":"https://github.com/TSC21","followers_url":"https://api.github.com/users/TSC21/followers","following_url":"https://api.github.com/users/TSC21/following{/other_user}","gists_url":"https://api.github.com/users/TSC21/gists{/gist_id}","starred_url":"https://api.github.com/users/TSC21/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TSC21/subscriptions","organizations_url":"https://api.github.com/users/TSC21/orgs","repos_url":"https://api.github.com/users/TSC21/repos","events_url":"https://api.github.com/users/TSC21/events{/privacy}","received_events_url":"https://api.github.com/users/TSC21/received_events","type":"User","site_admin":false},"body":"This is **WIP**, but already usable.\r\n\r\n* Defined test structure: 1. main node `sitl_test_node`, 2. main testing class `TestType`, 3. test classes (as `OffboardPosCtrlSquare`);\r\n* First working test routine `offboard_posctl_square`; Usage: `roslaunch test_mavros iris_empty_world_offboard_posctl_square.launch` \r\n\r\n**NOTE:** Current code only applied to PX4 SITL; not tested with APM SITL.\r\n\r\n**UPDATE:** added a launch file which integrates all the needed nodes (for OFFB POSCTL square shaped path)\r\n\r\n**UPDATE2:** Testing other test routines: Change `shape` parameter on launch file.\r\n\r\n**UPDATE3:** Added velocity setpoint control.\r\n","created_at":"2015-07-10T18:24:46Z","updated_at":"2015-07-14T10:28:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"dc6ac2735c26f6ecc3a794da333eb175f29cb436","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/mavlink/mavros/pulls/337/commits","review_comments_url":"https://api.github.com/repos/mavlink/mavros/pulls/337/comments","review_comment_url":"https://api.github.com/repos/mavlink/mavros/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mavlink/mavros/issues/337/comments","statuses_url":"https://api.github.com/repos/mavlink/mavros/statuses/e0b55a35dd3d40d49c68a1ab20b0ba477557e39a","head":{"label":"TSC21:sitl_tests","ref":"sitl_tests","sha":"e0b55a35dd3d40d49c68a1ab20b0ba477557e39a","user":{"login":"TSC21","id":5048656,"avatar_url":"https://avatars.githubusercontent.com/u/5048656?v=3","gravatar_id":"","url":"https://api.github.com/users/TSC21","html_url":"https://github.com/TSC21","followers_url":"https://api.github.com/users/TSC21/followers","following_url":"https://api.github.com/users/TSC21/following{/other_user}","gists_url":"https://api.github.com/users/TSC21/gists{/gist_id}","starred_url":"https://api.github.com/users/TSC21/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TSC21/subscriptions","organizations_url":"https://api.github.com/users/TSC21/orgs","repos_url":"https://api.github.com/users/TSC21/repos","events_url":"https://api.github.com/users/TSC21/events{/privacy}","received_events_url":"https://api.github.com/users/TSC21/received_events","type":"User","site_admin":false},"repo":{"id":22961222,"name":"mavros","full_name":"TSC21/mavros","owner":{"login":"TSC21","id":5048656,"avatar_url":"https://avatars.githubusercontent.com/u/5048656?v=3","gravatar_id":"","url":"https://api.github.com/users/TSC21","html_url":"https://github.com/TSC21","followers_url":"https://api.github.com/users/TSC21/followers","following_url":"https://api.github.com/users/TSC21/following{/other_user}","gists_url":"https://api.github.com/users/TSC21/gists{/gist_id}","starred_url":"https://api.github.com/users/TSC21/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TSC21/subscriptions","organizations_url":"https://api.github.com/users/TSC21/orgs","repos_url":"https://api.github.com/users/TSC21/repos","events_url":"https://api.github.com/users/TSC21/events{/privacy}","received_events_url":"https://api.github.com/users/TSC21/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/TSC21/mavros","description":"MAVLink to ROS gateway with UDP proxy for Ground Control Station","fork":true,"url":"https://api.github.com/repos/TSC21/mavros","forks_url":"https://api.github.com/repos/TSC21/mavros/forks","keys_url":"https://api.github.com/repos/TSC21/mavros/keys{/key_id}","collaborators_url":"https://api.github.com/repos/TSC21/mavros/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/TSC21/mavros/teams","hooks_url":"https://api.github.com/repos/TSC21/mavros/hooks","issue_events_url":"https://api.github.com/repos/TSC21/mavros/issues/events{/number}","events_url":"https://api.github.com/repos/TSC21/mavros/events","assignees_url":"https://api.github.com/repos/TSC21/mavros/assignees{/user}","branches_url":"https://api.github.com/repos/TSC21/mavros/branches{/branch}","tags_url":"https://api.github.com/repos/TSC21/mavros/tags","blobs_url":"https://api.github.com/repos/TSC21/mavros/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/TSC21/mavros/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/TSC21/mavros/git/refs{/sha}","trees_url":"https://api.github.com/repos/TSC21/mavros/git/trees{/sha}","statuses_url":"https://api.github.com/repos/TSC21/mavros/statuses/{sha}","languages_url":"https://api.github.com/repos/TSC21/mavros/languages","stargazers_url":"https://api.github.com/repos/TSC21/mavros/stargazers","contributors_url":"https://api.github.com/repos/TSC21/mavros/contributors","subscribers_url":"https://api.github.com/repos/TSC21/mavros/subscribers","subscription_url":"https://api.github.com/repos/TSC21/mavros/subscription","commits_url":"https://api.github.com/repos/TSC21/mavros/commits{/sha}","git_commits_url":"https://api.github.com/repos/TSC21/mavros/git/commits{/sha}","comments_url":"https://api.github.com/repos/TSC21/mavros/comments{/number}","issue_comment_url":"https://api.github.com/repos/TSC21/mavros/issues/comments{/number}","contents_url":"https://api.github.com/repos/TSC21/mavros/contents/{+path}","compare_url":"https://api.github.com/repos/TSC21/mavros/compare/{base}...{head}","merges_url":"https://api.github.com/repos/TSC21/mavros/merges","archive_url":"https://api.github.com/repos/TSC21/mavros/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/TSC21/mavros/downloads","issues_url":"https://api.github.com/repos/TSC21/mavros/issues{/number}","pulls_url":"https://api.github.com/repos/TSC21/mavros/pulls{/number}","milestones_url":"https://api.github.com/repos/TSC21/mavros/milestones{/number}","notifications_url":"https://api.github.com/repos/TSC21/mavros/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/TSC21/mavros/labels{/name}","releases_url":"https://api.github.com/repos/TSC21/mavros/releases{/id}","created_at":"2014-08-14T16:45:10Z","updated_at":"2014-08-14T17:53:12Z","pushed_at":"2015-07-13T17:44:59Z","git_url":"git://github.com/TSC21/mavros.git","ssh_url":"git@github.com:TSC21/mavros.git","clone_url":"https://github.com/TSC21/mavros.git","svn_url":"https://github.com/TSC21/mavros","homepage":null,"size":1715,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"mavlink:master","ref":"master","sha":"1223ebc399385afb1e3341c9fc011a464437d9af","user":{"login":"mavlink","id":961247,"avatar_url":"https://avatars.githubusercontent.com/u/961247?v=3","gravatar_id":"","url":"https://api.github.com/users/mavlink","html_url":"https://github.com/mavlink","followers_url":"https://api.github.com/users/mavlink/followers","following_url":"https://api.github.com/users/mavlink/following{/other_user}","gists_url":"https://api.github.com/users/mavlink/gists{/gist_id}","starred_url":"https://api.github.com/users/mavlink/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mavlink/subscriptions","organizations_url":"https://api.github.com/users/mavlink/orgs","repos_url":"https://api.github.com/users/mavlink/repos","events_url":"https://api.github.com/users/mavlink/events{/privacy}","received_events_url":"https://api.github.com/users/mavlink/received_events","type":"Organization","site_admin":false},"repo":{"id":15189073,"name":"mavros","full_name":"mavlink/mavros","owner":{"login":"mavlink","id":961247,"avatar_url":"https://avatars.githubusercontent.com/u/961247?v=3","gravatar_id":"","url":"https://api.github.com/users/mavlink","html_url":"https://github.com/mavlink","followers_url":"https://api.github.com/users/mavlink/followers","following_url":"https://api.github.com/users/mavlink/following{/other_user}","gists_url":"https://api.github.com/users/mavlink/gists{/gist_id}","starred_url":"https://api.github.com/users/mavlink/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mavlink/subscriptions","organizations_url":"https://api.github.com/users/mavlink/orgs","repos_url":"https://api.github.com/users/mavlink/repos","events_url":"https://api.github.com/users/mavlink/events{/privacy}","received_events_url":"https://api.github.com/users/mavlink/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mavlink/mavros","description":"MAVLink to ROS gateway with UDP proxy for Ground Control Station","fork":false,"url":"https://api.github.com/repos/mavlink/mavros","forks_url":"https://api.github.com/repos/mavlink/mavros/forks","keys_url":"https://api.github.com/repos/mavlink/mavros/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mavlink/mavros/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mavlink/mavros/teams","hooks_url":"https://api.github.com/repos/mavlink/mavros/hooks","issue_events_url":"https://api.github.com/repos/mavlink/mavros/issues/events{/number}","events_url":"https://api.github.com/repos/mavlink/mavros/events","assignees_url":"https://api.github.com/repos/mavlink/mavros/assignees{/user}","branches_url":"https://api.github.com/repos/mavlink/mavros/branches{/branch}","tags_url":"https://api.github.com/repos/mavlink/mavros/tags","blobs_url":"https://api.github.com/repos/mavlink/mavros/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mavlink/mavros/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mavlink/mavros/git/refs{/sha}","trees_url":"https://api.github.com/repos/mavlink/mavros/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mavlink/mavros/statuses/{sha}","languages_url":"https://api.github.com/repos/mavlink/mavros/languages","stargazers_url":"https://api.github.com/repos/mavlink/mavros/stargazers","contributors_url":"https://api.github.com/repos/mavlink/mavros/contributors","subscribers_url":"https://api.github.com/repos/mavlink/mavros/subscribers","subscription_url":"https://api.github.com/repos/mavlink/mavros/subscription","commits_url":"https://api.github.com/repos/mavlink/mavros/commits{/sha}","git_commits_url":"https://api.github.com/repos/mavlink/mavros/git/commits{/sha}","comments_url":"https://api.github.com/repos/mavlink/mavros/comments{/number}","issue_comment_url":"https://api.github.com/repos/mavlink/mavros/issues/comments{/number}","contents_url":"https://api.github.com/repos/mavlink/mavros/contents/{+path}","compare_url":"https://api.github.com/repos/mavlink/mavros/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mavlink/mavros/merges","archive_url":"https://api.github.com/repos/mavlink/mavros/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mavlink/mavros/downloads","issues_url":"https://api.github.com/repos/mavlink/mavros/issues{/number}","pulls_url":"https://api.github.com/repos/mavlink/mavros/pulls{/number}","milestones_url":"https://api.github.com/repos/mavlink/mavros/milestones{/number}","notifications_url":"https://api.github.com/repos/mavlink/mavros/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mavlink/mavros/labels{/name}","releases_url":"https://api.github.com/repos/mavlink/mavros/releases{/id}","created_at":"2013-12-14T16:58:11Z","updated_at":"2015-07-13T08:09:16Z","pushed_at":"2015-07-13T17:44:59Z","git_url":"git://github.com/mavlink/mavros.git","ssh_url":"git@github.com:mavlink/mavros.git","clone_url":"https://github.com/mavlink/mavros.git","svn_url":"https://github.com/mavlink/mavros","homepage":null,"size":3991,"stargazers_count":33,"watchers_count":33,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":56,"mirror_url":null,"open_issues_count":25,"forks":56,"open_issues":25,"watchers":33,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mavlink/mavros/pulls/337"},"html":{"href":"https://github.com/mavlink/mavros/pull/337"},"issue":{"href":"https://api.github.com/repos/mavlink/mavros/issues/337"},"comments":{"href":"https://api.github.com/repos/mavlink/mavros/issues/337/comments"},"review_comments":{"href":"https://api.github.com/repos/mavlink/mavros/pulls/337/comments"},"review_comment":{"href":"https://api.github.com/repos/mavlink/mavros/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mavlink/mavros/pulls/337/commits"},"statuses":{"href":"https://api.github.com/repos/mavlink/mavros/statuses/e0b55a35dd3d40d49c68a1ab20b0ba477557e39a"}}}}