CINXE.COM

About Orbit (formerly Scout) — Spot 4.1.1 documentation

<!DOCTYPE html> <html class="writer-html5" lang="en" > <head> <meta charset="utf-8" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>About Orbit (formerly Scout) &mdash; Spot 4.1.1 documentation</title> <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="../../../_static/style.css" type="text/css" /> <link rel="shortcut icon" href="../../../_static/bd-favicon.png"/> <link rel="canonical" href="https://dev.bostondynamics.com/docs/concepts/orbit/about_orbit.html" /> <!--[if lt IE 9]> <script src="../../../_static/js/html5shiv.min.js"></script> <![endif]--> <script src="../../../_static/jquery.js"></script> <script src="../../../_static/_sphinx_javascript_frameworks_compat.js"></script> <script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js"></script> <script src="../../../_static/doctools.js"></script> <script src="../../../_static/sphinx_highlight.js"></script> <script src="../../../_static/js/theme.js"></script> <link rel="index" title="Index" href="../../../genindex.html" /> <link rel="search" title="Search" href="../../../search.html" /> <link rel="next" title="Orbit API" href="orbit_api.html" /> <link rel="prev" title="About Spot" href="../about_spot.html" /> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-7602095-5"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-7602095-5'); </script>X-Content-Type-Options: nosniff<script type="text/javascript" src="//script.crazyegg.com/pages/scripts/0096/9626.js" async="async"></script></head> <body class="wy-body-for-nav"> <div class="wy-grid-for-nav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side"> <div class="wy-side-scroll"> <div class="wy-side-nav-search" > <a href='/readme'> <img src="../../../_static/bd-official-white.png" class="logo" alt="Logo"/> </a> <div class="version"> 4.1.1 </div> <div role="search"> <form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get"> <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> <ul class="current"> <li class="toctree-l1 current"><a class='reference internal' href='/docs/concepts/readme'>Concepts</a><ul class="current"> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/about_spot'>About Spot</a></li> <li class="toctree-l2 current"><a class="current reference internal" href="#">About Orbit (formerly Scout)</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/orbit/orbit_api'>Orbit API</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/networking'>Networking</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/base_services'>Base services</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/geometry_and_frames'>Geometry and Frames</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/robot_services'>Robot services</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/estop_service'>E-Stop</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/keepalive_service'>KeepAlive (BETA)</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/lease_service'>Lease</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/developing_api_services'>Developing API Services</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/service_customization'>Service Customization</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/faults'>Faults</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/autonomy/readme'>Autonomy services</a><ul> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/graphnav_tech_summary'>Autonomy Technical Summary</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/autonomous_navigation_code_examples'>Autonomous navigation code examples</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/components_of_autonomous_navigation'>Components of autonomous navigation</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/docking'>Docking</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/typical_autonomous_navigation_use_case'>Typical autonomous navigation use case</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/autonomous_navigation_services'>Autonomous navigation services</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/graphnav_service'>GraphNav service</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/graphnav_map_structure'>GraphNav map structure</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/graphnav_area_callbacks'>GraphNav area callbacks</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/initialization'>Initialization</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/localization'>Localization</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/graphnav_and_robot_locomotion'>GraphNav and robot locomotion</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/missions_service'>Missions service</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/autowalk_service'>Autowalk service</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/network_compute_bridge'>Network compute bridge</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/auto_return'>AutoReturn service</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/directed_exploration'>Directed Exploration</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/autonomy/gps'>GPS</a></li> </ul> </li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/choreography/readme'>Choreography</a><ul> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/choreography/choreography_service'>Choreography Service</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/choreography/move_reference'>Move Reference Guide</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/choreography/custom_gait'>CustomGait Reference</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/choreography/choreographer_setup'>Choreographer Setup</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/choreography/choreographer'>Choreographer Overview</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/choreography/robot_controls_in_choreographer'>Robot Connections in Choreographer</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/choreography/animations_in_choreographer'>Animations in Choreography</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/choreography/animation_file_specification'>Animation File Format</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/choreography/choreography_in_tablet'>Tablet Choreography Mode</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/choreography/choreography_in_autowalk'>Choreography Actions in Autowalk</a></li> </ul> </li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/joint_control/readme'>Joint Control API</a><ul> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/joint_control/supplemental_data'>Supplemental Robot Information</a><ul> <li class="toctree-l4"><a class='reference internal' href='/docs/concepts/joint_control/knee_torque_limits'>Knee Torque Limits</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/arm/readme'>Spot Arm</a><ul> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/arm/arm_specification'>Arm and Gripper Specification</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/arm/arm_concepts'>Concepts</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/arm/arm_services'>Services</a></li> </ul> </li> <li class="toctree-l2"><a class='reference internal' href='/docs/concepts/data'>Spot Data</a><ul> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/data_acquisition_overview'>Data Acquisition Overview</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/data_acquisition_output'>Data Acquisition Output</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/writing_services_for_data_acquisition'>Integrate Payloads with the API</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/data_buffer_overview'>Data Buffer Overview</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/bddf'>BDDF File Format</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/concepts/data_acquisition_thermal_raw'>Thermal Raw Data Format</a></li> </ul> </li> </ul> </li> <li class="toctree-l1"><a class='reference internal' href='/docs/python/readme'>Python</a><ul> <li class="toctree-l2"><a class='reference internal' href='/docs/python/quickstart'>Quickstart</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/python/understanding_spot_programming'>Understanding Spot Programming</a></li> <li class="toctree-l2"><a class='reference internal' href='/python/examples/readme'>Examples</a><ul> <li class="toctree-l3"><a class='reference internal' href='/python/examples/docs/basic_service_examples'>Basic Service Examples</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/examples/hello_spot/readme'>Hello Spot</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/directory/readme'>Directory</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/get_robot_state/readme'>Get Robot State</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/get_robot_state_async/readme'>Get Robot State Async</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/get_image/readme'>Get Image</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/get_world_objects/readme'>Get World Objects</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/get_mission_state/readme'>Get Mission State</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/estop/readme'>E-Stop</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/time_sync/readme'>Time Sync</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/comms_test/readme'>Comms Test</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/disable_ir_emission/readme'>IR Enable/Disable</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/reset_safety_stop/readme'>Reset Safety Stop</a></li> </ul> </li> <li class="toctree-l3"><a class='reference internal' href='/python/examples/docs/robot_behavior_examples'>Robot Behavior and Commands Examples</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/examples/stance/readme'>Stance</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/frame_trajectory_command/readme'>Frame Trajectory</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/spot_light/readme'>Spot Light</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/upload_choreographed_sequence/readme'>Upload Choreographed Sequence</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/xbox_controller/readme'>Xbox Controller</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/wasd/readme'>WASD</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/docking/readme'>Docking</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/animation_recorder/readme'>Animation Recorder</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/auto_return/readme'>Auto Return</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/fan_command/readme'>Fan Commands</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_wasd/readme'>ARM WASD</a></li> </ul> </li> <li class="toctree-l3"><a class='reference internal' href='/python/examples/docs/arm_examples'>Arm Command Examples</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_simple/readme'>Simple Arm Motion</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_stow_unstow/readme'>Stow/unstow Arm</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_freeze/readme'>Arm Freeze</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_and_mobility_command/readme'>Arm and Mobility Command</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_with_body_follow/readme'>Arm Command with Body Following</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_constrained_manipulation/readme'>Arm Constrained Manipulation</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_trajectory/readme'>Arm Trajectory</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_trajectory/readme#long-trajectory'>Long Trajectory</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_joint_move/readme'>Arm Joint Move Command</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_force_control/readme'>Arm Force Control Command</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_grasp/readme'>Arm Grasp Command</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_grasp_carry_overrides/readme'>Arm Grasp and Carry Overrides</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_gaze/readme'>Arm Gaze Command</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_surface_contact/readme'>Arm Command with Surface Contact</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_door/readme'>Arm Door Opening Command</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_walk_to_object/readme'>Walk to And Pick Up Object</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_gcode/readme'>Writing Gcode</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/gripper_camera_params/readme'>Gripper Camera Parameters</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_impedance_control/readme'>Arm Impedance Control</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/inverse_kinematics/readme'>Inverse Kinematics</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/arm_wasd/readme'>Arm WASD</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/joint_control/readme'>Wiggle Arm</a></li> </ul> </li> <li class="toctree-l3"><a class='reference internal' href='/python/examples/docs/payloads_examples'>Payloads and Registration Examples</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/examples/payloads/readme'>Payloads</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/self_registration/readme'>Self Registration</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/service_faults/readme'>Faults</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/velodyne_client/readme'>Velodyne</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/core_io_gpio/readme'>CORE I/O GPIO</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/metrics_over_coreio/readme'>Overview</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/metrics_over_coreio/readme#usage'>Usage</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/metrics_over_coreio/readme#components'>Components</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/metrics_over_coreio/readme#recommended-debugging'>Recommended debugging</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/extensions/readme'>Extensions</a></li> </ul> </li> <li class="toctree-l3"><a class='reference internal' href='/python/examples/docs/perception_world_objects_examples'>Perception and World Objects Examples</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/examples/get_image/readme'>Get Image</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/get_world_objects/readme'>Get World Objects</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/world_object_with_image_coordinates/readme'>World Object With Image Coordinates</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/world_object_mutations/readme'>World Object Mutations</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/visualizer/readme'>Visualizer</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/ricoh_theta/readme'>Ricoh Theta</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/gripper_camera_params/readme'>Gripper Camera Parameters</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/spot_cam/readme'>Spot CAM Services</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/spot_cam/readme#spot-cam-video-core-io-extension-example'>Spot Cam Video Core IO Extension Example</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/stitch_front_images/readme'>Stitch Front Images</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/get_depth_plus_visual_image/readme'>Project Depth Data on Visual Images</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/service_customization/custom_parameter_image_server/readme'>Custom Parameter Image Server</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/fiducial_follow/readme'>Fiducial Follow</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/spot_tensorflow_detector/readme'>Tensorflow Detector</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/service_customization/custom_parameter_ncb_worker/readme'>Custom Parameter Tensorflow Detector</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/network_compute_bridge/readme'>Machine Learning with the Network Compute Bridge</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/network_compute_bridge/fire_extinguisher_server/readme'>Fire Extinguisher Detector with the Network Compute Bridge</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/ray_cast/readme'>Ray Cast</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/user_nogo_regions/readme'>No-Go Regions</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/gps_service/readme'>GPS</a></li> </ul> </li> <li class="toctree-l3"><a class='reference internal' href='/python/examples/docs/logging_examples'>Logging Examples</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/examples/bddf_download/readme'>BDDF Download</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/data_buffer/readme'>Data Buffer</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/data_service/readme'>Data Service</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/logging/readme'>Logging</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/log_status/readme'>Log Status</a></li> </ul> </li> <li class="toctree-l3"><a class='reference internal' href='/python/examples/docs/data_acquisition_examples'>Data Acquisition Examples</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/examples/data_acquisition_service/readme'>Data Acquisition Service</a><ul> <li class="toctree-l5"><a class='reference internal' href='/python/examples/data_acquisition_service/signals_coreio_modem_plugin/readme'>Modem Signals</a></li> </ul> </li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/service_faults/readme'>Faults</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/ricoh_theta/readme'>Ricoh Theta</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/service_customization/custom_parameter_image_server/readme'>Custom Parameter Image Service</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/service_customization/custom_parameters_data_acquisition/readme'>Custom Parameter Data Acquisition Plugin</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/get_image/readme'>Test Image Service Implementation with Get Image</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/post_docking_callbacks/readme'>Post Docking Callbacks</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/cloud_upload/readme'>Cloud Upload</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/comms_mapping/readme'>Comms image service</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/comms_mapping/readme#how-to-use'>How to use</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/data_acquisition_service/signals_coreio_modem_plugin/readme'>CoreIO Modem Signals Plugin</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/tester_programs/readme'>Tester Programs</a></li> </ul> </li> <li class="toctree-l3"><a class='reference internal' href='/python/examples/docs/autonomy_and_missions_examples'>Autonomy and Missions Examples</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/examples/graph_nav_anchoring_optimization/readme'>Graph Nav Anchoring Optimization</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/graph_nav_command_line/readme'>GraphNav and Recording Service Command Line Interfaces</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/graph_nav_command_line/readme#example-programs'>Example Programs</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/graph_nav_extract_point_cloud/readme'>Graph Nav Extract Point Cloud</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/graph_nav_view_map/readme'>Graph Nav View Map</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/graph_nav_view_gps/readme'>Graph Nav View GPS Data</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/get_mission_state/readme'>Get Mission State</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/remote_mission_service/readme'>Remote Mission Service</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/mission_question_answerer/readme'>Mission Question Answerer</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/mission_recorder/readme'>Mission Recorder</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/replay_mission/readme'>Replay Mission</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/post_docking_callbacks/readme'>Post Docking Callbacks</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/area_callback/readme'>Area Callbacks</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/edit_autowalk/readme'>Edit Autowalk</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/record_autowalk/readme'>Record Autowalk</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/extract_images_from_walk/readme'>Extract Images from Autowalk</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/network_request_callback/readme'>Network Request Callback</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/network_request_callback/readme#id1'>Network Request Callback</a></li> </ul> </li> <li class="toctree-l3"><a class='reference internal' href='/python/examples/docs/joint_control_examples'>Joint Control API Examples</a></li> <li class="toctree-l3"><a class='reference internal' href='/python/examples/docs/orbit'>Orbit</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/examples/orbit/hello_orbit/readme'>Hello Orbit</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/orbit/export_run_archives/readme'>Export Run Archives</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/orbit/export_site_walk_archives/readme'>Export Sitewalk Archives</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/orbit/anomalies/readme'>Anomalies</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/orbit/schedule_mission/readme'>Schedule Mission</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/orbit/runs_response/readme'>Runs Response</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/orbit/send_robot_back_to_dock/readme'>Return to Dock</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/orbit/toggle_mission_based_on_weather/readme'>Mission Toggle</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/orbit/webhook/readme'>Webhook</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/orbit/backups/readme'>Backups</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/orbit/webhook_integration/readme'>Webhook Integrations</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/examples/orbit/webhook_integration/readme#example-overview'>Example Overview</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class='reference internal' href='/python/readme'>Python Reference Guide</a><ul> <li class="toctree-l3"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/readme'>Client</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/area_callback'>Area Callback</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/area_callback_region_handler_base'>Area Callback Region Handler</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/area_callback_service_runner'>Area Callback Service Runner</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/area_callback_service_servicer'>Area Callback Servicer</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/area_callback_service_utils'>Area Callback Service Utils</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/arm_surface_contact'>Arm Surface Contact</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/async_tasks'>Async Tasks</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/auth'>Auth</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/auto_return'>Auto Return</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/autowalk'>Autowalk</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/bddf'>BDDF</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/bddf_download'>BDDF Download</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/channel'>Channel</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/command_line'>Command</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/common'>Common</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/data_acquisition'>Data Acquisition</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/data_acquisition_helpers'>Data Acquisition Helpers</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/data_acquisition_plugin'>Data Acquisition Plugin</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/data_acquisition_plugin_service'>Data Acquisition Plugin Service</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/data_acquisition_store'>Data Acquisition Store</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/data_buffer'>Data Buffer</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/data_chunk'>Data Chunk</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/data_service'>Data Service</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/directory_registration'>Directory Registration</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/directory'>Directory</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/docking'>Docking</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/door'>Door</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/estop'>E-Stop</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/exceptions'>Exceptions</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/fault'>Fault</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/frame_helpers'>Frame Helpers</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/graph_nav'>Graph Nav</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/gripper_camera_param'>Gripper Camera Params</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/gps/readme'>GPS</a><ul> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/gps/aggregator_client'>Aggregator Client</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/gps/gps_listener'>GPS Listener</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/gps/nmeaparser'>NMEA Parser</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/gps/registration_client'>Registration Client</a></li> </ul> </li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/image'>Image</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/image_service_helpers'>Image Service Helpers</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/inverse_kinematics'>Inverse Kinematics</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/ir_enable_disable'>IR Enable/Disable</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/keepalive'>Keep Alive</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/lease'>Lease</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/lease_resource_hierarchy'>Lease Resource Hierarchy</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/lease_validator'>Lease Validator</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/license'>License</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/local_grid'>Local Grid</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/log_status'>Log Status</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/math_helpers'>Math Helpers</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/manipulation_api_client'>Manipulation API</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/map_processing'>Map Processing</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/metrics_logging'>Metrics Logging</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/network_compute_bridge_client'>Network Compute Bridge</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/payload_registration'>Payload Registration</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/payload'>Payload</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/point_cloud'>Point Cloud</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/power'>Power</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/processors'>Processors</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/ray_cast'>Ray casting</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/recording'>Recording</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/robot_command'>Robot Command</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/robot_id'>Robot ID</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/robot'>Robot</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/robot_state'>Robot State</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/sdk'>SDK</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/server_util'>Server Util</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/service_customization_helpers'>Service Customization Helpers</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/signals_helpers'>Signals Helpers</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_cam/readme'>Spot CAM</a><ul> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_cam/audio'>Audio</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_cam/compositor'>Compositor</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_cam/health'>Health</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_cam/lighting'>Lighting</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_cam/lights_helper'>Lights Helper</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_cam/media_log'>Media Log</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_cam/network'>Network</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_cam/power'>Power</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_cam/ptz'>PTZ</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_cam/streamquality'>Stream Quality</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_cam/version'>Version</a></li> </ul> </li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_check'>Spot Check</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/time_sync'>Time Sync</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/token_cache'>Token Cache</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/token_manager'>Token Manager</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/units_helpers'>Units Helpers</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/util'>Util</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/world_object'>World Object</a></li> </ul> </li> <li class="toctree-l3"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/readme'>Core</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/readme'>BDDF</a><ul> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/base_data_reader'>Base Data Reader</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/block_writer'>Block Writer</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/bosdyn'>BDDF Conventions</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/common'>Common</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/data_reader'>Data Reader</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/data_writer'>Data Writer</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/file_indexer'>File Indexer</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/grpc_proto_reader'>GRPC Proto Reader</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/grpc_reader'>GRPC Reader</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/grpc_service_reader'>GRPC Service Reader</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/grpc_service_writer'>GRPC Service Writer</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/message_reader'>Message Reader</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/pod_series_reader'>POD Series Reader</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/pod_series_writer'>POD Series Writer</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/protobuf_channel_reader'>Protobuf Channel Reader</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/protobuf_reader'>Protobuf Reader</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/protobuf_series_writer'>Protobuf Series Writer</a></li> <li class="toctree-l5"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/bddf/stream_data_reader'>Stream Data Reader</a></li> </ul> </li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/geometry'>Geometry</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/util'>Util</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-core/src/bosdyn/deprecated'>Deprecated</a></li> </ul> </li> <li class="toctree-l3"><a class='reference internal' href='/python/bosdyn-mission/src/bosdyn/mission/readme'>Mission</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-mission/src/bosdyn/mission/client'>Client</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-mission/src/bosdyn/mission/constants'>Constants</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-mission/src/bosdyn/mission/exceptions'>Exceptions</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-mission/src/bosdyn/mission/remote_client'>Remote Client</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-mission/src/bosdyn/mission/server_util'>Server Util</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-mission/src/bosdyn/mission/util'>Util</a></li> </ul> </li> <li class="toctree-l3"><a class='reference internal' href='/python/bosdyn-choreography-client/src/bosdyn/choreography/client/readme'>Choreography</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-choreography-client/src/bosdyn/choreography/client/choreography'>Choreography</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-choreography-client/src/bosdyn/choreography/client/animation_file_to_proto'>Animation File to Proto</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-choreography-client/src/bosdyn/choreography/client/animation_file_conversion_helpers'>Animation File to Proto Helpers</a></li> </ul> </li> <li class="toctree-l3"><a class='reference internal' href='/python/bosdyn-orbit/src/bosdyn/orbit/readme'>Orbit (formerly Scout)</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-orbit/src/bosdyn/orbit/client'>Client</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-orbit/src/bosdyn/orbit/utils'>Utils</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-orbit/src/bosdyn/orbit/exceptions'>Exceptions</a></li> </ul> </li> <li class="toctree-l3"><a class='reference internal' href='/python/bosdyn-scout/src/bosdyn/scout/readme'>Scout (deprecated)</a><ul> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-scout/src/bosdyn/scout/client'>Client</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-scout/src/bosdyn/scout/utils'>Utils</a></li> <li class="toctree-l4"><a class='reference internal' href='/python/bosdyn-scout/src/bosdyn/scout/exceptions'>Exceptions</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class='reference internal' href='/docs/python/fetch_tutorial/fetch1'>Fetch Tutorial</a><ul> <li class="toctree-l3"><a class='reference internal' href='/docs/python/fetch_tutorial/fetch2'>Part 2: Training the Model</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/python/fetch_tutorial/fetch3'>Part 3: Evaluating the Model</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/python/fetch_tutorial/fetch4'>Part 4: Autonomous Pick Up</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/python/fetch_tutorial/fetch5'>Part 5: Detecting People and Playing Fetch</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/python/fetch_tutorial/fetch6'>Part 6: Running the model on Core IO</a></li> </ul> </li> <li class="toctree-l2"><a class='reference internal' href='/docs/python/daq_tutorial/daq1'>Data Collection Tutorial</a><ul> <li class="toctree-l3"><a class='reference internal' href='/docs/python/daq_tutorial/daq2'>Part 2: Capturing images</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/python/daq_tutorial/daq3'>Part 3: Capturing other data</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/python/daq_tutorial/daq4'>Part 4: Deploying to the CORE I/O</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/python/daq_tutorial/daq5'>Part 5: Collecting data</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/python/daq_tutorial/daq6'>Part 6: Processing collected data</a></li> </ul> </li> </ul> </li> <li class="toctree-l1"><a class='reference internal' href='/docs/payload/readme'>Payloads</a><ul> <li class="toctree-l2"><a class='reference internal' href='/docs/payload/payload_configuration_requirements'>Payload configuration requirements</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/payload/mechanical_interfaces'>Mechanical interfaces</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/payload/robot_mounting_rails'>Robot mounting rails</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/payload/guidelines_for_robust_payload_design'>Guidelines for robust payload design</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/payload/robot_electrical_interface'>Robot electrical interface</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/payload/coreio_documentation'>CORE I/O Documentation</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/payload/coreio_openvpn_extension'>CORE I/O OpenVPN Extension</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/payload/configuring_payload_software'>Configuring payload software</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/payload/docker_containers'>Dockerize payload software</a></li> <li class="toctree-l2"><a class='reference internal' href='/docs/payload/spot_core_documentation'>Pre-3.2 Spot CORE Documentation</a><ul> <li class="toctree-l3"><a class='reference internal' href='/docs/payload/spot_core_portainer'>Configuring Docker containers in SpotCORE</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/payload/spot_core_cockpit'>Spot CORE system management tool: Cockpit</a></li> <li class="toctree-l3"><a class='reference internal' href='/docs/payload/spot_core_vnc'>Spot CORE VNC</a></li> </ul> </li> </ul> </li> <li class="toctree-l1"><a class='reference internal' href='/docs/protos/readme'>API Protocol</a><ul> <li class="toctree-l2"><a class='reference internal' href='/docs/protos/style_guide'>Style Guide</a></li> <li class="toctree-l2"><a class='reference internal' href='/protos/bosdyn/api/readme'>Proto Reference Guide</a><ul> <li class="toctree-l3"><a class='reference internal' href='/protos/bosdyn/api/proto_reference'>Protos</a></li> </ul> </li> </ul> </li> <li class="toctree-l1"><a class='reference internal' href='/docs/release_notes'>Release Notes</a></li> <li class="toctree-l1"><a class="reference external" href="https://github.com/boston-dynamics/spot-sdk">SDK Repository</a></li> </ul> </div> </div> </nav> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" > <i data-toggle="wy-nav-top" class="fa fa-bars"></i> <a href='/readme'>Spot</a> </nav> <div class="wy-nav-content"> <div class="rst-content"> <div role="navigation" aria-label="Page navigation"> <ul class="wy-breadcrumbs"> <li><a aria-label='Home' class='icon icon-home' href='/readme'></a></li> <li class="breadcrumb-item"><a href='/docs/concepts/readme'>Concepts</a></li> <li class="breadcrumb-item active">About Orbit (formerly Scout)</li> <li class="wy-breadcrumbs-aside"> </li> </ul> <hr/> </div> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <!-- Copyright (c) 2023 Boston Dynamics, Inc. All rights reserved. Downloading, reproducing, distributing or otherwise using the SDK Software is subject to the terms and conditions of the Boston Dynamics Software Development Kit License (20191101-BDSDK-SL). --><section id="about-orbit-formerly-scout"> <h1>About Orbit (formerly Scout)<a class="headerlink" href="#about-orbit-formerly-scout" title="Permalink to this heading"></a></h1> <p>Orbit is a collection of web services for site awareness, fleet management and data centralization deployed to an on-premise or cloud server. Learn more about the product and deployment <a class="reference external" href="https://www.bostondynamics.com/products/orbit">here</a>.</p> <p>Orbit collects, organizes, and stores data from every mission and teleoperation session executed by a Spot fleet - this information is served to users through a programmatic Application Programming Interface (API) called the <a class='reference internal' href='/docs/concepts/orbit/orbit_api'><span class="doc">Orbit API</span></a>.</p> <section id="contents"> <h2>Contents<a class="headerlink" href="#contents" title="Permalink to this heading"></a></h2> <ul class="simple"> <li><p><a class='reference internal' href='/docs/concepts/orbit/orbit_api'><span class="doc">Orbit API</span></a></p></li> <li><p><a class="reference external" href="#webviews">WebViews</a></p></li> <li><p><a class="reference external" href="#webhooks">Webhooks</a></p></li> <li><p><a class="reference external" href="#scheduling-missions">Scheduling Missions</a></p></li> </ul> </section> <section id="webviews"> <h2>WebViews<a class="headerlink" href="#webviews" title="Permalink to this heading"></a></h2> <p>Orbit has the ability to embed external websites in the Orbit user interface, this is referred to as a <code class="docutils literal notranslate"><span class="pre">WebView</span></code>. Only sites that utilize HTTPS can be embedded into Orbit. For unverified TLS sites the user must first accept the privacy errors for that site before the site will show up correctly in the Orbit web view.</p> <p>To add a website as a web view first navigate to “Custom Web Views” in the Orbit settings page. Click the plus icon to add a new web view:</p> <p><img alt="Webview Creation 1" src="../../../_images/webview_creation_1.png" /></p> <p>Next, fill out the required information including a name for the web view, the address to the icon to use, and the website URL to the desired website to embed.</p> <p><img alt="Webview Creation 2" src="../../../_images/webview_creation_2.png" /></p> <p>If done correctly, the web view should populate in the “Custom Web Views” button in the top right. Clicking on the web view should then show the content of the website within the Orbit UI as shown below.</p> <p><img alt="Webview Creation 3" src="../../../_images/webview_creation_3.png" /></p> <p><code class="docutils literal notranslate"><span class="pre">WebViews</span></code> rely on the user’s browser for things like networking, cookies and caching. This means that clients interact with external websites independently and are able to access web views for websites that Orbit does not have proper routing to. In the example above, the Orbit instance is unable to <code class="docutils literal notranslate"><span class="pre">curl</span> <span class="pre">https://dev.bostondynamics.com/</span></code> but the web view still works as intended on the client browser.</p> <section id="custom-webviews"> <h3>Custom WebViews<a class="headerlink" href="#custom-webviews" title="Permalink to this heading"></a></h3> <p>Developers can create and deploy web applications to Orbit using an Extension. The extension should serve the web application via HTTP on a port in the range 22101-22200. Orbit will proxy HTTPS requests on the port range 22001-22100 to the respective ports in the range 22101-22200. Clients should make requests to the range 22001-22100. <code class="docutils literal notranslate"><span class="pre">Custom</span> <span class="pre">WebViews</span></code> can be configured using this URL to present the extension’s web application within the Orbit application itself. Note that the client requests are HTTPS. Orbit will use the same TLS certificate as the Orbit web application when proxying for the extension’s web application. The port mapping is as follows:</p> <table border="1" class="docutils"> <thead> <tr> <th>Frontend</th> <th>Backend</th> </tr> </thead> <tbody> <tr> <td>22001</td> <td>22101</td> </tr> <tr> <td>22002</td> <td>22102</td> </tr> <tr> <td>...</td> <td>...</td> </tr> <tr> <td>22100</td> <td>22200</td> </tr> </tbody> </table><p>In production environments, it is recommended to use the following in the <code class="docutils literal notranslate"><span class="pre">docker-compose.yml</span></code> of the Orbit Extension to ensure that the HTTP server is not accessible by external clients:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">...</span> <span class="n">ports</span><span class="p">:</span> <span class="o">-</span> <span class="s2">&quot;127.0.0.1:&lt;backend_port&gt;:&lt;backend_port&gt;&quot;</span> <span class="o">...</span> </pre></div> </div> <p>Extensions can also host web servers as an Orbit extension within the port ranges 21000-22000 that can then be pointed to as a web view, though the user will have to visit the direct URL, <code class="docutils literal notranslate"><span class="pre">https://ORBIT_IP:PORT/</span></code>, of the web server first to get around the privacy error described in the <a class="reference external" href="#webviews">WebViews</a> section. This port range does not support unencrypted HTTP servers as web views.</p> <section id="note"> <h4>Note<a class="headerlink" href="#note" title="Permalink to this heading"></a></h4> <p>Orbit does not save any credentials or payloads passed to external websites.</p> </section> </section> </section> <section id="webhooks"> <h2>Webhooks<a class="headerlink" href="#webhooks" title="Permalink to this heading"></a></h2> <p>In addition to providing programmatic and on-demand access to data via the API, Orbit can also <em>push</em> data to applications via webhooks when an event occurs.</p> <section id="what-is-a-webhook"> <h3>What is a webhook?<a class="headerlink" href="#what-is-a-webhook" title="Permalink to this heading"></a></h3> <p>Most generally, a webhook is a mechanism by which one system sends real-time data to another system when an event occurs. In this case, Orbit is the event source. Its job is to identify when an event occurs, at which point it will send an HTTP POST request with data about the event to any webhooks registered and subscribed to that event.</p> </section> <section id="configuring-webhooks"> <h3>Configuring Webhooks<a class="headerlink" href="#configuring-webhooks" title="Permalink to this heading"></a></h3> <p>Webhooks can be configured by an Orbit admin on the settings page or by a developer via the HTTP endpoints at <code class="docutils literal notranslate"><span class="pre">https://my-orbit.com/api/v0/webhooks/</span></code>. See the webhooks API documentation for more details on the webhooks endpoints.</p> <p>For webhooks to work, Orbit needs to know <em>where</em> and <em>when</em> to send the data. When creating a webhook, a URL must be specified. This is the location of the target HTTP endpoint and will be called with a POST request when an event occurs. Additionally, Orbit requires a list of subscribed events for each webhook. When any one of these events occur, Orbit will send a request. See the section below for the list of supported events.</p> </section> <section id="webhook-payloads"> <h3>Webhook Payloads<a class="headerlink" href="#webhook-payloads" title="Permalink to this heading"></a></h3> <p>When Orbit makes a request to a registered webhook, it includes information about the source event in the body of the request. The structure of the event payload is shown below.</p> <div class="highlight-javascript notranslate"><div class="highlight"><pre><span></span><span class="p">{</span> <span class="w"> </span><span class="c1">// Unique identifier for this event.</span> <span class="w"> </span><span class="nx">uuid</span><span class="o">:</span><span class="w"> </span><span class="nx">string</span> <span class="w"> </span><span class="c1">// The type of event that was triggered.</span> <span class="w"> </span><span class="nx">type</span><span class="o">:</span><span class="w"> </span><span class="nx">string</span> <span class="w"> </span><span class="c1">// ISO date string indicating when event was triggered.</span> <span class="w"> </span><span class="nx">time</span><span class="o">:</span><span class="w"> </span><span class="nx">string</span> <span class="w"> </span><span class="c1">// Data about the triggered event. The structure will depend on the event type.</span> <span class="w"> </span><span class="nx">data</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="p">}</span> <span class="p">}</span> </pre></div> </div> </section> <section id="webhook-events"> <h3>Webhook Events<a class="headerlink" href="#webhook-events" title="Permalink to this heading"></a></h3> <p>Orbit allows a webhook to subscribe to multiple events. The webhook will be invoked if any one of the events occur.</p> <section id="action-completed"> <h4>Action Completed<a class="headerlink" href="#action-completed" title="Permalink to this heading"></a></h4> <p>The “action completed” event is triggered whenever a robot completes an action. The value of <code class="docutils literal notranslate"><span class="pre">type</span></code> in the request payload will be <code class="docutils literal notranslate"><span class="pre">&quot;ACTION_COMPLETED&quot;</span></code>. The structure of the <code class="docutils literal notranslate"><span class="pre">data</span></code> field will be identical to the <code class="docutils literal notranslate"><span class="pre">run_event</span></code> object. At a high level, it contains information about the completed action like the name of the action, when it occurred, any key results that were generated, as well as links to any images that were taken as part of the action. See the <code class="docutils literal notranslate"><span class="pre">run_events</span></code> <a class='reference internal' href='/docs/concepts/orbit/orbit_api'><span class="doc">API documentation</span></a> for more details on the data contained in a <code class="docutils literal notranslate"><span class="pre">run_event</span></code>.</p> </section> <section id="action-completed-with-alert"> <h4>Action Completed With Alert<a class="headerlink" href="#action-completed-with-alert" title="Permalink to this heading"></a></h4> <p>The “action completed with alert” event is triggered whenever a robot completes an action where anomalous data was collected. For example, if a thermal inspection identifies an object that is above the configured maximum temperature threshold, Orbit will trigger the “action completed with alert” event. The value of <code class="docutils literal notranslate"><span class="pre">type</span></code> in the request payload will be <code class="docutils literal notranslate"><span class="pre">&quot;ACTION_COMPLETED_WITH_ALERT&quot;</span></code>. The structure of the <code class="docutils literal notranslate"><span class="pre">data</span></code> field will be identical to the <code class="docutils literal notranslate"><span class="pre">run_event</span></code> object. At a high level, it contains information about the completed action like the name of the action, when it occurred, any key results that were generated, as well as links to any images that were taken as part of the action. See the <code class="docutils literal notranslate"><span class="pre">run_events</span></code> <a class='reference internal' href='/docs/concepts/orbit/orbit_api'><span class="doc">API documentation</span></a> for more details on the data contained in a <code class="docutils literal notranslate"><span class="pre">run_event</span></code>.</p> </section> </section> <section id="securing-webhooks"> <h3>Securing Webhooks<a class="headerlink" href="#securing-webhooks" title="Permalink to this heading"></a></h3> <p>Webhooks have a configurable <code class="docutils literal notranslate"><span class="pre">secret</span></code> property that is used for securing webhook payloads. The <code class="docutils literal notranslate"><span class="pre">secret</span></code> is a 64 character hex string used to sign each webhook request. The HTTP requests are sent with a <code class="docutils literal notranslate"><span class="pre">Orbit-Signature</span></code> header with the following format:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">t</span><span class="o">=</span><span class="mi">1701098596652</span><span class="p">,</span><span class="n">v1</span><span class="o">=&lt;</span><span class="n">SIGNATURE</span><span class="o">&gt;</span> </pre></div> </div> <p>The value of <code class="docutils literal notranslate"><span class="pre">t</span></code> in the header is the unix timestamp when the message was sent by Orbit. The value of <code class="docutils literal notranslate"><span class="pre">v1</span></code> is the hash-based message authentication code (HMAC) generated by:</p> <ol class="simple"> <li><p>Creating a timestamped payload string of the form <code class="docutils literal notranslate"><span class="pre">&lt;t&gt;.&lt;payload_json_as_string&gt;</span></code></p></li> <li><p>Creating an HMAC using the webhook secret as the key, the timestamped payload string as the message, and the SHA256 hash function</p></li> <li><p>Generating the hexadecimal representation of the HMAC. This hex string should match the value of <code class="docutils literal notranslate"><span class="pre">v1</span></code></p></li> </ol> <p>The <code class="docutils literal notranslate"><span class="pre">bosdyn-orbit</span></code> module has a utility <code class="docutils literal notranslate"><span class="pre">validate_webhook_payload</span></code> that can be called from a webhook with the configured secret and the payload to handle these steps. This validation ensures that:</p> <ol class="simple"> <li><p>The payload came from Orbit.</p></li> <li><p>The payload was not altered in transit by a man in the middle.</p></li> <li><p>The payload was not replayed by a man in the middle.</p></li> </ol> <section id="http-vs-https"> <h4>HTTP vs HTTPS<a class="headerlink" href="#http-vs-https" title="Permalink to this heading"></a></h4> <p>Orbit supports the registration of endpoints using both <code class="docutils literal notranslate"><span class="pre">http</span></code> and <code class="docutils literal notranslate"><span class="pre">https</span></code>. Using <code class="docutils literal notranslate"><span class="pre">http</span></code> can be useful in certain development environments, but is <strong>strongly discouraged</strong> for production applications.</p> <p>For <code class="docutils literal notranslate"><span class="pre">https</span></code> endpoints, by default, Orbit will validate the TLS certificate when establishing a connection to the server. Requests to servers with invalid certificates will fail. This can be overridden on the webhook configuration page or by setting <code class="docutils literal notranslate"><span class="pre">validateTlsCert</span></code> to <code class="docutils literal notranslate"><span class="pre">false</span></code> when creating a webhook through the REST API. Using unrecognized TLS certificates, like self-signed certs, can be useful during development but is <strong>strongly discouraged</strong> for production applications.</p> </section> </section> <section id="should-i-use-webhooks-or-the-orbit-api"> <h3>Should I use webhooks or the Orbit API?<a class="headerlink" href="#should-i-use-webhooks-or-the-orbit-api" title="Permalink to this heading"></a></h3> <p>Orbit webhooks and REST API are both equally valid mechanisms for integrating with data collected by a robot. The choice of which to use depends on what needs to be done with the data.</p> <section id="when-to-use-the-orbit-api"> <h4>When to use the Orbit API<a class="headerlink" href="#when-to-use-the-orbit-api" title="Permalink to this heading"></a></h4> <p>The Orbit API is better suited for integrations that require on-demand access to data. For example, maybe an application generates a report of data collected by Orbit during a custom time period. At the click of a button, the application returns a report of the relevant data. This use case is more easily achieved using the REST API since the application may request data as-needed (e.g., whenever the button is clicked).</p> </section> <section id="when-to-use-webhooks"> <h4>When to use webhooks<a class="headerlink" href="#when-to-use-webhooks" title="Permalink to this heading"></a></h4> <p>Webhooks are great for integrations that require real-time data or applications that want to do <em>something</em> when a particular event occurs. For example, an application that creates a work order in an Enterprise Asset Management (EAM) system whenever the robot identifies an anomaly during an inspection. The application can host a webhook that subscribes to the <code class="docutils literal notranslate"><span class="pre">&quot;ACTION_COMPLETED_WITH_ALERT&quot;</span></code> event and sends the necessary data to the EAM system whenever the event is triggered.</p> </section> </section> </section> <section id="scheduling-missions"> <h2>Scheduling Missions<a class="headerlink" href="#scheduling-missions" title="Permalink to this heading"></a></h2> <p>Orbit has built-in functionality for scheduling missions. Once scheduled, Orbit will kick off and monitor the mission automatically at the prescribed time. The system supports multiple schedules per robot, adjustable repeat configurations, launch windows, and other features described below.</p> <section id="key-concepts"> <h3>Key Concepts<a class="headerlink" href="#key-concepts" title="Permalink to this heading"></a></h3> <p>These concepts are the building blocks of the Orbit scheduling system.</p> <ul class="simple"> <li><p><strong>Schedule</strong>: A schedule is a description of <em>what</em> a specific robot should do, <em>when</em> it should do it, and <em>how often</em> it should repeat the mission. For example, “Spot should run the mission called ‘Gauge Reading’ every day at 12:00pm”.</p></li> <li><p><strong>Event</strong>: Events are specific instances of a schedule. Taking the example above, if it is now Monday at 12:00pm, Orbit would start the <em>event</em> that results in Spot executing the Gauge Reading mission.</p></li> <li><p><strong>Start Time</strong>: The ideal time that an event will begin; “ideal” and not “actual” because many things could prevent the event from starting at the given time: a prior mission ran long, the robot is being teleoperated by a user, or there is a different schedule that takes priority - just to name a few. In the example above, the first start time is the timestamp of Monday at 12:00pm. The next start time will be automatically calculated once the event completes, and will be the original start time plus one day. This value will keep updating over time.</p></li> <li><p><strong>Repeat Interval</strong>: The ideal gap between event kickoffs. This has a practical minimum of 60 seconds and no maximum. To specify a schedule that does not repeat, provide a non-positive value in this field. It’s important to note that the repeat interval is relative to <em>start</em> time, not end time. The system tries to keep start times locked to real-world time as much as possible. Taking the example above, the repeat interval is set to one day (expressed as milliseconds). It’s possible that the robot will miss its start time, or be delayed in its mission and return late. In this case, the next start time is calculated to be Tuesday at 12:00pm, rather than Tuesday at 12:00pm plus the delay duration. This is to prevent a 12:00pm mission from creeping later and later and eventually running at midnight.</p></li> <li><p><strong>Blackout Times</strong>: Blackout times are blocks of time when a schedule will not start events, even if the start time is valid. Let’s modify the example case to be “Run the Gauge Reading mission every Monday, Wednesday, and Friday at 12:00pm”. To achieve this, simply add <em>blackouts</em>, while keeping the same repeat type and repeat interval, to prevent the schedule from running on opposite days. In this case, after the Monday event, the scheduler will still pick Tuesday at 12:00pm for its next start time, but once that time rolls around, it will not start the event because that time is in <em>blackout</em>. The customer-facing term for this is <em>launch window</em>, and it is the inverse of blackouts. Note that there are some corner cases here to be aware of, which are discussed below.</p></li> </ul> </section> <section id="weekly-repeat"> <h3>Weekly Repeat<a class="headerlink" href="#weekly-repeat" title="Permalink to this heading"></a></h3> <p>The scheduler uses a week as its repeating unit, and Sunday as the first day of the week. That means that blackouts are specified as millisecond offsets since Sunday at midnight.</p> </section> <section id="predicting-start-times"> <h3>Predicting Start Times<a class="headerlink" href="#predicting-start-times" title="Permalink to this heading"></a></h3> <p>As noted above, the system uses event start times, not end times. Keep the following in mind when planning schedules:</p> <ol class="simple"> <li><p>If the robot needs to be out of a particular area at a particular time, and it has a schedule and mission that traverses that area, the schedule should have a buffer between that time and the start time to allow the robot to complete its mission. For example, if the robot is not allowed to be near some of its inspection points at 11:00am, the last possible start time might be 10:00am to account for an estimated mission duration plus a buffer. Note that this can also be done with blackouts, but the buffer idea still applies.</p></li> <li><p>The specified <em>repeat interval</em> is not guaranteed. The system prioritizes predictable start times over predictable intervals. For example, if a schedule has the repeat interval set to one hour, the system will try to start those events 60 minutes apart - it will <em>not</em> wait one hour after the robot returns. In this case, it’s possible that the robot starts a mission at 11:00am, returns at 11:55am, and starts the next event at 12:00pm, leaving only a 5 minute gap between mission completion and kickoff. This is intentional and by design.</p></li> <li><p>If there are multiple schedules running for one robot, the schedules might interfere with each other. This is a normal and expected state to be in. The system will continue to start events according to their priority (described below), but predicting each event’s start time gets more difficult. If very predictable start times are required, it is recommended to configure the schedules such that it is unlikely that a long-running mission will disrupt the next schedule - for example, one schedule that runs between 8:00am and 10:00am and another that runs at 12:00pm.</p></li> </ol> </section> <section id="schedule-priority"> <h3>Schedule Priority<a class="headerlink" href="#schedule-priority" title="Permalink to this heading"></a></h3> <p>As the number of robots and schedules increases, it is likely that multiple events will be eligible for dispatch at the same time - for example, a robot could have Schedule A that runs as fast as possible between 10:00am and 12:00pm, and Schedule B that runs once an hour between 9:00am and 5:00pm. For part of that duration, events from both schedules are allowed to run. This is how the system determines which one will actually be sent to the robot:</p> <ol class="simple"> <li><p>Run the “stalest” event first</p></li> </ol> <ul class="simple"> <li><p>In steady state, this is the event that ran furthest in the past. If Schedule A last ran fifteen minutes ago, and Schedule B last ran two minutes ago, Schedule A is staler, and a Schedule A event will be started.</p></li> <li><p>If one of the two has never been run before, that one will be chosen. In the case of a tie, read on.</p></li> </ul> <ol class="simple"> <li><p>If two events are tied (most likely if they have been created at the same time), whichever mission’s name comes first alphabetically is chosen.</p></li> </ol> </section> <section id="scheduling-gotchas"> <h3>Scheduling “Gotchas”<a class="headerlink" href="#scheduling-gotchas" title="Permalink to this heading"></a></h3> <p>The scheduler design has some side effects that are predictable, but worth shedding light on. If something strange is happening, one of the following situations may apply.</p> <section id="missions-running-at-midnight"> <h4>Missions Running at Midnight<a class="headerlink" href="#missions-running-at-midnight" title="Permalink to this heading"></a></h4> <p>If the scheduler misses a scheduled start time for any reason, it will try to dispatch the missed event at the earliest available opportunity. This can happen if the robot is late getting back from a prior mission. For example, suppose a schedule is set up to run an event at 12:00pm every Monday, Wednesday, and Friday. To accomplish this, the schedule must have blackout periods for Tuesday, Thursday, Saturday, and Sunday, from midnight to midnight. This scenario will play out as follows:</p> <ol class="simple"> <li><p>The robot runs its first mission on Monday at 12:00pm. The next start time is scheduled for 24 hours later, so Tuesday at 12:00pm.</p></li> <li><p>Tuesday at 12:00pm rolls around, and the schedule is in a blackout period, so the event is not started.</p></li> <li><p>The scheduler checks often (on the order of seconds) to see if it’s able to dispatch the overdue event.</p></li> <li><p>The clock ticks over from 11:59pm on Tuesday to 12:00am on Wednesday. This is the first time since the missed event that the schedule is not in blackout, so the scheduler starts it now - at midnight on Wednesday.</p></li> </ol> <p>If running the robot at midnight is undesirable, this may be avoided by extending the blackout until the next desired start time. That is to say, blackouts must be added not just on the alternate days, but also from midnight to 12:00pm on Monday, Wednesday, and Friday. The result of this is that Tuesday’s missed event is next valid on Wednesday at <em>noon</em>, not midnight.</p> </section> <section id="unpredictable-fast-as-possible-schedules"> <h4>Unpredictable “Fast as Possible” Schedules<a class="headerlink" href="#unpredictable-fast-as-possible-schedules" title="Permalink to this heading"></a></h4> <p>An implicit race condition due to polling means that it is possible for an event to be passed over for dispatch in some cases. Ideally, three schedules (A, B, and C) should start events in a predictable order: A, B, C, A, B, C (recall the “stalest first” prioritization system). However, when scheduling with the API, a race condition could result in multiple “fast as possible” schedules dispatching in a non-deterministic order. In this case, set the repeat interval to be identical for all schedules. The recommended interval for “fast as possible” is 60 seconds (although it can be anything, as long as it is the same across all schedules).</p> </section> <section id="time-zones"> <h4>Time Zones<a class="headerlink" href="#time-zones" title="Permalink to this heading"></a></h4> <p>The API expects Coordinated Universal Time (UTC) times. If the schedules run with an offset from the given times, check this.</p> </section> <section id="daylight-savings-time"> <h4>Daylight Savings Time<a class="headerlink" href="#daylight-savings-time" title="Permalink to this heading"></a></h4> <p>The scheduler does not handle Daylight Savings Time yet. This is slated for a future release.</p> </section> </section> </section> </section> </div> </div> <footer> <hr/> <div role="contentinfo"> <p> &copy; Copyright 2024 Boston Dynamics. All rights reserved. <a href="https://www.bostondynamics.com/privacy-policy">Privacy Policy</a> | <a href="https://www.bostondynamics.com/terms">Terms of Use</a> </p> </div> </footer> </div> </div> </section> </div> <script> jQuery(function () { SphinxRtdTheme.Navigation.enable(false); }); </script> <!-- Theme Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXXX-1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-XXXXXXX-1', { 'anonymize_ip': false, }); </script> <!-- Start of HubSpot Embed Code --> <script type="text/javascript" id="hs-script-loader" async defer src="//js.hs-scripts.com/4845432.js"></script> <!-- End of HubSpot Embed Code --></body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10