CINXE.COM
GraphNav Area Callbacks — Spot 4.1.0 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>GraphNav Area Callbacks — Spot 4.1.0 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/autonomy/graphnav_area_callbacks.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="GraphNav Initialization" href="initialization.html" /> <link rel="prev" title="GraphNav Map Structure" href="graphnav_map_structure.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.0 </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"><a class='reference internal' href='/docs/concepts/orbit/about_orbit'>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 current"><a class='reference internal' href='/docs/concepts/autonomy/readme'>Autonomy services</a><ul class="current"> <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 current"><a class="current reference internal" href="#">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"><a href='/docs/concepts/autonomy/readme'>Autonomy</a></li> <li class="breadcrumb-item active">GraphNav Area Callbacks</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="graphnav-area-callbacks"> <h1>GraphNav Area Callbacks<a class="headerlink" href="#graphnav-area-callbacks" title="Permalink to this heading"></a></h1> <section id="introduction"> <h2>Introduction<a class="headerlink" href="#introduction" title="Permalink to this heading"></a></h2> <p>Imagine we want Spot to check for forklifts before deciding to cross the road. If this is part of a mission, we could add a <a class='reference internal' href='/python/examples/remote_mission_service/readme'><span class="doc">remote mission callback service</span></a> that makes the robot to look left and right before crossing the road, where the robot’s vision is connected to an ML model that checks for the forklift on the road. However, this approach will only execute the callback when it is at that point in the mission. In cases where the robot reroutes across the crosswalk due to a blockage elsewhere, or the robot decides to return to a dock across the crosswalk when its battery is low, or if the map is used for navigation outside of that mission, the robot will <em>not</em> execute that callback, but will instead walk directly out into the crosswalk, regardless of whether it is safe to do so.</p> <p>We sometimes want the robot <em>to execute a sequence of actions anytime the robot is at the certain location in the map</em>. That is where we can use <strong>Area Callbacks</strong>. An Area Callback allows the user to associate certain areas with specified actions, such as safety checks at the crosswalks, opening doors, and signaling the environment using the lights and sounds.</p> </section> <section id="how-does-an-area-callback-work"> <h2>How does an Area Callback work?<a class="headerlink" href="#how-does-an-area-callback-work" title="Permalink to this heading"></a></h2> <p><img alt="Area Callback Figure" src="../../../_images/area_callback_figure.png" /></p> <p>GraphNav maps are composed of edges and waypoints. These edges are annotated with information that is necessary for the successful navigation of the robot. In addition to information such as detected stairs and different friction coefficient settings for slippery surfaces, annotations can include <strong>Area Callback Regions</strong> so that robot can complete assigned actions every time it visits these edges. These regions specify which <strong>Area Callback Service</strong> should be called to handle this region.</p> <p>We may want the robot to do different things for each of the following cases:</p> <ul class="simple"> <li><p>the robot gets to the <em>start</em> of the Area Callback region</p></li> <li><p>the robot is <em>crossing</em> the Area Callback region</p></li> <li><p>the robot gets to the <em>end</em> of the Area Callback region</p></li> </ul> <p>The Area Callback service that is called can specify a <em>policy</em> as to what should GraphNav should do at the start and end of the region. Options include continuing on, stopping and waiting for the callback to allow it to continue, or delegating control to the callback to perform an action with the robot.</p> </section> <section id="area-callback-policies"> <h2>Area Callback Policies<a class="headerlink" href="#area-callback-policies" title="Permalink to this heading"></a></h2> <p>Policies specify what should happen at the beginning and end of an Area Callback region. Setting the policy for the start of a region after it has already passed will have no effect.</p> <ul class="simple"> <li><p><strong>Stop.</strong> Navigation will pause at the target position indefinitely until the policy is changed.</p></li> <li><p><strong>Control.</strong> When the target position is reached, control will be transferred to the Area Callback service. The service will retain control until the service changes its policy.</p></li> <li><p><strong>Continue On.</strong> Navigation may continue past the target position. If this policy is set before the position is reached, the robot will continue past without stopping. Setting this policy at the start of a region will continue to update the callback service throughout the region. In contrast, reporting that the callback is complete will stop updating a callback altogether.</p></li> </ul> <section id="example-crosswalk-spotcam-light"> <h3>Example: Crosswalk SpotCAM Light<a class="headerlink" href="#example-crosswalk-spotcam-light" title="Permalink to this heading"></a></h3> <p><img alt="Area Callback Lights Figure" src="../../../_images/area_callback_lights_figure.png" /></p> <ul class="simple"> <li><p>the robot gets to the <em>start</em> of the callback (Area Callback region)</p></li> <li><p>the robot <em>waits and checks</em> its surrounding for the forklift (ML example included as pseudocode), during which it flashes the lights of the SpotCAM slowly.</p></li> <li><p>once the robot confirms that the crosswalk is clear of forklifts, it starts <em>crossing</em> the region, during which it flashes the lights quickly and brighter.</p></li> <li><p>the robot reaches the <em>end</em> to turn off the SpotCAM light and proceed to complete the rest of the mission</p></li> </ul> <p>For this example, the callback will set a policy to tell the robot to <strong>stop</strong> at the start of the region. After the callback verified that it is safe to cross, it would change the policy to <strong>continue on</strong> past the start and <strong>continue on</strong> past the end. The callback will still continue to be updated by graph nav for the duration of the region traversal, so that it can continue flashing the lights throughout the region.</p> <p>Code implementing this callback can be found in the <a class='reference internal' href='/python/examples/area_callback/readme'><span class="doc">python example</span></a>.</p> </section> </section> <section id="the-life-cycle-of-an-area-callback"> <h2>The Life Cycle of an Area Callback<a class="headerlink" href="#the-life-cycle-of-an-area-callback" title="Permalink to this heading"></a></h2> <p>An Area Callback is a gRPC service implementing the <code class="docutils literal notranslate"><span class="pre">AreaCallbackService</span></code> definition. It responds to RPC calls to describe itself, and to execute actions during navigation.</p> <section id="startup"> <h3>Startup<a class="headerlink" href="#startup" title="Permalink to this heading"></a></h3> <ol class="simple"> <li><p>The callback service launches and creates the gRPC service.</p></li> <li><p>The callback service registers itself with the robot’s directory.</p></li> <li><p>GraphNav calls the <code class="docutils literal notranslate"><span class="pre">AreaCallbackInformation</span></code> RPC to get information about this callback.</p></li> </ol> <p>At this point the callback is “live”, meaning that it is running an GraphNav has successfully contacted it.</p> </section> <section id="recording"> <h3>Recording<a class="headerlink" href="#recording" title="Permalink to this heading"></a></h3> <p>When recording a map, the tablet shows Area Callbacks similarly to other actions that can be triggered during a mission.</p> </section> <section id="execution"> <h3>Execution<a class="headerlink" href="#execution" title="Permalink to this heading"></a></h3> <p>When reaching an Area Callback region, GraphNav will begin calling out to the callback service.</p> <ol class="simple"> <li><p><strong>BeginCallback</strong>: This call lets the callback know that the region is beginning, and includes the region id and the route through the region.</p></li> <li><p><strong>UpdateCallback</strong>: This call will include the stage of traversal through the region, and the response to this call sets the current policy for the callback. This RPC is repeated regularly for the entire traversal of the region, and the callback can update its policy appropriately as things change.</p></li> <li><p><strong>BeginControl</strong>: This call transfers control of the robot to the callback with a Lease. The callback remains in control until it either changes its policy (via <code class="docutils literal notranslate"><span class="pre">UpdateCallback</span></code>) to no longer request control, or it receives a LeaseUseResult through its lease usage that indicates that some other system is now in control of the robot.</p></li> <li><p><strong>EndCallback</strong>: Called either when leaving the region, or when the response to <code class="docutils literal notranslate"><span class="pre">UpdateCallback</span></code> indicates that the callback is complete. <code class="docutils literal notranslate"><span class="pre">UpdateCallback</span></code> will no longer be called. <code class="docutils literal notranslate"><span class="pre">EndCallback</span></code> may also be called early if GraphNav is interrupted and is no longer executing the route.</p></li> </ol> </section> <section id="service-shutdown"> <h3>Service Shutdown<a class="headerlink" href="#service-shutdown" title="Permalink to this heading"></a></h3> <p>If shutting down an Area Callback service, the service should unregister itself from the directory. This will be handled automatically when using the python <code class="docutils literal notranslate"><span class="pre">DirectoryRegistrationKeepAlive</span></code> helper.</p> </section> </section> <section id="creating-an-area-callback"> <h2>Creating an Area Callback<a class="headerlink" href="#creating-an-area-callback" title="Permalink to this heading"></a></h2> <p>Implementing an Area Callback is accomplished through writing and registering an <code class="docutils literal notranslate"><span class="pre">AreaCallbackService</span></code>. The recommended way to write this service is to inherit from the python helper class <code class="docutils literal notranslate"><span class="pre">AreaCallbackRegionHandlerBase</span></code> and implement the <code class="docutils literal notranslate"><span class="pre">begin()</span></code>, <code class="docutils literal notranslate"><span class="pre">run()</span></code>, and <code class="docutils literal notranslate"><span class="pre">end()</span></code> methods, and then use that class with the <code class="docutils literal notranslate"><span class="pre">AreaCallbackServiceServicer</span></code> and <code class="docutils literal notranslate"><span class="pre">GrpcServiceRunner</span></code> to run the service. <a class='reference internal' href='/python/examples/area_callback/readme'><span class="doc">Python examples</span></a> are available.</p> <p>When using the <code class="docutils literal notranslate"><span class="pre">AreaCallbackServiceServicer</span></code>, The normal usage is to pass in the newly implemented <code class="docutils literal notranslate"><span class="pre">AreaCallbackRegionHandlerBase</span></code> subclass as the <code class="docutils literal notranslate"><span class="pre">area_callback_builder_fn</span></code>.<br />This function is called fresh for each region that the callback is used to cross. As a result, a new instance of the class will be created for each region. If your use case requires sharing data across regions, you can define a function with the correct interface that will create your subclass with the correct shared data. Note that the <code class="docutils literal notranslate"><span class="pre">AreaCallbackRegionHandlerBase</span></code> class expects to be recreated fresh for each region, and so it is not recommended to use an <code class="docutils literal notranslate"><span class="pre">area_callback_builder_fn</span></code> that always returns the <em>same</em> instance.</p> <section id="configuring-behavior-for-a-callback"> <h3>Configuring behavior for a callback<a class="headerlink" href="#configuring-behavior-for-a-callback" title="Permalink to this heading"></a></h3> <p>The behavior of GraphNav during an Area Callback can be modified by setting various fields in the <code class="docutils literal notranslate"><span class="pre">AreaCallbackInformation</span></code> message that GraphNav will query for. It is best practice to set all the available configuration options, even if the default behavior is the desired behavior.</p> <section id="expected-blockages"> <h4>Expected Blockages<a class="headerlink" href="#expected-blockages" title="Permalink to this heading"></a></h4> <p>Certain callback regions may be expected to appear blocked to GraphNav (such as a callback that opens a door). In those cases, GraphNav should not pre-emptively consider them blocked until the callback has had a chance to run. This is specified by setting the <code class="docutils literal notranslate"><span class="pre">blockage</span></code> field to <code class="docutils literal notranslate"><span class="pre">BLOCKAGE_SKIP</span></code> or <code class="docutils literal notranslate"><span class="pre">BLOCKAGE_CHECK</span></code>.</p> </section> <section id="impairment-check"> <h4>Impairment Check<a class="headerlink" href="#impairment-check" title="Permalink to this heading"></a></h4> <p>GraphNav regularly monitors robot state and will set an error state if the robot becomes impaired in such a way that GraphNav can no longer function. However, interrupting a callback in the middle of controlling the robot can cause problems, particularly if the callback itself is not affected by the particular failure that affects GraphNav. To control whether GraphNav will check for impairment errors when the callback is in control, set the <code class="docutils literal notranslate"><span class="pre">impairment_check</span></code> field to <code class="docutils literal notranslate"><span class="pre">IMPAIRMENT_SKIP</span></code> or <code class="docutils literal notranslate"><span class="pre">IMPAIRMENT_CHECK</span></code>.</p> </section> <section id="entity-waiting"> <h4>Entity Waiting<a class="headerlink" href="#entity-waiting" title="Permalink to this heading"></a></h4> <p>GraphNav will stop and wait for nearby entities during normal operation, but that behavior may be incorrect for a particular callback, either because the robot should continue past detected entities in this region, or because spurious entity detections are expected in the callback region. This behavior can be controlled by setting the <code class="docutils literal notranslate"><span class="pre">entity_waiting</span></code> field.</p> </section> <section id="stop-configuration"> <h4>Stop Configuration<a class="headerlink" href="#stop-configuration" title="Permalink to this heading"></a></h4> <p>Various options can be set in the <code class="docutils literal notranslate"><span class="pre">StopConfiguration</span></code> message to control how the robot will stop at the start or end of a callback region. Certain callbacks may have particular requirements about what direction the robot should face, or how tightly the robot needs to match the recorded start of the region.</p> </section> </section> <section id="how-to-write-a-callback-s-run"> <h3>How to write a callback’s <code class="docutils literal notranslate"><span class="pre">run()</span></code><a class="headerlink" href="#how-to-write-a-callback-s-run" title="Permalink to this heading"></a></h3> <p>The majority of work for an <code class="docutils literal notranslate"><span class="pre">AreaCallbackRegionHandlerBase</span></code> subclass will be done in the <code class="docutils literal notranslate"><span class="pre">run()</span></code> method. This function is expected to run for the entire time that the robot is crossing the region. If the function returns early, that will signal to GraphNav that the callback is complete and no longer needs to be updated. Helper methods on the base class are provided to allow <code class="docutils literal notranslate"><span class="pre">run()</span></code> to block until a particular event it needs to react to.</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">block_until_arrived_at_start()</span></code></p></li> <li><p><code class="docutils literal notranslate"><span class="pre">block_until_arrived_at_end()</span></code></p></li> <li><p><code class="docutils literal notranslate"><span class="pre">block_until_control()</span></code></p></li> <li><p><code class="docutils literal notranslate"><span class="pre">safe_sleep()</span></code></p></li> </ul> <p>These methods will return when their particular condition is met. If the navigation is aborted, they will raise an exception of a subclass of <code class="docutils literal notranslate"><span class="pre">bosdyn.client.area_callback_region_handler_base.HandlerError</span></code>. These exceptions do not need to be caught, and can be used to exit from <code class="docutils literal notranslate"><span class="pre">run()</span></code>. If you <em>do</em> catch these exceptions for performing cleanup work, be sure to re-raise them after cleaning up, rather than continuing on in the <code class="docutils literal notranslate"><span class="pre">run()</span></code> method. It is expected that <code class="docutils literal notranslate"><span class="pre">run()</span></code> will complete quickly once navigation has stopped. If your use-case requires more time for cleanup operations you should create a thread to do that work and still return from <code class="docutils literal notranslate"><span class="pre">run()</span></code> quickly. Note that <code class="docutils literal notranslate"><span class="pre">safe_sleep()</span></code> works very similar to python’s <code class="docutils literal notranslate"><span class="pre">time.sleep()</span></code> except that it will raise one of the above exceptions if the navigation through the region aborts during the sleep.</p> <p>In addition to these blocking methods, implementations can directly call <code class="docutils literal notranslate"><span class="pre">check()</span></code> which will immediately raise a <code class="docutils literal notranslate"><span class="pre">HandlerError</span></code> if the callback should abort. Also, the <code class="docutils literal notranslate"><span class="pre">stage()</span></code> and <code class="docutils literal notranslate"><span class="pre">has_control()</span></code> helpers can be used to check this information about current stage and control state in a non-blocking manner. <code class="docutils literal notranslate"><span class="pre">stage()</span></code> will return the <a class='reference external' href='/protos/bosdyn/api/proto_reference#updatecallbackrequest-stage'><code class="docutils literal notranslate"><span class="pre">bosdyn.api.UpdateCallbackRequest.Stage</span></code></a> enum describing the stage of crossing the region.</p> <p>Aside from the task-specific work that the callback does, its other responsibility is to communicate a two-part <em>policy</em> to GraphNav as to what actions GraphNav should perform at the start and end of the region. The recommended way to set and update this policy is to use the helper methods:</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">stop_at_start()</span></code></p></li> <li><p><code class="docutils literal notranslate"><span class="pre">control_at_start()</span></code></p></li> <li><p><code class="docutils literal notranslate"><span class="pre">continue_past_start()</span></code></p></li> <li><p><code class="docutils literal notranslate"><span class="pre">stop_at_end()</span></code></p></li> <li><p><code class="docutils literal notranslate"><span class="pre">control_at_end()</span></code></p></li> <li><p><code class="docutils literal notranslate"><span class="pre">continue_past_end()</span></code></p></li> </ul> <p>The policy can be initially set in the constructor of the handler, and updated in <code class="docutils literal notranslate"><span class="pre">run()</span></code>. The correct way to continue on after using <code class="docutils literal notranslate"><span class="pre">stop_at_*</span></code> or <code class="docutils literal notranslate"><span class="pre">control_at_*</span></code> is to use <code class="docutils literal notranslate"><span class="pre">continue_past_*</span></code> once the reason for stopping or controlling the robot is complete. In the <a class='reference internal' href='/python/examples/area_callback/readme'><span class="doc">area_callback_crosswalk</span></a> example, the initial policy is set in the constructor to</p> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span> <span class="bp">self</span><span class="o">.</span><span class="n">stop_at_start</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">continue_past_end</span><span class="p">()</span> </pre></div> </div> <p>To tell GraphNav that the robot should stop at the start of the region, but after it is past the start, it does not need to stop at the end of the region. Inside <code class="docutils literal notranslate"><span class="pre">run()</span></code>, after the callback has verified that it is safe to cross, the callback modifies the policy via its helper method:</p> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span> <span class="bp">self</span><span class="o">.</span><span class="n">continue_past_start</span><span class="p">()</span> </pre></div> </div> <p>After this call, the policy for the callback will be updated to specify that GraphNav does not need to stop at the start, and it also continues the second part of the policy that it does not need to stop at the end of the region.</p> <p>Returning from the <code class="docutils literal notranslate"><span class="pre">run()</span></code> method will signal to GraphNav that the callback is complete, and no longer needs to be updated. GraphNav will continue on past the start and end of the region if it has not already.</p> </section> <section id="controlling-the-robot"> <h3>Controlling the Robot<a class="headerlink" href="#controlling-the-robot" title="Permalink to this heading"></a></h3> <p>Control can be given to the robot to perform an action at the start or end of the region. The common use case for this are to position the robot precisely and perform an action before giving control back to graph nav to cross the region, or to manage the traversal of the entire region itself. Control is acquired by setting the policy to <strong>control</strong>, and waiting for GraphNav to delegate control. After GraphNav delegates control, the <code class="docutils literal notranslate"><span class="pre">Robot</span></code> object for the callback will have its lease wallet updated and commands can be sent.</p> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span> <span class="bp">self</span><span class="o">.</span><span class="n">control_at_start</span><span class="p">()</span> <span class="c1"># Set region policy</span> <span class="bp">self</span><span class="o">.</span><span class="n">block_until_control</span><span class="p">()</span> <span class="c1"># Wait for GraphNav to delegate control</span> <span class="c1"># Can send robot commands here</span> </pre></div> </div> <section id="updating-the-localization"> <h4>Updating the localization<a class="headerlink" href="#updating-the-localization" title="Permalink to this heading"></a></h4> <p>If the area callback is traversing the region itself, when it reaches the end of the region it should update the localization of the robot within the map before returning control. The GraphNav considers the callback to still be “at” the start of the region (<code class="docutils literal notranslate"><span class="pre">STAGE_AT_START</span></code>) until either it drives the robot past the start, or the callback explicitly updates the localization. If the callback drives the robot and tells GraphNav to continue on without updating the localization, then GraphNav will attempt to navigate from the start of the region.</p> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span> <span class="c1"># Commands here driving the robot to the end of the region.</span> <span class="c1"># Update the localization so that GraphNav knows we have traversed the region.</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_localization_at_end</span><span class="p">()</span> <span class="c1"># Change the policy to continue. GraphNav will immediately begin the end policy.</span> <span class="bp">self</span><span class="o">.</span><span class="n">continue_past_start</span><span class="p">()</span> </pre></div> </div> </section> </section> <section id="reporting-errors"> <h3>Reporting Errors<a class="headerlink" href="#reporting-errors" title="Permalink to this heading"></a></h3> <p>If an unrecoverable error occurs, the <code class="docutils literal notranslate"><span class="pre">run()</span></code> method should raise an exception. This will get translated into a response to GraphNav that the callback has failed. There are a few special errors that can re-raised with special meaning.</p> <ul class="simple"> <li><p><strong>LeaseError</strong> - This will be raised when the callback has control if some other system takes over control of the robot. This will generally be raised by robot command RPCs sent by the callback service, and it is recommended to not catch the error, but to instead let it raise out of <code class="docutils literal notranslate"><span class="pre">run()</span></code>. If a callback needs to catch it to perform some cleanup, it should re-raise it after that cleanup is performed.</p></li> <li><p><strong>PathBlocked</strong> - This error should be raised if the callback determines that the region is blocked, and GraphNav should attempt to re-route around it. This should only be raised at the start of the region. If the callback service has been in control of the robot, it should attempt to return to the start of the region before raising this error, or GraphNav may not be able to successfully resume navigation. It should not be raised if the localization has already been updated to the end of the region.</p></li> <li><p><strong>HandlerError</strong> - This error will be raised from helper functions if the area callback has already been aborted or exited, and <code class="docutils literal notranslate"><span class="pre">run()</span></code> should exit. Handlers should only catch this exception if there is some cleanup to perform before exiting <code class="docutils literal notranslate"><span class="pre">run()</span></code>.</p></li> </ul> </section> <section id="handling-re-routing"> <h3>Handling Re-routing<a class="headerlink" href="#handling-re-routing" title="Permalink to this heading"></a></h3> <p>If the robot is blocked by an obstacle while crossing an area callback, GraphNav may decide to re-plan through the map, and take a different route to the goal.</p> <p>There are two possibilities of what can happen when this occurs:</p> <ol class="simple"> <li><p>The Area Callback is not restarted, but an additional RPC will be made to the callback informing it of the new route. This occurs when GraphNav reroutes during a navigation command.</p></li> </ol> <p>Most callbacks can ignore that RPC, but callbacks that want to react to it can override the <code class="docutils literal notranslate"><span class="pre">route_changed()</span></code> method. Be aware <code class="docutils literal notranslate"><span class="pre">route_changed()</span></code> method will be called from a different thread than the thread that is running the <code class="docutils literal notranslate"><span class="pre">run()</span></code> method. The return type for <code class="docutils literal notranslate"><span class="pre">route_changed()</span></code> currently only has a single option which lets the callback request that <code class="docutils literal notranslate"><span class="pre">run()</span></code> be restarted if it had previously finished. Note that if it restarts, it will already be past the start of the region, so <code class="docutils literal notranslate"><span class="pre">block_until_arrived_at_start()</span></code> will immediately return <code class="docutils literal notranslate"><span class="pre">False</span></code>.</p> <ol class="simple"> <li><p>The Area Callback is restarted. This occurs when GraphNav is stopped and then re-run with a new command (such as to ask the operator what to do, or because a mission was explicitly paused).</p></li> </ol> <p>When the BeginCallback RPC is called in the restarting case, the RegionInformation will have the <code class="docutils literal notranslate"><span class="pre">starting_inside_region</span></code> field set to <code class="docutils literal notranslate"><span class="pre">True</span></code>. The callback can use this information to skip some of its initial steps if applicable. As an example, if the “spot-crosswalk” callback is starting from inside the crosswalk, it will not try to check that the crosswalk is clear, but will instead immediately start to exit the crosswalk.</p> </section> </section> <section id="testing-an-area-callback"> <h2>Testing an Area Callback<a class="headerlink" href="#testing-an-area-callback" title="Permalink to this heading"></a></h2> <section id="test-runner-script"> <h3>Test runner script<a class="headerlink" href="#test-runner-script" title="Permalink to this heading"></a></h3> <p>Once a callback is written, it can be tested using the <a class='reference external' href='/python/examples/area_callback/readme#running-the-example-without-graph-nav-recording'>area_callback_test_runner</a> script. This script will call the callback directly, without involving GraphNav. Because GraphNav is not running the callback, certain features may not be available. For example, route and region information will not be filled out in the BeginCallbackRequest, and requesting localization data from GraphNav may not provide meaningful responses. But for many types of Area Callbacks, this test script provides a simple way to make sure that they are operating as expected and to debug failures.</p> <p>Example usage:</p> <div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>><span class="w"> </span>python3<span class="w"> </span>examples/area_callback/area_callback_test_runner.py<span class="w"> </span>--service<span class="w"> </span>my-service-name<span class="w"> </span><span class="nv">$ROBOT_IP</span> </pre></div> </div> <p>For detailed instructions of using this runner with an example callback, see the <a class='reference internal' href='/python/examples/area_callback/readme'><span class="doc">area callback example</span></a>.</p> </section> <section id="test-within-graphnav"> <h3>Test within GraphNav<a class="headerlink" href="#test-within-graphnav" title="Permalink to this heading"></a></h3> <p>To test within GraphNav, you will need to record a map that has an Area Callback region which uses your callback service. For recording a map with Spot’s tablet, follow the <a class="reference external" href="https://support.bostondynamics.com/s/article/Getting-Started-with-Autowalk#Recording">Autowalk recording instructions</a>. Adding an Area Callback to a map during recording is similar to adding an Autowalk action. After selecting your callback’s name from the list, follow the on-screen prompts to define the start and end of a region.</p> <p>Note that if you pass through the same area again (for example, returning across the same crosswalk on the way back) you will need to add the Area Callback region to the return path during recording as well.</p> <p>For detailed instructions of recording a map with an example callback, see the <a class='reference internal' href='/python/examples/area_callback/readme'><span class="doc">area callback example</span></a>.</p> </section> </section> </section> </div> </div> <footer> <hr/> <div role="contentinfo"> <p> © 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>