{"action":"created","comment":{"url":"https://api.github.com/repos/dronekit/dronekit-python/pulls/comments/36004514","id":36004514,"diff_hunk":"@@ -0,0 +1,461 @@\n+.. _auto_mode_vehicle_control:\n+\n+==============================\n+Missions (AUTO Mode)\n+==============================\n+\n+AUTO mode is used run pre-defined waypoint missions on Copter, Plane and Rover. \n+\n+DroneKit-Python provides basic methods to download and clear the current mission commands \n+from the vehicle, to add and upload new mission commands, to count the number of waypoints, \n+and to read and set the currently executed mission command. \n+Using these primitive methods you can create any other needed mission planning functionality.\n+\n+This section shows how to use the basic methods and provides a few useful helper functions.\n+Most of the code can be observed running in :ref:`example_mission_basic` and :ref:`example_mission_import_export`.\n+\n+.. note::\n+\n+    We recommend that you :ref:`use GUIDED mode <guided_mode_copter>` instead of AUTO mode where possible, because it offers finer \n+    and more responsive control over movement, and can emulate most mission planning activities.\n+\t\n+    AUTO mode can be helpful if a command you need is not supported in GUIDED mode on a particular vehicle.\n+\t\n+\n+.. _auto_mode_supported_commands: \n+\n+Mission Command Overview\n+==========================\n+\n+The mission commands (e.g. ``MAV_CMD_NAV_TAKEOFF``, ``MAV_CMD_NAV_WAYPOINT`` ) supported for each vehicle type are listed here: \n+`Copter <http://copter.ardupilot.com/wiki/common-mavlink-mission-command-messages-mav_cmd/#commands_supported_by_copter>`_, \n+`Plane <http://plane.ardupilot.com/wiki/common-mavlink-mission-command-messages-mav_cmd/#commands_supported_by_plane>`_, \n+`Rover <http://rover.ardupilot.com/wiki/common-mavlink-mission-command-messages-mav_cmd/#commands_supported_by_rover>`_.\n+\n+.. tip:: If the autopilot receives a command that it cannot handle, then the command will be (silently) dropped.\n+\n+There are three types of commands:\n+\n+* *NAVigation commands* (``MAV_CMD_NAV_*``) are used to control vehicle movement, \n+  including takeoff, moving to and around waypoints, changing altitude, and landing.\n+* *DO commands* (``MAV_CMD_DO_*``) are for auxiliary functions that do not affect the vehicle’s position \n+  (for example, setting the camera trigger distance, or setting a servo value).\n+* *CONDITION commands* (``MAV_CMD_NAV_*``) are used to delay *DO commands* until some condition is met. \n+  For example ``MAV_CMD_CONDITION_DISTANCE`` will prevent DO commands executing until the vehicle \n+  reaches the specified distance from the waypoint.\n+\n+During a mission at most one *NAV* command and one *DO* or *CONDITION* command can be running **at one time**.\n+*CONDITION* and *DO* commands are associated with the preceding *NAV* command: if the UAV reaches the waypoint before these \n+commands are executed, the next *NAV* command is loaded and they will be skipped.\n+\n+The `MAVLink Mission Command Messages (MAV_CMD) <http://planner.ardupilot.com/wiki/common-mavlink-mission-command-messages-mav_cmd>`_ \n+wiki topic provides a more detailed overview of commands.\n+\n+.. todo:: Add how we can determine dynamically what commands are supported. Probably requires capability API which is not present yet.\n+\n+.. _auto_mode_download_mission: \n+\n+Download current mission\n+========================\n+\n+The mission commands for a vehicle are accessed using the :py:attr:`Vehicle.commands <droneapi.lib.Vehicle.commands>` \n+attribute. The attribute is of type :py:class:`CommandSequence <droneapi.lib.CommandSequence>`, a class that provides ‘array style’ indexed access to the \n+waypoints which make up the mission.\n+\n+Waypoints are not downloaded from vehicle until :py:func:`download() <droneapi.lib.CommandSequence.download>` is called. The download is asynchronous; \n+use :py:func:`wait_valid() <droneapi.lib.CommandSequence.wait_valid>` to block your thread until the download is complete:\n+\n+.. code:: python\n+\n+    # Connect to API provider and get vehicle\n+    api = local_connect()\n+    vehicle = api.get_vehicles()[0]\n+\n+    # Download the vehicle waypoints (commands). Wait until download is complete.\n+    cmds = vehicle.commands\n+    cmds.download()\n+    cmds.wait_valid()\n+\n+.. note::\n+\n+    The commands downloaded from the vehicle will include a waypoint for the :ref:`home location <vehicle_state_home_location>` in the first position (0 index).\n+    This waypoint is not editable - it cannot be removed or modified.\n+\n+.. todo:: \n+\n+    The information about home location will change with \n+    `#207 WIP:Adds separate .home_location from .commands array <https://github.com/dronekit/dronekit-python/pull/207>`_.\n+\n+\n+.. _auto_mode_clear_mission: \n+\n+Clearing current mission\n+========================\n+\n+To clear a mission you call :py:func:`clear() <droneapi.lib.CommandSequence.clear>` and then \n+:py:func:`flush() <droneapi.lib.Vehicle.flush>` (to upload the changes to the vehicle):\n+\n+.. code:: python\n+\n+    # Connect to API provider and get vehicle\n+    api = local_connect()\n+    vehicle = api.get_vehicles()[0]\n+    cmds = vehicle.commands\n+\n+    # Clear Vehicle.commands and flush.\n+    cmds.clear()\n+    vehicle.flush()\n+\t\n+    # Reset the Vehicle.commands from the vehicle.\n+    cmds.download()\n+    cmds.wait_valid()\n+\t\n+.. warning:: \n+\n+    You must re-download the mission from the vehicle after clearing (as shown above) or the first command you add \n+    will be lost when you upload the new mission. \n+\t\n+    This happens because :py:attr:`Vehicle.commands <droneapi.lib.Vehicle.commands>` removes the :ref:`home location <vehicle_state_home_location>` \n+    (see `#132 <https://github.com/dronekit/dronekit-python/issues/132>`_). Downloading adds it back again.\n+\n+If the current command completes before you add a new mission, then the vehicle mode will change to RTL (return to launch).\n+\n+\t\n+.. _auto_mode_adding_command: \n+\n+Creating/adding mission commands\n+================================\n+\t\n+After :ref:`downloading <auto_mode_download_mission>` or :ref:`clearing <auto_mode_clear_mission>` a mission new commands \n+can be added and uploaded to the vehicle. Commands are added to the mission using :py:func:`add() <droneapi.lib.CommandSequence.add>`\n+and are sent to the vehicle (either individually or in batches) using :py:func:`flush() <droneapi.lib.Vehicle.flush>`.\n+\n+Each command is packaged in a :py:class:`Command <droneapi.lib.Command>` object (see that class for the order/meaning of the parameters). \n+The supported commands for each vehicle are :ref:`linked above <auto_mode_supported_commands>`. \n+\n+\n+.. code:: python\n+\n+    from droneapi.lib import Command\n+    from pymavlink import mavutil\n+\n+    # Connect to API provider and get vehicle\n+    api = local_connect()\n+    vehicle = api.get_vehicles()[0]\n+\t\n+    # Get the set of commands from the vehicle\n+    cmds = vehicle.commands\n+    cmds.download()\n+    cmds.wait_valid()\n+\n+    # Create and add commands\n+    cmd1=Command( 0, 0, 0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0, 0, 0, 0, 0, 0, 0, 0, 10)\n+    cmd2=Command( 0, 0, 0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 0, 0, 0, 0, 0, 10, 10, 10)\n+    cmds.add(cmd1)\n+    cmds.add(cmd2)\n+    vehicle.flush() # Send commands\n+\n+\n+\n+\n+.. _auto_mode_modify_mission: \n+\n+Modifying missions\n+==================\n+\t\n+While you can :ref:`add new commands <auto_mode_adding_command>` after :ref:`downloading a mission <auto_mode_download_mission>` \n+it is not possible to directly modify and upload existing commands in ``Vehicle.commands`` (you can modify the commands but \n+changes do not propagate to the vehicle). \n+\n+Instead you copy all the commands into another container (e.g. a list), \n+modify them as needed, then clear ``Vehicle.commands`` and upload the list as a new mission:\n+\n+.. code:: python\n+\n+    api = local_connect()\n+    vehicle = api.get_vehicles()[0]\n+\n+    # Download the current vehicle commands\n+    cmds = vehicle.commands\n+    cmds.download()\n+    cmds.wait_valid()\n+\t\n+    # Save the vehicle commands to a list\n+    missionlist=[]\n+    for cmd in cmds[1:]:  #skip first item as it is home waypoint.\n+        missionlist.append(cmd)\n+\t\t\n+    # Modify the mission as needed. For example, here we change the \n+    # first waypoint into a MAV_CMD_NAV_TAKEOFF command. \n+    missionlist[0].command=mavutil.mavlink.MAV_CMD_NAV_TAKEOFF\n+\t\n+    # Clear the current mission \n+    cmds.clear()\n+    vehicle.flush()\n+    cmds.download()\n+    cmds.wait_valid()\n+\t\n+    #Write the modified mission and flush to the vehicle\n+    for cmd in missionlist:\n+        cmds.add(cmd)\t\n+    vehicle.flush()\n+\n+\n+The changes are not guaranteed to be complete until \n+:py:func:`flush() <droneapi.lib.Vehicle.flush>` is called on the parent ``Vehicle`` object.\n+\n+\n+.. _auto_mode_monitoring_controlling: \n+\n+Running and monitoring missions\n+===============================\n+\n+To start a mission change the mode to AUTO:\n+\n+.. code:: python\n+\n+    # Get an instance of the API endpoint and a vehicle\n+    api = local_connect()\n+    vehicle = api.get_vehicles()[0]\n+\n+    # Set the vehicle into auto mode\n+    vehicle.mode = VehicleMode(\"AUTO\")\n+    vehicle.flush()\n+\n+.. note:: \n+\n+    If the vehicle is in the air, then changing the mode to AUTO is all that is required to start the \n+    mission. \n+\t\n+    **Copter 3.3 release and later:** If the vehicle is on the ground (only), you will additionally need to send the\n+    `MAV_CMD_MISSION_START <http://copter.ardupilot.com/wiki/common-mavlink-mission-command-messages-mav_cmd/#mav_cmd_mission_start>`_ \n+    command.\n+\n+You can stop/pause the current mission by switching out of AUTO mode (e.g. into GUIDED mode). If you switch back to \n+AUTO mode the mission will either restart at the beginning or resume at the current waypoint - the behaviour depends on the value of the \n+`MIS_RESTART <http://copter.ardupilot.com/wiki/arducopter-parameters/#mission_restart_when_entering_auto_mode_mis_restart>`_ \n+parameter (available on all vehicle types).\n+\n+You can monitor the progress of the mission by polling the :py:func:`Vehicle.commands.next <droneapi.lib.CommandSequence.next>` attribute\n+to get the current command number. You can also change the current command by setting the attribute to the desired command number.\n+\n+.. code:: python\n+\n+    vehicle.commands.next=2\n+    print \"Current Waypoint: %s\" % vehicle.commands.next\n+    vehicle.commands.next=4\n+    print \"Current Waypoint: %s\" % vehicle.commands.next\n+\n+There is no need to ``flush()`` changes to ``next`` to the vehicle (and as with other attributes, if you fetch a value, it is updated\n+from the vehicle).\t\n+\n+\n+.. _auto_mode_handle_mission_end: \n+\n+Handling the end of a mission\n+===============================\n+\n+At the end of the mission the vehicle will typically \"loiter\" (hover in place for Copter, \n+circle for Plane, stop for Rover). You can add new commands to the mission, but you will need to toggle from/back to\n+AUTO mode to start it running again.\n+\n+Currently there is no notification in DroneKit when a mission completes. If you need to detect mission end (in order\n+to perform some other operation) then you can either:\n+\n+* Add a dummy mission command and poll :py:func:`Vehicle.commands.next <droneapi.lib.CommandSequence.next>` for the \n+  transition to the final command, or\n+* Compare the current position to the position in the last command.\n+\t\n+\n+\n+\n+.. _auto_mode_useful_functions: \n+\n+Useful Mission functions\n+========================\n+\n+This example code contains a number of functions that might be useful for managing and monitoring missions:\n+\n+.. _auto_mode_load_mission_file: \n+\n+Load a mission from a file\n+-----------------------------\n+\n+``upload_mission()`` uploads a mission from a file. \n+\n+The implementation calls ``readmission()`` (below) to import the mission from a file into a list. The method then\n+clears the existing mission and uploads the new version. \n+\n+Adding mission commands is discussed :ref:`here in the guide <auto_mode_adding_command>`.\n+  \n+.. code:: python\n+\t\t\n+    def upload_mission(aFileName):\n+        \"\"\"\n+        Upload a mission from a file.\n+        \"\"\"\n+        missionlist = readmission(aFileName)\n+        #clear existing mission\n+        print 'Clear mission'\n+        cmds = vehicle.commands\n+        cmds.download()\n+        cmds.wait_valid()\n+        cmds.clear()\n+        vehicle.flush()\n+        print 'ClearCount: %s' % cmds.count\n+    #add new mission\n+    cmds.download()\n+    cmds.wait_valid()\n+    for command in missionlist:\n+        cmds.add(command)\n+    vehicle.flush()\t\n+\n+\t\n+``readmission()`` reads a mission from the specified file and returns a list of :py:class:`Command <droneapi.lib.Command>` objects. \n+\n+Each line is split up. The first line is used to test whether the file has the correct (stated) format. \n+For subsequent lines the values are stored in a :py:class:`Command <droneapi.lib.Command>` object \n+(the values are first cast to the correct ``float`` and ``int`` types for their associated parameters).\n+The commands are added to a list which is returned by the function.\n+  \n+.. code:: python\n+\n+    def readmission(aFileName):\n+        \"\"\"\n+        Load a mission from a file into a list.\n+\t\n+    \tThis function is used by upload_mission().","path":"docs/guide/auto_mode.rst","position":327,"original_position":327,"commit_id":"9c22f1d65be8ce8fd1b3997f4dcb2464cf199899","original_commit_id":"9c22f1d65be8ce8fd1b3997f4dcb2464cf199899","user":{"login":"tcr3dr","id":12703357,"avatar_url":"https://avatars.githubusercontent.com/u/12703357?v=3","gravatar_id":"","url":"https://api.github.com/users/tcr3dr","html_url":"https://github.com/tcr3dr","followers_url":"https://api.github.com/users/tcr3dr/followers","following_url":"https://api.github.com/users/tcr3dr/following{/other_user}","gists_url":"https://api.github.com/users/tcr3dr/gists{/gist_id}","starred_url":"https://api.github.com/users/tcr3dr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tcr3dr/subscriptions","organizations_url":"https://api.github.com/users/tcr3dr/orgs","repos_url":"https://api.github.com/users/tcr3dr/repos","events_url":"https://api.github.com/users/tcr3dr/events{/privacy}","received_events_url":"https://api.github.com/users/tcr3dr/received_events","type":"User","site_admin":false},"body":"Missing a space","created_at":"2015-07-31T18:49:35Z","updated_at":"2015-07-31T18:49:35Z","html_url":"https://github.com/dronekit/dronekit-python/pull/260#discussion_r36004514","pull_request_url":"https://api.github.com/repos/dronekit/dronekit-python/pulls/260","_links":{"self":{"href":"https://api.github.com/repos/dronekit/dronekit-python/pulls/comments/36004514"},"html":{"href":"https://github.com/dronekit/dronekit-python/pull/260#discussion_r36004514"},"pull_request":{"href":"https://api.github.com/repos/dronekit/dronekit-python/pulls/260"}}},"pull_request":{"url":"https://api.github.com/repos/dronekit/dronekit-python/pulls/260","id":41194649,"html_url":"https://github.com/dronekit/dronekit-python/pull/260","diff_url":"https://github.com/dronekit/dronekit-python/pull/260.diff","patch_url":"https://github.com/dronekit/dronekit-python/pull/260.patch","issue_url":"https://api.github.com/repos/dronekit/dronekit-python/issues/260","number":260,"state":"open","locked":false,"title":"Add Mission documentation","user":{"login":"hamishwillee","id":5368500,"avatar_url":"https://avatars.githubusercontent.com/u/5368500?v=3","gravatar_id":"","url":"https://api.github.com/users/hamishwillee","html_url":"https://github.com/hamishwillee","followers_url":"https://api.github.com/users/hamishwillee/followers","following_url":"https://api.github.com/users/hamishwillee/following{/other_user}","gists_url":"https://api.github.com/users/hamishwillee/gists{/gist_id}","starred_url":"https://api.github.com/users/hamishwillee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hamishwillee/subscriptions","organizations_url":"https://api.github.com/users/hamishwillee/orgs","repos_url":"https://api.github.com/users/hamishwillee/repos","events_url":"https://api.github.com/users/hamishwillee/events{/privacy}","received_events_url":"https://api.github.com/users/hamishwillee/received_events","type":"User","site_admin":false},"body":"This adds mission/auto mode documentation as discussed in #220.\r\n\r\nThe documentation includes two examples, example pages, and a guide topic. It does not include test code, though I have tested the example code :-)\r\n\r\nThe documentation concentrates on basic operations. It advises use of GUIDED mode. It mentions that this can be useful for replacing missing guided mode functionality but does not go into this in any detail (I would like to have, but kept running into too many race condition bugs).\r\n","created_at":"2015-07-30T03:16:50Z","updated_at":"2015-07-31T18:49:35Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e375886fccd884eeb21069edaab9aa5b9a23c5b5","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dronekit/dronekit-python/pulls/260/commits","review_comments_url":"https://api.github.com/repos/dronekit/dronekit-python/pulls/260/comments","review_comment_url":"https://api.github.com/repos/dronekit/dronekit-python/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dronekit/dronekit-python/issues/260/comments","statuses_url":"https://api.github.com/repos/dronekit/dronekit-python/statuses/9c22f1d65be8ce8fd1b3997f4dcb2464cf199899","head":{"label":"hamishwillee:tmp_auto_mode_missions","ref":"tmp_auto_mode_missions","sha":"9c22f1d65be8ce8fd1b3997f4dcb2464cf199899","user":{"login":"hamishwillee","id":5368500,"avatar_url":"https://avatars.githubusercontent.com/u/5368500?v=3","gravatar_id":"","url":"https://api.github.com/users/hamishwillee","html_url":"https://github.com/hamishwillee","followers_url":"https://api.github.com/users/hamishwillee/followers","following_url":"https://api.github.com/users/hamishwillee/following{/other_user}","gists_url":"https://api.github.com/users/hamishwillee/gists{/gist_id}","starred_url":"https://api.github.com/users/hamishwillee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hamishwillee/subscriptions","organizations_url":"https://api.github.com/users/hamishwillee/orgs","repos_url":"https://api.github.com/users/hamishwillee/repos","events_url":"https://api.github.com/users/hamishwillee/events{/privacy}","received_events_url":"https://api.github.com/users/hamishwillee/received_events","type":"User","site_admin":false},"repo":{"id":33153503,"name":"dronekit-python","full_name":"hamishwillee/dronekit-python","owner":{"login":"hamishwillee","id":5368500,"avatar_url":"https://avatars.githubusercontent.com/u/5368500?v=3","gravatar_id":"","url":"https://api.github.com/users/hamishwillee","html_url":"https://github.com/hamishwillee","followers_url":"https://api.github.com/users/hamishwillee/followers","following_url":"https://api.github.com/users/hamishwillee/following{/other_user}","gists_url":"https://api.github.com/users/hamishwillee/gists{/gist_id}","starred_url":"https://api.github.com/users/hamishwillee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hamishwillee/subscriptions","organizations_url":"https://api.github.com/users/hamishwillee/orgs","repos_url":"https://api.github.com/users/hamishwillee/repos","events_url":"https://api.github.com/users/hamishwillee/events{/privacy}","received_events_url":"https://api.github.com/users/hamishwillee/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/hamishwillee/dronekit-python","description":"The python language bindings and mavproxy module for the drone API","fork":true,"url":"https://api.github.com/repos/hamishwillee/dronekit-python","forks_url":"https://api.github.com/repos/hamishwillee/dronekit-python/forks","keys_url":"https://api.github.com/repos/hamishwillee/dronekit-python/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hamishwillee/dronekit-python/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hamishwillee/dronekit-python/teams","hooks_url":"https://api.github.com/repos/hamishwillee/dronekit-python/hooks","issue_events_url":"https://api.github.com/repos/hamishwillee/dronekit-python/issues/events{/number}","events_url":"https://api.github.com/repos/hamishwillee/dronekit-python/events","assignees_url":"https://api.github.com/repos/hamishwillee/dronekit-python/assignees{/user}","branches_url":"https://api.github.com/repos/hamishwillee/dronekit-python/branches{/branch}","tags_url":"https://api.github.com/repos/hamishwillee/dronekit-python/tags","blobs_url":"https://api.github.com/repos/hamishwillee/dronekit-python/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hamishwillee/dronekit-python/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hamishwillee/dronekit-python/git/refs{/sha}","trees_url":"https://api.github.com/repos/hamishwillee/dronekit-python/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hamishwillee/dronekit-python/statuses/{sha}","languages_url":"https://api.github.com/repos/hamishwillee/dronekit-python/languages","stargazers_url":"https://api.github.com/repos/hamishwillee/dronekit-python/stargazers","contributors_url":"https://api.github.com/repos/hamishwillee/dronekit-python/contributors","subscribers_url":"https://api.github.com/repos/hamishwillee/dronekit-python/subscribers","subscription_url":"https://api.github.com/repos/hamishwillee/dronekit-python/subscription","commits_url":"https://api.github.com/repos/hamishwillee/dronekit-python/commits{/sha}","git_commits_url":"https://api.github.com/repos/hamishwillee/dronekit-python/git/commits{/sha}","comments_url":"https://api.github.com/repos/hamishwillee/dronekit-python/comments{/number}","issue_comment_url":"https://api.github.com/repos/hamishwillee/dronekit-python/issues/comments{/number}","contents_url":"https://api.github.com/repos/hamishwillee/dronekit-python/contents/{+path}","compare_url":"https://api.github.com/repos/hamishwillee/dronekit-python/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hamishwillee/dronekit-python/merges","archive_url":"https://api.github.com/repos/hamishwillee/dronekit-python/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hamishwillee/dronekit-python/downloads","issues_url":"https://api.github.com/repos/hamishwillee/dronekit-python/issues{/number}","pulls_url":"https://api.github.com/repos/hamishwillee/dronekit-python/pulls{/number}","milestones_url":"https://api.github.com/repos/hamishwillee/dronekit-python/milestones{/number}","notifications_url":"https://api.github.com/repos/hamishwillee/dronekit-python/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hamishwillee/dronekit-python/labels{/name}","releases_url":"https://api.github.com/repos/hamishwillee/dronekit-python/releases{/id}","created_at":"2015-03-30T23:19:28Z","updated_at":"2015-05-07T03:08:17Z","pushed_at":"2015-07-30T05:14:42Z","git_url":"git://github.com/hamishwillee/dronekit-python.git","ssh_url":"git@github.com:hamishwillee/dronekit-python.git","clone_url":"https://github.com/hamishwillee/dronekit-python.git","svn_url":"https://github.com/hamishwillee/dronekit-python","homepage":null,"size":2604,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dronekit:master","ref":"master","sha":"f1925d1ae77f46438e6878683ac0cf7d6248bb1c","user":{"login":"dronekit","id":12973369,"avatar_url":"https://avatars.githubusercontent.com/u/12973369?v=3","gravatar_id":"","url":"https://api.github.com/users/dronekit","html_url":"https://github.com/dronekit","followers_url":"https://api.github.com/users/dronekit/followers","following_url":"https://api.github.com/users/dronekit/following{/other_user}","gists_url":"https://api.github.com/users/dronekit/gists{/gist_id}","starred_url":"https://api.github.com/users/dronekit/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dronekit/subscriptions","organizations_url":"https://api.github.com/users/dronekit/orgs","repos_url":"https://api.github.com/users/dronekit/repos","events_url":"https://api.github.com/users/dronekit/events{/privacy}","received_events_url":"https://api.github.com/users/dronekit/received_events","type":"Organization","site_admin":false},"repo":{"id":18188537,"name":"dronekit-python","full_name":"dronekit/dronekit-python","owner":{"login":"dronekit","id":12973369,"avatar_url":"https://avatars.githubusercontent.com/u/12973369?v=3","gravatar_id":"","url":"https://api.github.com/users/dronekit","html_url":"https://github.com/dronekit","followers_url":"https://api.github.com/users/dronekit/followers","following_url":"https://api.github.com/users/dronekit/following{/other_user}","gists_url":"https://api.github.com/users/dronekit/gists{/gist_id}","starred_url":"https://api.github.com/users/dronekit/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dronekit/subscriptions","organizations_url":"https://api.github.com/users/dronekit/orgs","repos_url":"https://api.github.com/users/dronekit/repos","events_url":"https://api.github.com/users/dronekit/events{/privacy}","received_events_url":"https://api.github.com/users/dronekit/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dronekit/dronekit-python","description":"The python language bindings and mavproxy module for DroneKit","fork":false,"url":"https://api.github.com/repos/dronekit/dronekit-python","forks_url":"https://api.github.com/repos/dronekit/dronekit-python/forks","keys_url":"https://api.github.com/repos/dronekit/dronekit-python/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dronekit/dronekit-python/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dronekit/dronekit-python/teams","hooks_url":"https://api.github.com/repos/dronekit/dronekit-python/hooks","issue_events_url":"https://api.github.com/repos/dronekit/dronekit-python/issues/events{/number}","events_url":"https://api.github.com/repos/dronekit/dronekit-python/events","assignees_url":"https://api.github.com/repos/dronekit/dronekit-python/assignees{/user}","branches_url":"https://api.github.com/repos/dronekit/dronekit-python/branches{/branch}","tags_url":"https://api.github.com/repos/dronekit/dronekit-python/tags","blobs_url":"https://api.github.com/repos/dronekit/dronekit-python/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dronekit/dronekit-python/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dronekit/dronekit-python/git/refs{/sha}","trees_url":"https://api.github.com/repos/dronekit/dronekit-python/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dronekit/dronekit-python/statuses/{sha}","languages_url":"https://api.github.com/repos/dronekit/dronekit-python/languages","stargazers_url":"https://api.github.com/repos/dronekit/dronekit-python/stargazers","contributors_url":"https://api.github.com/repos/dronekit/dronekit-python/contributors","subscribers_url":"https://api.github.com/repos/dronekit/dronekit-python/subscribers","subscription_url":"https://api.github.com/repos/dronekit/dronekit-python/subscription","commits_url":"https://api.github.com/repos/dronekit/dronekit-python/commits{/sha}","git_commits_url":"https://api.github.com/repos/dronekit/dronekit-python/git/commits{/sha}","comments_url":"https://api.github.com/repos/dronekit/dronekit-python/comments{/number}","issue_comment_url":"https://api.github.com/repos/dronekit/dronekit-python/issues/comments{/number}","contents_url":"https://api.github.com/repos/dronekit/dronekit-python/contents/{+path}","compare_url":"https://api.github.com/repos/dronekit/dronekit-python/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dronekit/dronekit-python/merges","archive_url":"https://api.github.com/repos/dronekit/dronekit-python/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dronekit/dronekit-python/downloads","issues_url":"https://api.github.com/repos/dronekit/dronekit-python/issues{/number}","pulls_url":"https://api.github.com/repos/dronekit/dronekit-python/pulls{/number}","milestones_url":"https://api.github.com/repos/dronekit/dronekit-python/milestones{/number}","notifications_url":"https://api.github.com/repos/dronekit/dronekit-python/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dronekit/dronekit-python/labels{/name}","releases_url":"https://api.github.com/repos/dronekit/dronekit-python/releases{/id}","created_at":"2014-03-27T19:28:36Z","updated_at":"2015-07-29T06:53:43Z","pushed_at":"2015-07-31T18:30:28Z","git_url":"git://github.com/dronekit/dronekit-python.git","ssh_url":"git@github.com:dronekit/dronekit-python.git","clone_url":"https://github.com/dronekit/dronekit-python.git","svn_url":"https://github.com/dronekit/dronekit-python","homepage":"","size":5214,"stargazers_count":71,"watchers_count":71,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":55,"mirror_url":null,"open_issues_count":85,"forks":55,"open_issues":85,"watchers":71,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dronekit/dronekit-python/pulls/260"},"html":{"href":"https://github.com/dronekit/dronekit-python/pull/260"},"issue":{"href":"https://api.github.com/repos/dronekit/dronekit-python/issues/260"},"comments":{"href":"https://api.github.com/repos/dronekit/dronekit-python/issues/260/comments"},"review_comments":{"href":"https://api.github.com/repos/dronekit/dronekit-python/pulls/260/comments"},"review_comment":{"href":"https://api.github.com/repos/dronekit/dronekit-python/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dronekit/dronekit-python/pulls/260/commits"},"statuses":{"href":"https://api.github.com/repos/dronekit/dronekit-python/statuses/9c22f1d65be8ce8fd1b3997f4dcb2464cf199899"}}}}