CINXE.COM

Spot Release Notes — 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>Spot Release Notes &mdash; 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/release_notes.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="prev" title="Protocol Documentation" href="../protos/bosdyn/api/proto_reference.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"><a class='reference internal' href='/docs/concepts/readme'>Concepts</a><ul> <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"><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 current"><a class="current reference internal" href="#">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 active">Spot Release Notes</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). --><p class="github-only"> <b>The Spot SDK documentation is best viewed via our developer site at <a href="https://dev.bostondynamics.com">dev.bostondynamics.com</a>. </b> </p><section id="spot-release-notes"> <h1>Spot Release Notes<a class="headerlink" href="#spot-release-notes" title="Permalink to this heading"></a></h1> <section id="id1"> <h2>4.1.0<a class="headerlink" href="#id1" title="Permalink to this heading"></a></h2> <section id="breaking-changes"> <h3>Breaking Changes<a class="headerlink" href="#breaking-changes" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>The <code class="docutils literal notranslate"><span class="pre">BeginCallbackRequest</span></code> message will no longer have the <code class="docutils literal notranslate"><span class="pre">recorded_data</span></code> field filled out. Area callback services should continue to use the existing <code class="docutils literal notranslate"><span class="pre">custom_params</span></code> in <code class="docutils literal notranslate"><span class="pre">BeginCallbackRequest</span></code> instead of trying to read the duplicate data from inside <code class="docutils literal notranslate"><span class="pre">recorded_data</span></code>.</p></li> <li><p>The asynchronous call, <code class="docutils literal notranslate"><span class="pre">get_choreography_status_async</span></code> in <a class='reference internal' href='/python/bosdyn-choreography-client/src/bosdyn/choreography/client/choreography'><span class="doc">Choreography Client</span></a> will no longer return a Future and a validity time as a tuple directly. Now <code class="docutils literal notranslate"><span class="pre">get_choreography_status_async</span></code> will only return a Future, and calling <code class="docutils literal notranslate"><span class="pre">result()</span></code> on that Future will return a tuple with the GetChoreographyStatus response and the validity time instead of only returning the status response. No changes were made to the non-asynchronous version of the call, <code class="docutils literal notranslate"><span class="pre">get_choreography_status</span></code>.</p></li> <li><p>The <code class="docutils literal notranslate"><span class="pre">flat_ground</span></code> field in the <a class='reference external' href='/protos/bosdyn/api/proto_reference#edge-annotations'>Annotations</a> message in the <a class='reference external' href='/protos/bosdyn/api/proto_reference#edge'>Edge</a> message may no longer be functional. Please use <code class="docutils literal notranslate"><span class="pre">ground_clutter_mode</span></code> instead.</p></li> </ul> </section> <section id="new-features"> <h3>New Features<a class="headerlink" href="#new-features" title="Permalink to this heading"></a></h3> <section id="autowalk-missions"> <h4>Autowalk / Missions<a class="headerlink" href="#autowalk-missions" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Support for predetermined, human-robot interaction (HRI) behaviors has been added to autowalk. A new field, <code class="docutils literal notranslate"><span class="pre">hri_behaviors</span></code>, has been added to the <a class='reference external' href='/protos/bosdyn/api/proto_reference#globalparameters'>GlobalParameters</a> message. Setting <code class="docutils literal notranslate"><span class="pre">play_alert_behaviors</span></code> to <code class="docutils literal notranslate"><span class="pre">true</span></code> will result in Spot tapping its front-left foot twice if anomalies are discovered during an inspection. Setting <code class="docutils literal notranslate"><span class="pre">play_undock_behaviors</span></code> to <code class="docutils literal notranslate"><span class="pre">true</span></code> will result in Spot raising and lowering its legs twice before undocking.</p></li> <li><p>Support for multiple docks has been added to autowalk. Two new fields, <code class="docutils literal notranslate"><span class="pre">disable_recharge</span></code> and <code class="docutils literal notranslate"><span class="pre">disable_end</span></code> have been added to the <a class='reference external' href='/protos/bosdyn/api/proto_reference#dock'>Dock</a> message. Setting <code class="docutils literal notranslate"><span class="pre">disable_recharge</span></code> to <code class="docutils literal notranslate"><span class="pre">true</span></code> determines whether the robot can use the corresponding dock for recharging or executing a return to dock and try again later failure behavior. Setting <code class="docutils literal notranslate"><span class="pre">disable_end</span></code> to <code class="docutils literal notranslate"><span class="pre">true</span></code> determines whether the robot can end the mission on the corresponding dock.</p></li> <li><p>Support for mission text has been added to missions via the <a class='reference external' href='/protos/bosdyn/api/proto_reference#createmissiontext'>CreateMissionText</a> node type. Mission text is similar to prompts (e.g., the action failed, what would you like to do?), minus the answering functionality. It can be used to communicate the mission status to users, among other things. Clients can retrieve all active mission text through the <a class='reference external' href='/protos/bosdyn/api/proto_reference#getstate'>GetState</a> RPC, where active means the mission text node has been ticked and is running. Please see the <code class="docutils literal notranslate"><span class="pre">active_mission_text</span></code> field in the <a class='reference external' href='/protos/bosdyn/api/proto_reference#state'>State</a> message for more information.</p></li> <li><p>Support for querying Data Acquisition Store has been added to missions via the <a class='reference external' href='/protos/bosdyn/api/proto_reference#bosdynquerystoredcaptures'>BosdynQueryStoredCaptures</a> node type. This node type queries Data Acquisition Store and writes the corresponding <code class="docutils literal notranslate"><span class="pre">QueryStoredCapturesResponse</span></code> to the blackboard. If a client needs inspection-dependent behavior (e.g., inspection B is contingent on the outcome of inspection A), this node can be used to help accomplish that (assuming inspection A writes data to the Data Acquisition Store). The aforementioned HRI behaviors rely on this new node type, among other things, under the hood. After an inspection, the Data Acquisition Store is queried to determine if an anomaly was found during that inspection, then the robot behaves accordingly.</p></li> </ul> </section> <section id="clients"> <h4>Clients<a class="headerlink" href="#clients" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Async streaming is now supported in the Python SDK. The <a class='reference external' href='/protos/bosdyn/api/proto_reference#storedatastream'>StoreDataStream</a> and <a class='reference external' href='/protos/bosdyn/api/proto_reference#querystoredcaptures'>QueryStoredCaptures</a> RPCs are two examples of streaming RPCs that can now be called in an async manner. Please see the corresponding client implementation in the <code class="docutils literal notranslate"><span class="pre">store_file_async</span></code>, <code class="docutils literal notranslate"><span class="pre">store_data_as_chunks_async</span></code>, and <code class="docutils literal notranslate"><span class="pre">query_stored_captures_async</span></code> methods in the <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/data_acquisition_store'><span class="doc">DataAcquisitionClient</span></a> for examples of usage.</p></li> </ul> <p>Please see <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/common'><span class="doc">common.py</span></a>. Tests for async streaming have been added to <code class="docutils literal notranslate"><span class="pre">test_base_client.py</span></code>.</p> </section> <section id="data-acquisition-store"> <h4>Data Acquisition Store<a class="headerlink" href="#data-acquisition-store" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Files in excess of 100 MB can now be stored in a single RPC using the <a class='reference external' href='/protos/bosdyn/api/proto_reference#StoreDataStream'>StoreDataStream</a> RPC. This functionality is useful for payloads that produce files in excess of 100 MB (e.g., laser scanners). Please note that the Data Acquisition Store capacity is 50 GB and writing files before existing data is offloaded will result in existing data being overwritten. The new field, <code class="docutils literal notranslate"><span class="pre">include_large</span></code>, in the <a class='reference external' href='/protos/bosdyn/api/proto_reference#queryparameters'>QueryParameters</a> message controls whether captures in excess of 100 MB are included in the <a class='reference external' href='/protos/bosdyn/api/proto_reference#querystoredcapturesresponse'>QueryStoredCapturesResponse</a> message. <code class="docutils literal notranslate"><span class="pre">DataAcquisitionStoreHelper</span></code> and <code class="docutils literal notranslate"><span class="pre">DataAcquisitionStoreClient</span></code> have been updated accordingly. Please see <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/data_acquisition_plugin_service'><span class="doc">data_acquisition_plugin_service.py</span></a> and <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/data_acquisition_store'><span class="doc">data_acquisition_store.py</span></a>, respectively.</p></li> </ul> </section> <section id="graphnav"> <h4>GraphNav<a class="headerlink" href="#graphnav" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Support for uploading and downloading <a class='reference external' href='/protos/bosdyn/api/proto_reference#graph'>graphs</a> larger than 4 MB has been added via the <a class='reference external' href='/protos/bosdyn/api/proto_reference#uploadgraphstreaming'>UploadGraphStreaming</a> and <a class='reference external' href='/protos/bosdyn/api/proto_reference#downloadgraphstreaming'>DownloadGraphStreaming</a> RPCs, respectively.</p></li> <li><p>Area Callback implementations are now informed of whether the robot is already inside the callback region at the beginning of the callback, rather than starting from the edge of the region as usual. This can be used by the callback to provide [better behavior for restarting or re-routing](concepts/autonomy/graphnav_area_callbacks.html#handling-re-routing. This can happen in some cases when the robot gets stuck inside the region, and restarts navigation with a new navigation command.</p></li> </ul> </section> <section id="keepalive-service"> <h4>Keepalive Service<a class="headerlink" href="#keepalive-service" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>The Keepalive Service is no longer in beta and is now in use by Spot, the tablet, and Orbit. This service unifies and expands the comms-loss behaviors of Spot. It lets a client specify one or more Policies, each containing one or more actions. Each action will automatically occur if a client does not send a CheckInRequest within a configurable amount of time. Please see <a class='reference internal' href='/docs/concepts/keepalive_service'><span class="doc">here</span></a> for more information.</p></li> </ul> </section> <section id="navigation"> <h4>Navigation<a class="headerlink" href="#navigation" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>The robot can now detect and classify objects or regions in the world as obstacles or areas to avoid that previously would not have been classified as such. The <code class="docutils literal notranslate"><span class="pre">hazard_detection_mode</span></code> field in the <a class='reference external' href='/protos/bosdyn/api/proto_reference#bosdyn-api-robot-command-proto'>MobilityParams</a> message controls whether the feature is on, and if it is on, the strictness of navigation around the detected hazards.</p></li> <li><p>The robot can now be restricted from ascending or descending stairs by using the new <code class="docutils literal notranslate"><span class="pre">STAIRS_MODE_PROHIBITED</span></code> enumerator in the <code class="docutils literal notranslate"><span class="pre">StairsMode</span></code> enum type in the <a class='reference external' href='/protos/bosdyn/api/proto_reference#bosdyn-api-robot-command-proto'>MobilityParams</a> message.</p></li> <li><p>No-go regions now support circles via the new field, <code class="docutils literal notranslate"><span class="pre">circle</span></code>, in the <a class='reference external' href='/protos/bosdyn/api/proto_reference#nogoregionproperties'>NoGoRegionProperties</a> message.</p></li> </ul> </section> </section> <section id="bug-fixes-and-improvements"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#bug-fixes-and-improvements" title="Permalink to this heading"></a></h3> <section id="choreography"> <h4>Choreography<a class="headerlink" href="#choreography" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Support for choreography moves that are relative to the move start or dance frame has been added to Choreographer via three new fields, <code class="docutils literal notranslate"><span class="pre">relative_position</span></code>, <code class="docutils literal notranslate"><span class="pre">relative_yaw</span></code>, and <code class="docutils literal notranslate"><span class="pre">relative</span></code> in the <a class='reference external' href='/protos/bosdyn/api/proto_reference#gotoparams'>GotoParams</a> message. The <code class="docutils literal notranslate"><span class="pre">relative_position</span></code> and <code class="docutils literal notranslate"><span class="pre">relative_yaw</span></code> fields control the robot’s position and orientation (yaw), respectively. The <code class="docutils literal notranslate"><span class="pre">relative</span></code> field controls whether the motion is relative to the move start (<code class="docutils literal notranslate"><span class="pre">true</span></code>) or dance frame (<code class="docutils literal notranslate"><span class="pre">false</span></code>). Please see <a class='reference internal' href='/docs/concepts/choreography/move_reference'><span class="doc">Move Reference</span></a> for more information.</p></li> <li><p>Support for three new move types that control the robot’s status lights, AV lights, and AV buzzer has been added to Choreographer via the <a class='reference external' href='/protos/bosdyn/api/proto_reference#setaudiovisualcolorparams'>SetAudioVisualColorParams</a>, <a class='reference external' href='/protos/bosdyn/api/proto_reference#buzzernoteparams'>BuzzerNoteParams</a>, and <a class='reference external' href='/protos/bosdyn/api/proto_reference#setallcolorparams'>SetAllColorParams</a> messages, respectively. In <a class='reference external' href='/protos/bosdyn/api/proto_reference#moveparams'>MoveParams</a>, the <code class="docutils literal notranslate"><span class="pre">set_audio_visual_color_params</span></code>, <code class="docutils literal notranslate"><span class="pre">buzzer_note_params</span></code>, and <code class="docutils literal notranslate"><span class="pre">set_all_color_params</span></code> fields control the robot’s AV lights, AV buzzer, and status lights, respectively. Please see the <a class='reference internal' href='/docs/concepts/choreography/move_reference'><span class="doc">Move Reference</span></a> for more information.</p></li> <li><p>Additional options have been added for generating <code class="docutils literal notranslate"><span class="pre">custom_gait</span></code> motion from valid Animations with the <code class="docutils literal notranslate"><span class="pre">custom_gait_cycle</span></code> option. See the <a class='reference internal' href='/docs/concepts/choreography/animation_file_specification'><span class="doc">Animation files for Choreographer</span></a> documentation for additional details on Animation file options and the <a class='reference internal' href='/docs/concepts/choreography/custom_gait'><span class="doc">Custom Gait</span></a> documentation for additional details on the <code class="docutils literal notranslate"><span class="pre">custom_gait</span></code> move. These new options, <code class="docutils literal notranslate"><span class="pre">enable_body_offset</span></code>, <code class="docutils literal notranslate"><span class="pre">enable_body_motion</span></code>, and <code class="docutils literal notranslate"><span class="pre">enable_swings_xy</span></code>, add support for using animation input for the body motion of a <code class="docutils literal notranslate"><span class="pre">custom_gait</span></code> move and the x-y motion of the <code class="docutils literal notranslate"><span class="pre">custom_gait</span></code> swing trajectories. See the <a class='reference external' href='/protos/bosdyn/api/proto_reference#animatedcycleparams'>AnimatedCycleParams</a> message for additional information on the <code class="docutils literal notranslate"><span class="pre">animated_cycle_params</span></code> options.</p></li> <li><p>The <code class="docutils literal notranslate"><span class="pre">animate_move_params_file</span></code> argument is now required in the <code class="docutils literal notranslate"><span class="pre">convert_animation_file_to_proto</span></code> function if default move parameter values are needed. Please see <a class='reference internal' href='/python/bosdyn-choreography-client/src/bosdyn/choreography/client/animation_file_to_proto'><span class="doc">animation_file_to_proto.py</span></a>.</p></li> </ul> </section> <section id="id2"> <h4>Clients<a class="headerlink" href="#id2" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>The <code class="docutils literal notranslate"><span class="pre">ResponseContext</span></code> class has been updated such that if the response header does not contain a response timestamp, it sets the response timestamp.</p></li> <li><p>A bug in the <code class="docutils literal notranslate"><span class="pre">oneof_param_to_dict</span></code> function in the <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/service_customization_helpers'><span class="doc">service customization helpers</span></a> has been fixed. The function now returns <code class="docutils literal notranslate"><span class="pre">Dict</span></code> instead of <code class="docutils literal notranslate"><span class="pre">List</span></code>.</p></li> <li><p>Support for the <code class="docutils literal notranslate"><span class="pre">Keepalive</span> <span class="pre">Service</span></code> has been added to the command-line client. Please see <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/command_line'><span class="doc">command_line.py</span></a>.</p></li> </ul> </section> <section id="extensions"> <h4>Extensions<a class="headerlink" href="#extensions" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Support for a new field, <code class="docutils literal notranslate"><span class="pre">extension_name</span></code>, has been added for Extensions (via the required <code class="docutils literal notranslate"><span class="pre">manifest.json</span></code> file). This field represents the name of the extension. If no <code class="docutils literal notranslate"><span class="pre">extension_name</span></code> is provided, the extension name defaults to the name of the spx file as before. Please see <a class='reference external' href='/docs/payload/docker_containers#extension-structure'>here</a> for more information.</p></li> <li><p>Support for the <code class="docutils literal notranslate"><span class="pre">journald</span></code> logging driver has been added for Extensions (via the required <code class="docutils literal notranslate"><span class="pre">docker-compose.yml</span></code> file). Usage of the <code class="docutils literal notranslate"><span class="pre">journald</span></code> logging driver enables developers to retrieve logs for containers that are no longer running, even after a power cycle. Please see the <a class='reference external' href='/docs/payload/docker_containers#docker-compose-yaml-configuration-file'>CORE I/O documentation</a> for more information. If no logging driver is specified in the <code class="docutils literal notranslate"><span class="pre">docker-compose.yml</span></code> file, the Extension uses the <code class="docutils literal notranslate"><span class="pre">journald</span></code> logging driver.</p></li> </ul> </section> <section id="geometry-and-frames"> <h4>Geometry and Frames<a class="headerlink" href="#geometry-and-frames" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>A new reference frame, “feet_center”, has been added. This frame is gravity-aligned and represents the robot’s footprint. The origin is at the geometric center of the robot’s feet. The x-axis is aligned such that it points from the center of the rear feet to the center of the front feet in the x-y plane.</p></li> <li><p>Support for the <code class="docutils literal notranslate"><span class="pre">seed</span></code> and <code class="docutils literal notranslate"><span class="pre">waypoint</span></code> frames has been added to <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/frame_helpers'><span class="doc">frame_helpers.py</span></a>. The <code class="docutils literal notranslate"><span class="pre">seed</span></code> frame is a global reference frame for a Graph Nav map. Its metric consistency may be improved using the <a class='reference external' href='/protos/bosdyn/api/proto_reference#bosdyn-api-graph-nav-map-processing-service-proto'>ProcessAnchoring</a> RPC. For example, suppose a Graph Nav map were recorded on a construction site where “survey targets” the robot could recognize (e.g., AprilTags) had been measured with millimeter-level accuracy using a Total Measurement Station. The robot’s pose in this <code class="docutils literal notranslate"><span class="pre">seed</span></code> frame is advantageous from a registration perspective for laser scans collected using a laser scanner that may not necessarily be capable of tracking its localization accurately in challenging environments because it can inform the laser scanner of where it actually is with high accuracy. Similarly, the robot’s pose relative to the <code class="docutils literal notranslate"><span class="pre">waypoint</span></code> frame may also be important if the robot is expected to perform some action there that requires a high degree of repeatability. The added support for these frames in the frame helpers allows developers to focus on the high-level, value-added tasks.</p></li> </ul> </section> <section id="graph-nav"> <h4>Graph Nav<a class="headerlink" href="#graph-nav" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Clients are now informed by Graph Nav if they send a <a class='reference external' href='/protos/bosdyn/api/proto_reference#setlocalizationrequest'>SetLocalizationRequest</a> message to the robot and no map is loaded. The new status, <code class="docutils literal notranslate"><span class="pre">STATUS_NO_MAP_LOADED</span></code>, is returned in the <code class="docutils literal notranslate"><span class="pre">status</span></code> field in the response (<a class='reference external' href='/protos/bosdyn/api/proto_reference#setlocalizationresponse'>SetLocalizationResponse</a> message type). This status indicates that localization failed because no map is currently loaded.</p></li> <li><p>More granular control over whether the robot has reached its goal is now available via the <code class="docutils literal notranslate"><span class="pre">box_region</span></code> field in the <a class='reference external' href='/protos/bosdyn/api/proto_reference#travelparams'>TravelParams</a> message. Clients can now specify a oriented 2D rectangle relative to a waypoint using the <a class='reference external' href='/protos/bosdyn/api/proto_reference#orientedbox2'>OrientedBox2</a> message. Previously, only a <code class="docutils literal notranslate"><span class="pre">max_distance</span></code> (2D circle with radius <code class="docutils literal notranslate"><span class="pre">max_distance</span></code>) and <code class="docutils literal notranslate"><span class="pre">max_yaw</span></code> were supported. Similarly, while navigating an edge at playback, the max distance from the recorded edge that the robot is allowed to travel when avoiding obstacles or optimizing its path is configurable using the <code class="docutils literal notranslate"><span class="pre">max_corridor_distance</span></code> field in the edge <a class='reference external' href='/protos/bosdyn/api/proto_reference#edge-annotations'>Annotations</a> message.</p></li> <li><p>The lost detector, which is responsible for determining when the robot is lost, is now configurable. If the robot is regularly getting lost on site in a particular location, where, for example, its surroundings change regularly, this may be of use. The strictness of the lost detector can be configured using the <a class='reference external' href='/protos/bosdyn/api/proto_reference#lostdetectorstrictness'>LostDetectorStrictness</a> enum type. Similarly, if there are particular, problematic regions at a given waypoint, the <a class='reference external' href='/protos/bosdyn/api/proto_reference#regionwithframe'>RegionWithFrame</a> message may be used to configure how scan matching or other parameters work. For example, there could be a particular region at a waypoint where the scene changed frequently, thereby causing the robot to get lost. Assuming no risks from a navigation or safety perspective are in the vicinity (e.g., an unprotected fall), the <code class="docutils literal notranslate"><span class="pre">lost_detector_strictness</span></code> field could be set to <code class="docutils literal notranslate"><span class="pre">LOST_DETECTOR_STRICTNESS_PERMISSIVE</span></code>. The dynamic region could be indicated using the <code class="docutils literal notranslate"><span class="pre">regions</span></code> field, setting the <code class="docutils literal notranslate"><span class="pre">data_filter</span></code> field in the <a class='reference external' href='/protos/bosdyn/api/proto_reference#bosdyn-api-graph-nav-map-proto'>Region</a> message to <code class="docutils literal notranslate"><span class="pre">DATA_FILTER_IGNORE</span></code>. These settings are per <a class='reference external' href='/protos/bosdyn/api/proto_reference#waypoint'>Waypoint</a>. To debug the lost detector, use the <code class="docutils literal notranslate"><span class="pre">lost_detector_state</span></code> field in the <a class='reference external' href='/protos/bosdyn/api/proto_reference#getlocalizationstateresponse'>GetLocalizationStateResponse</a> message.</p></li> <li><p>More granular control of the feature matching behavior of topology processing is now available via the <a class='reference external' href='/protos/bosdyn/api/proto_reference#featurematchingparams'>FeatureMatchingParams</a> message. A new field, <code class="docutils literal notranslate"><span class="pre">feature_matching_params</span></code>, has been added to the <a class='reference external' href='/protos/bosdyn/api/proto_reference#params'>Params</a> message that controls whether and how sparse feature matching is performed during topology processing. At present, the how is limited to simply enabling/disabling feature matching. Please see <a class='reference external' href='/docs/concepts/autonomy/graphnav_map_structure#topology-processing'>here</a> for more information.</p></li> <li><p>The Python SDK now raises <code class="docutils literal notranslate"><span class="pre">LicenseError</span></code> if the robot’s license is not valid when calling <code class="docutils literal notranslate"><span class="pre">upload_graph()</span></code>, <code class="docutils literal notranslate"><span class="pre">start_recording()</span></code>, or <code class="docutils literal notranslate"><span class="pre">create_waypoint()</span></code>. Previously they incorrectly raised <code class="docutils literal notranslate"><span class="pre">UnsetStatusError</span></code>.</p></li> </ul> </section> <section id="missions"> <h4>Missions<a class="headerlink" href="#missions" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Additional mission node data can now be read from the blackboard at playback. The updated node types and data that can be read are:</p></li> </ul> <table border="1" class="docutils"> <thead> <tr> <th>Node Type</th> <th>Data</th> </tr> </thead> <tbody> <tr> <td><a href='/protos/bosdyn/api/proto_reference#forduration'>ForDuration</a></td> <td>Duration (<code>google.protobuf.Duration</code>)</td> </tr> <tr> <td><a href='/protos/bosdyn/api/proto_reference#bosdynnavigateroute'>BosdynNavigateRoute</a></td> <td><code>graph_nav_pb2.NavigateRouteRequest</code></td> </tr> <tr> <td><a href='/protos/bosdyn/api/proto_reference#bosdyngraphnavlocalize'>BosdynGraphNavLocalize</a></td> <td><code>graph_nav_pb2.SetLocalizationRequest</code></td> </tr> <tr> <td><a href='/protos/bosdyn/api/proto_reference#prompt'>Prompt</a></td> <td>List of options (<code>nodes_pb2.OptionsList</code>)</td> </tr> <tr> <td><a href='/protos/bosdyn/api/proto_reference#dock'>Dock</a></td> <td>Docking station ID (<code>uint32</code>)</td> </tr> </tbody> </table></section> <section id="rajant"> <h4>Rajant<a class="headerlink" href="#rajant" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>The default IP address for all Rajant ES1 Radios shipped from Boston Dynamics is 192.168.50.9.</p></li> </ul> </section> <section id="robot-state"> <h4>Robot State<a class="headerlink" href="#robot-state" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>The behavior state of the robot can now be determined in a simpler fashion via the new <code class="docutils literal notranslate"><span class="pre">behavior_state</span></code> field in the <a class='reference external' href='/protos/bosdyn/api/proto_reference#robotstate'>RobotState</a> message. Behavior states currently include standing, stepping, transitioning from sitting to standing and vice versa, unready to move, and unknown. Clients that were previously relying on their own heuristics to determine this type of information may benefit from this new field.</p></li> </ul> </section> </section> <section id="deprecations"> <h3>Deprecations<a class="headerlink" href="#deprecations" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>In the <code class="docutils literal notranslate"><span class="pre">AreaCallbackData</span></code> message, the <code class="docutils literal notranslate"><span class="pre">custom_params</span></code> field is being replaced by the <code class="docutils literal notranslate"><span class="pre">param_collection</span></code> field, which contains the same values, but also the specification used to edit them. For the time being, the <code class="docutils literal notranslate"><span class="pre">custom_params</span></code> field will still be filled out during recording, but any usage of that field should be migrated to prefer the <code class="docutils literal notranslate"><span class="pre">param_collection</span></code> values.</p></li> <li><p>In the <code class="docutils literal notranslate"><span class="pre">PlaybackMode</span></code> message, the <code class="docutils literal notranslate"><span class="pre">skip_docking_after_completion</span></code> field is being replaced by the <code class="docutils literal notranslate"><span class="pre">disable_end</span></code> field in the <code class="docutils literal notranslate"><span class="pre">Dock</span></code> message. Setting <code class="docutils literal notranslate"><span class="pre">skip_docking_after_completion</span></code> to <code class="docutils literal notranslate"><span class="pre">true</span></code> is the same as setting <code class="docutils literal notranslate"><span class="pre">disable_end</span></code> to <code class="docutils literal notranslate"><span class="pre">true</span></code> for every <code class="docutils literal notranslate"><span class="pre">Dock</span></code>.</p></li> <li><p>Currently the mission service supports blackboard variable keys that contain “.”, “[]”, and “()”. In a future release, this will no longer be supported. Boston Dynamics recommends using letters, numbers, and underscores for blackboard keys.</p></li> </ul> </section> <section id="known-issues"> <h3>Known Issues<a class="headerlink" href="#known-issues" title="Permalink to this heading"></a></h3> <section id="preexisting-but-undiscovered-prior-to-4-1-0"> <h4>Preexisting, but undiscovered prior to 4.1.0<a class="headerlink" href="#preexisting-but-undiscovered-prior-to-4-1-0" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>The <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/time_sync'><span class="doc">TimeSync client</span></a> may lose time sync with the robot, and eventually the client time may drift far enough away from the robot time that the robot starts rejecting the client’s messages.</p></li> </ul> </section> <section id="preexisting"> <h4>Preexisting<a class="headerlink" href="#preexisting" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Same as 4.0.2</p></li> </ul> </section> </section> <section id="spot-sample-code"> <h3>Spot Sample Code<a class="headerlink" href="#spot-sample-code" title="Permalink to this heading"></a></h3> <section id="new"> <h4>New<a class="headerlink" href="#new" title="Permalink to this heading"></a></h4> </section> <section id="updated"> <h4>Updated<a class="headerlink" href="#updated" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p><a class='reference internal' href='/python/examples/area_callback/readme'><span class="doc">Area Callback Crosswalk</span></a> and <a class='reference internal' href='/python/examples/area_callback/readme'><span class="doc">Area Callback Look Both Ways</span></a>: The <code class="docutils literal notranslate"><span class="pre">area_callback_crosswalk.py</span></code> and <code class="docutils literal notranslate"><span class="pre">area_callback_look_both_ways.py</span></code> examples now utilize the new <code class="docutils literal notranslate"><span class="pre">starting_inside_region</span></code> field mentioned above in the <a class="reference external" href="#410">4.1.0</a> release notes. Custom parameters have also been added to the latter example to allow the user to configure the yaw.</p></li> <li><p><a class='reference internal' href='/python/examples/extensions/readme'><span class="doc">Build Extension</span></a>: The <code class="docutils literal notranslate"><span class="pre">build_extension.py</span></code> example now checks if docker-compose.yml and manifest.json are malformed. Please note that it does not check whether all required fields are there.</p></li> <li><p><a class='reference internal' href='/python/examples/get_depth_plus_visual_image/readme'><span class="doc">Get Depth Plus Visual Image</span></a>: The <code class="docutils literal notranslate"><span class="pre">get_depth_plus_visual_image.py</span></code> example now supports querying the gripper camera.</p></li> <li><p><a class='reference internal' href='/python/examples/gps_service/readme'><span class="doc">GPS</span></a>: The <code class="docutils literal notranslate"><span class="pre">gps_listener.py</span></code> now self-registers the GPS device as a payload on Spot. Please note that the corresponding docker-compose.yml file needs to be updated. Additionally, some of the command-line parameters in the docker-compose.yml files have been updated. “Support” for two additional receivers has been added, namely the <code class="docutils literal notranslate"><span class="pre">ByNav</span> <span class="pre">C2-M2X</span></code> and <code class="docutils literal notranslate"><span class="pre">u-blox</span> <span class="pre">ZED-F9R</span></code>. “Support” is written in quotations because strictly speaking, these payloads are neither officially supported nor endorsed by Boston Dynamics. Finally, a workaround for an issue with the <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/time_sync'><span class="doc">TimeSync client</span></a> where the robot would start rejecting the GPS data has been implemented. When this workaround is enabled (by adding <code class="docutils literal notranslate"><span class="pre">&quot;--disable-time-sync&quot;</span></code> to the <code class="docutils literal notranslate"><span class="pre">docker-compose.yml</span></code> file), the client uses the CORE I/O system time, which is synchronized with the robot time using NTP, thereby negating the need to use the time sync client. Please note that the underlying issue with the time sync client has not yet been resolved and that this issue may apply more generally.</p></li> <li><p><a class='reference internal' href='/python/examples/remote_mission_service/readme'><span class="doc">Remote Mission Service Examples</span></a>: A bug, whereby the user would be unable to select who the robot should say “hello” to on the tablet, has been fixed in the <code class="docutils literal notranslate"><span class="pre">hello_world_mission_service.py</span></code> example. The <code class="docutils literal notranslate"><span class="pre">remote_mission_client.py</span></code> example has been made more autowalk-friendly. Previously, the example and autowalk would fight for control over the robot due to the example powering off the robot. Now, the robot simply performs “the wave” instead.</p></li> <li><p><a class='reference internal' href='/python/examples/replay_mission/readme'><span class="doc">Replay Mission</span></a>: A bug that caused the <code class="docutils literal notranslate"><span class="pre">replay_mission.py</span></code> example to crash has been fixed.</p></li> <li><p><a class='reference external' href='/python/examples/data_acquisition_service/readme#save-file-plugin'>Save File Plugin Service</a> and <a class='reference internal' href='/python/examples/service_customization/custom_parameters_data_acquisition/readme'><span class="doc">Data Acquisition Plugin - Custom Params</span></a>: These examples now use methods that use the new <a class='reference external' href='/protos/bosdyn/api/proto_reference#StoreDataStream'>StoreDataStream</a> RPC under the hood. Please note that these examples will no longer work if the robot software version is before 4.1.0.</p></li> </ul> <p><a class='reference internal' href='/python/examples/data_acquisition_service/readme'><span class="doc">Data Acquisition Download</span></a>: This example now additionally supports the <a class='reference external' href='/protos/bosdyn/api/proto_reference#querystoredcaptures'>QueryStoredCaptures</a> RPC.</p> <ul class="simple"> <li><p><a class='reference internal' href='/python/examples/network_compute_bridge/readme'><span class="doc">Simple Alert Server</span></a>: The breaking change reported in <a class="reference external" href="#401">4.0.1</a>, but present since <a class="reference external" href="#400">4.0.0</a> has been fixed for the <code class="docutils literal notranslate"><span class="pre">simple_alert_server.py</span></code> example. The <code class="docutils literal notranslate"><span class="pre">status</span></code> in the <code class="docutils literal notranslate"><span class="pre">WorkerComputeResponse</span></code> is set to <code class="docutils literal notranslate"><span class="pre">NETWORK_COMPUTE_STATUS_SUCCESS</span></code>.</p></li> <li><p><a class='reference internal' href='/python/examples/velodyne_client/readme'><span class="doc">Velodyne Client</span></a>: A deprecation warning associated with NumPy &gt;= 2.0.0 has been fixed.</p></li> <li><p><a class='reference internal' href='/python/examples/graph_nav_view_gps/readme'><span class="doc">View GraphNav Map in a Web Browser</span></a>: The <code class="docutils literal notranslate"><span class="pre">view_gps.py</span></code> example now supports filtering the GPS data by relative time. This can be useful for reducing the rendering workload if the GPS’s update rate is really high.</p></li> <li><p><a class='reference internal' href='/python/examples/arm_gcode/readme'><span class="doc">Arm Gcode Example</span></a>: The <code class="docutils literal notranslate"><span class="pre">arm_gcode.py</span></code> example now supports a tool length value configurable by the user to account for the length of chalk held by the gripper. This is found in <code class="docutils literal notranslate"><span class="pre">gcode.cfg</span></code>. Drawing sequences now pause at the start to allow the user to insert chalk into the open gripper and close the gripper on command. Other updates include consistent use of the vision frame for localization, ground plane estimation, and drawing location. Draw on wall stability is improved but this feature remains in beta.</p></li> </ul> </section> </section> <section id="orbit-sample-code"> <h3>Orbit Sample Code<a class="headerlink" href="#orbit-sample-code" title="Permalink to this heading"></a></h3> <section id="id3"> <h4>New<a class="headerlink" href="#id3" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p><a class='reference internal' href='/docs/concepts/orbit/orbit_api'><span class="doc">Orbit API Documentation</span></a>: Though not an example, the Orbit API documentation is significantly improved. High-level concepts are still described on the <a class='reference internal' href='/docs/concepts/orbit/about_orbit'><span class="doc">About Orbit</span></a> page.</p></li> <li><p><a class='reference internal' href='/python/bosdyn-orbit/src/bosdyn/orbit/client'><span class="doc">Orbit Client</span></a>: The Orbit Client now supports <code class="docutils literal notranslate"><span class="pre">PATCH</span></code> endpoints on Orbit via the <code class="docutils literal notranslate"><span class="pre">patch_resource</span></code> method. In addition, five new methods: <code class="docutils literal notranslate"><span class="pre">patch_anomaly_by_id</span></code>, <code class="docutils literal notranslate"><span class="pre">patch_bulk_close_anomalies</span></code>, <code class="docutils literal notranslate"><span class="pre">get_site_walk_archive_by_id</span></code>, <code class="docutils literal notranslate"><span class="pre">post_backup_task</span></code>, and <code class="docutils literal notranslate"><span class="pre">delete_backup</span></code> have been added. For examples demonstrating usage of these new methods, please see the <a class='reference internal' href='/python/examples/orbit/anomalies/readme'><span class="doc">Get Anomalies</span></a> example for the first two methods, the <a class='reference internal' href='/python/examples/orbit/export_site_walk_archives/readme'><span class="doc">Export SiteWalk Archive(s)</span></a> for the third method, and the <a class='reference internal' href='/python/examples/orbit/backups/readme'><span class="doc">Get Backup</span></a> example for the last two methods. Please note that the <strong>deprecated</strong> <a class='reference internal' href='/python/bosdyn-scout/src/bosdyn/scout/client'><span class="doc">Scout Client</span></a> has <strong>not</strong> been updated.</p></li> <li><p><a class='reference internal' href='/python/examples/orbit/backups/readme'><span class="doc">Get Backup</span></a>: The <code class="docutils literal notranslate"><span class="pre">get_backup.py</span></code> example shows how to retrieve a backup from Orbit.</p></li> <li><p><a class='reference internal' href='/python/examples/orbit/anomalies/readme'><span class="doc">Get Anomalies</span></a>: The <code class="docutils literal notranslate"><span class="pre">get_anomalies.py</span></code> and <code class="docutils literal notranslate"><span class="pre">patch_anomalies.py</span></code> examples show how to retrieve and edit anomaly data using the Orbit Client, respectively. Anomalies are more commonly known as alerts.</p></li> <li><p><a class='reference internal' href='/python/examples/orbit/export_site_walk_archives/readme'><span class="doc">Export SiteWalk Archive(s)</span></a>: The <code class="docutils literal notranslate"><span class="pre">export_site_walk_archives.py</span></code> example shows how to retrieve SiteWalk(s) using the Orbit Client. A SiteWalk describes a series of tasks that define autonomous robot operation. It contains SiteElements and SiteDocks, among other things. A SiteWalk archive is simply a compressed file containing a Graph Nav map and a .walk file. The .walk file is a serialized protobuf message of type <a class='reference external' href='/protos/bosdyn/api/proto_reference#walk'>Walk</a>.</p></li> <li><p><a class='reference internal' href='/python/examples/orbit/webhook_integration/readme'><span class="doc">Webhook Integration</span></a>: The <code class="docutils literal notranslate"><span class="pre">webhook_integration.py</span></code> example is a separate example that builds on the existing <a class='reference internal' href='/python/examples/orbit/webhook/readme'><span class="doc">Webhook Example</span></a>, by additionally listening for webhooks, then performing some data maniuplation on said webhooks before sending the result to an external Enterprise Asset Management (EAM) system. The example may be run on Orbit by building an Orbit Extension and deploying it to Orbit.</p></li> </ul> </section> <section id="id4"> <h4>Updated<a class="headerlink" href="#id4" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p><a class='reference internal' href='/python/examples/orbit/send_robot_back_to_dock/readme'><span class="doc">Send Robot Back to Dock</span></a>: The <code class="docutils literal notranslate"><span class="pre">send_robot_back_to_dock.py</span></code> example now supports skipping initialization, which can be useful if the robot is already localized to the map.</p></li> <li><p><a class='reference internal' href='/python/bosdyn-orbit/src/bosdyn/orbit/client'><span class="doc">Orbit Client</span></a>: An issue with the <code class="docutils literal notranslate"><span class="pre">post_export_as_walk</span></code> method has been fixed. The <code class="docutils literal notranslate"><span class="pre">SiteWalk</span> <span class="pre">UUID</span></code> is now included in the JSON arguments, not appended to the POST request URL as it was before. The <code class="docutils literal notranslate"><span class="pre">post_dispatch_mission_to_robot</span></code> method now supports the <code class="docutils literal notranslate"><span class="pre">skip_initialization</span></code> argument, which controls whether the robot should skip initialization when starting the return to dock mission. The <strong>deprecated</strong> <a class='reference internal' href='/python/bosdyn-scout/src/bosdyn/scout/client'><span class="doc">Scout Client</span></a> has also been updated.</p></li> </ul> </section> </section> </section> <section id="id5"> <h2>4.0.3<a class="headerlink" href="#id5" title="Permalink to this heading"></a></h2> <section id="id6"> <h3>Breaking Changes<a class="headerlink" href="#id6" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>No changes from 4.0.2</p></li> </ul> </section> <section id="id7"> <h3>Deprecations<a class="headerlink" href="#id7" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>No changes from 4.0.2</p></li> </ul> </section> <section id="id8"> <h3>Known Issues<a class="headerlink" href="#id8" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>No changes from 4.0.2</p></li> </ul> </section> </section> <section id="id9"> <h2>4.0.2<a class="headerlink" href="#id9" title="Permalink to this heading"></a></h2> <section id="id10"> <h3>Breaking Changes<a class="headerlink" href="#id10" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>Same as 4.0.1</p></li> </ul> </section> <section id="id11"> <h3>New Features<a class="headerlink" href="#id11" title="Permalink to this heading"></a></h3> <section id="joint-control"> <h4>Joint Control<a class="headerlink" href="#joint-control" title="Permalink to this heading"></a></h4> <p>The Joint Control API allows for low-level control of the robot’s joints. Note that this API is experimental and license-limited; the robot must have a Joint Level Control license installed in order for this API to be used. Please see the <a class='reference internal' href='/docs/concepts/joint_control/readme'><span class="doc">documentation</span></a> for more information and <a class='reference internal' href='/docs/concepts/joint_control/supplemental_data'><span class="doc">supplemental</span></a> robot information which may be useful for development or simulation of the robot.</p> </section> </section> <section id="id12"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id12" title="Permalink to this heading"></a></h3> <section id="id13"> <h4>Choreography<a class="headerlink" href="#id13" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>A new field, <code class="docutils literal notranslate"><span class="pre">return_animation_names_only</span></code>, has been added to the <a class='reference external' href='/protos/bosdyn/api/proto_reference#getchoreographysequencerequest'>GetChoreographySequenceRequest</a> message. This field allows clients to save bandwidth by requesting only the animation names and not the entire animation for the specified choreography sequence. Correspondingly, a new message, <code class="docutils literal notranslate"><span class="pre">GetAnimation</span></code>, allows clients to request individual animations by name.</p></li> </ul> </section> <section id="id14"> <h4>Robot State<a class="headerlink" href="#id14" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Two new fields, <code class="docutils literal notranslate"><span class="pre">kinematic_state</span></code> and <code class="docutils literal notranslate"><span class="pre">contact_states</span></code>, have been added to the <a class='reference external' href='/protos/bosdyn/api/proto_reference#robotstatestreamresponse'>RobotStateStreamResponse</a> message. The <code class="docutils literal notranslate"><span class="pre">kinematic_state</span></code> field contains information about the pose and velocity of the robot body frame in the odom and vision frames. The <code class="docutils literal notranslate"><span class="pre">contact_states</span></code> field contains information about the foot positions and contact state, on a per-foot basis, of the robot. The <code class="docutils literal notranslate"><span class="pre">GetRobotStateStream</span></code> RPC is a lightweight, streaming version of the <code class="docutils literal notranslate"><span class="pre">GetRobotState</span></code> RPC that clients who need the lowest latency possible can use (e.g., users of the Joint Control API).</p></li> </ul> </section> <section id="orbit"> <h4>Orbit<a class="headerlink" href="#orbit" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>The <a class='reference internal' href='/python/bosdyn-orbit/src/bosdyn/orbit/client'><span class="doc">Orbit Client</span></a> now works on Python 3.6 and Python 3.7. Previously, it was broken on those Python versions due to an import failure. The <strong>deprecated</strong> <a class='reference internal' href='/python/bosdyn-orbit/src/bosdyn/orbit/client'><span class="doc">Scout Client</span></a> had the same issue and has also been fixed.</p></li> </ul> </section> </section> <section id="id15"> <h3>Deprecations<a class="headerlink" href="#id15" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>Same as 4.0.1</p></li> </ul> </section> <section id="id16"> <h3>Known Issues<a class="headerlink" href="#id16" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>Same as 4.0.1</p></li> </ul> </section> <section id="id17"> <h3>Spot Sample Code<a class="headerlink" href="#id17" title="Permalink to this heading"></a></h3> <section id="id18"> <h4>New<a class="headerlink" href="#id18" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p><a class='reference external' href='/python/examples/joint_control/readme#armless-robot-squat'>Joint Control: Robot Squat</a>: An example that utilizes the joint control API to move the robot for a robot without an arm attached.</p></li> <li><p><a class='reference external' href='/python/examples/joint_control/readme#arm-wiggle'>Joint Control: Wiggle Arm</a>: An example that utilizes the joint control API to move the robot for a robot with an arm attached.</p></li> </ul> </section> <section id="id19"> <h4>Updated<a class="headerlink" href="#id19" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p><a class='reference internal' href='/python/examples/gps_service/readme'><span class="doc">GPS Listener</span></a>: A bug that caused this example to crash when a GPS receiver published an NMEA message without a timestamp has been fixed. The <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/gps/nmeaparser'><span class="doc">NMEAParser</span></a> now ignores NMEA messages without timestamps. In addition to that, the baud rate of the GPS receiver used in conjunction with this example is now configurable via a command-line argument.</p></li> </ul> </section> </section> <section id="id20"> <h3>Orbit Sample Code<a class="headerlink" href="#id20" title="Permalink to this heading"></a></h3> <section id="id21"> <h4>Updated<a class="headerlink" href="#id21" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p><a class='reference internal' href='/python/examples/orbit/webhook/readme'><span class="doc">Hello Webhook</span></a>: A bug that caused this example to crash when the webhook event type was <code class="docutils literal notranslate"><span class="pre">TEST</span></code> has been fixed. The <code class="docutils literal notranslate"><span class="pre">TEST</span></code> event type is useful for debugging webhooks without having to perform an action using the robot.</p></li> </ul> </section> </section> </section> <section id="id22"> <h2>4.0.1<a class="headerlink" href="#id22" title="Permalink to this heading"></a></h2> <section id="id23"> <h3>Breaking Changes<a class="headerlink" href="#id23" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>A breaking change that was present in 4.0.0, but was unfortunately not reported, is that Network Compute Bridge workers are now required to set the status field. Previously, this was not required. One of the Network Compute Bridge examples has been updated accordingly (see <a class='reference internal' href='/python/examples/network_compute_bridge/readme'><span class="doc">here</span></a>).</p></li> </ul> </section> <section id="id24"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id24" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>In Spot software versions prior to 4.0.1, the <code class="docutils literal notranslate"><span class="pre">bosdyn.client.power.power_off_robot</span></code> and <code class="docutils literal notranslate"><span class="pre">bosdyn.client.power.safe_power_off_robot</span></code> methods may not de-energize the robot. Note that the <code class="docutils literal notranslate"><span class="pre">safe_power_off_robot</span></code> method will still cause the robot’s motors to power off, but will not cause the entire robot to shut down. If your robot uses this or any integration that relies on the programmatic full shutdown, and your robot is affected by this issue, we recommend updating to 4.0.1 or later Spot software.</p></li> <li><p><a class='reference internal' href='/python/bosdyn-orbit/src/bosdyn/orbit/readme'><span class="doc">Orbit Client</span></a> and <a class='reference internal' href='/python/bosdyn-scout/src/bosdyn/scout/readme'><span class="doc">Scout Client</span></a>: For developers on Python &lt;= 3.8, the Orbit and (deprecated) Scout clients failed to import due to the use of a feature that is only available starting in Python 3.9. This feature is no longer used.</p></li> <li><p>Examples that use the <code class="docutils literal notranslate"><span class="pre">GrpcServiceRunner</span></code> in <code class="docutils literal notranslate"><span class="pre">bosdyn.client.server_util</span></code> with the default argument <code class="docutils literal notranslate"><span class="pre">force_sigint_capture=True</span></code> no longer fail on Windows. A check for the Operating System (OS) has been added so that this does not happen.</p></li> <li><p>The diagnostics and exception handling in <code class="docutils literal notranslate"><span class="pre">bosdyn.client.area_callback_service_utils</span></code> have been improved.</p></li> <li><p>Fixed an issue where the robot would try to walk up the center of very wide staircases. Now, it stays closer to the recorded path up the staircase. The path on the stairs can be overridden by changing a new field, <code class="docutils literal notranslate"><span class="pre">traversal_y_offset</span></code>, which has been added to the <a class='reference external' href='/protos/bosdyn/api/proto_reference#edge'>edge annotations</a> message.</p></li> </ul> </section> <section id="id25"> <h3>Deprecations<a class="headerlink" href="#id25" title="Permalink to this heading"></a></h3> <p>In addition to those listed for 4.0.0:</p> <ul class="simple"> <li><p>GraphNav map edge annotations: <code class="docutils literal notranslate"><span class="pre">flat_ground</span></code></p></li> </ul> </section> <section id="id26"> <h3>Known Issues<a class="headerlink" href="#id26" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>Same as 4.0.0</p></li> </ul> </section> <section id="sample-code"> <h3>Sample Code<a class="headerlink" href="#sample-code" title="Permalink to this heading"></a></h3> <section id="id27"> <h4>Updated<a class="headerlink" href="#id27" title="Permalink to this heading"></a></h4> <section id="spot"> <h5>Spot<a class="headerlink" href="#spot" title="Permalink to this heading"></a></h5> <ul class="simple"> <li><p><a class='reference internal' href='/python/examples/tester_programs/readme'><span class="doc">Tester Programs</span></a>: The instructions for the tester programs that may be used to test image services and data acquisition plugins have been made more clear.</p></li> <li><p><a class='reference internal' href='/python/examples/fan_command/readme'><span class="doc">Fan Control</span></a>: Fixed flipped <code class="docutils literal notranslate"><span class="pre">response</span></code> and <code class="docutils literal notranslate"><span class="pre">request</span></code> arguments, which caused the <code class="docutils literal notranslate"><span class="pre">GetRemoteMissionServiceInfo</span></code> method to fail.</p></li> <li><p><a class='reference internal' href='/python/examples/network_request_callback/readme'><span class="doc">Network Request</span></a>: Fixed flipped <code class="docutils literal notranslate"><span class="pre">response</span></code> and <code class="docutils literal notranslate"><span class="pre">request</span></code> arguments, which caused the <code class="docutils literal notranslate"><span class="pre">GetRemoteMissionServiceInfo</span></code> method to fail.</p></li> <li><p><a class='reference internal' href='/python/examples/remote_mission_service/readme'><span class="doc">Power Off Mission Service Callback</span></a>: Fixed flipped <code class="docutils literal notranslate"><span class="pre">response</span></code> and <code class="docutils literal notranslate"><span class="pre">request</span></code> arguments, which caused the <code class="docutils literal notranslate"><span class="pre">GetRemoteMissionServiceInfo</span></code> method to fail.</p></li> <li><p><a class='reference internal' href='/python/examples/extensions/readme'><span class="doc">Build Extension</span></a>: The <code class="docutils literal notranslate"><span class="pre">build_extension.py</span></code> script now defaults to building Extensions for the ARM64 architecture now.</p></li> <li><p><a class='reference internal' href='/python/examples/comms_test/readme'><span class="doc">Comms Test</span></a>: The command to run the Docker image has been updated (previously, it was incorrect).</p></li> <li><p><a class='reference internal' href='/python/examples/edit_autowalk/readme'><span class="doc">Edit Autowalk</span></a>: The mission status is now printed regularly, as well as any mission questions as they occur.</p></li> <li><p><a class='reference internal' href='/python/examples/service_customization/custom_parameter_image_server/readme'><span class="doc">Custom Parameter Image Server</span></a>: This example now works on CORE I/O. A webcam that is compatible with CORE I/O is required (e.g., Logitech, Inc. HD Pro Webcam C920).</p></li> <li><p><a class='reference internal' href='/python/examples/post_docking_callbacks/readme'><span class="doc">Post-Docking Callback</span></a>: Fixed an issue where the example would break if a time period was supplied.</p></li> <li><p><a class='reference internal' href='/python/examples/spot_light/readme'><span class="doc">Spot Light</span></a>: A brightness threshold has been added, so that if the user does not have a light that is bright enough, they can adjust the threshold so that the robot will stand.</p></li> <li><p><a class='reference internal' href='/python/examples/network_compute_bridge/fire_extinguisher_server/readme'><span class="doc">Network Compute Bridge Worker (Fire Extinguisher)</span></a>: The instructions have been updated to demonstrate how to configure the Inspection in the tablet.</p></li> <li><p><a class='reference internal' href='/python/examples/network_compute_bridge/readme'><span class="doc">Network Compute Bridge Worker (TensorFlow)</span></a>: The <code class="docutils literal notranslate"><span class="pre">status</span></code> field in NetworkComputeResponse is now set.</p></li> </ul> </section> <section id="id28"> <h5>Orbit<a class="headerlink" href="#id28" title="Permalink to this heading"></a></h5> <ul class="simple"> <li><p><a href='/docs/orbit/docs'>Orbit API</a>: The name of the <code class="docutils literal notranslate"><span class="pre">site_elements</span></code> endpoint has been corrected (previously <code class="docutils literal notranslate"><span class="pre">SiteElements</span></code>).</p></li> <li><p><a class='reference internal' href='/python/examples/orbit/send_robot_back_to_dock/readme'><span class="doc">Orbit Send Robot Back to Dock</span></a>: The example has been made more interactive.</p></li> </ul> </section> </section> </section> </section> <section id="id29"> <h2>4.0.0<a class="headerlink" href="#id29" title="Permalink to this heading"></a></h2> <section id="id30"> <h3>Breaking Changes<a class="headerlink" href="#id30" title="Permalink to this heading"></a></h3> <p>The following fields and services have been <strong>removed</strong>.</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">LogAnnotationService</span></code></p></li> <li><p>Auth application token, <code class="docutils literal notranslate"><span class="pre">application_token</span></code>, and its corresponding statuses, <code class="docutils literal notranslate"><span class="pre">STATUS_INVALID_APPLICATION_TOKEN</span></code> and <code class="docutils literal notranslate"><span class="pre">STATUS_EXPIRED_APPLICATION_TOKEN</span></code></p></li> <li><p>Robot commands: non-synchronized mobility commands. Top-level feedback messages.</p></li> <li><p>Graph Nav map edge annotations: <code class="docutils literal notranslate"><span class="pre">vel_limit</span></code>, <code class="docutils literal notranslate"><span class="pre">ground_mu_hint</span></code>, <code class="docutils literal notranslate"><span class="pre">grated_floor</span></code></p></li> <li><p>SpotCheck feedback: <code class="docutils literal notranslate"><span class="pre">foot_height_results</span></code> and <code class="docutils literal notranslate"><span class="pre">leg_pair_results</span></code></p></li> </ul> <p>The mapping between voltage and GPIO pins on the CoreIO has changed as part of the Jetpack 5 update. {5: 133, 12: 19, 24: 148} is now {5: 440, 12: 320, 24: 453}. Please see the updated <a class='reference internal' href='/python/examples/core_io_gpio/readme'><span class="doc">CoreIO GPIO</span></a> example.</p> <p>Network Compute Bridge workers are now required to set the status field. Previously, this was not required.</p> </section> <section id="id31"> <h3>New Features<a class="headerlink" href="#id31" title="Permalink to this heading"></a></h3> <section id="autowalk-and-missions"> <h4>Autowalk and Missions<a class="headerlink" href="#autowalk-and-missions" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>The focus state of the SpotCam PTZ is now configurable using <code class="docutils literal notranslate"><span class="pre">focus_state</span></code>. The tablet allows the user to configure the SpotCam PTZ focus during autowalk recording. Clients that previously were unable to use the <code class="docutils literal notranslate"><span class="pre">SpotCamAlignment</span></code> action wrapper because of issues with auto-focus may now use this action wrapper with the desired manual focus setting.</p></li> <li><p>The stow behavior of Spot’s arm while Spot is navigating to its next <code class="docutils literal notranslate"><span class="pre">Target</span></code> is now configurable using <code class="docutils literal notranslate"><span class="pre">target_stow_behavior</span></code>.</p></li> <li><p>The gripper behavior of Spot’s arm after Spot has executed an action is now configurable using <code class="docutils literal notranslate"><span class="pre">disable_post_action_close</span></code>.</p></li> <li><p>Support for Choreography has been added to autowalk. Please see the <code class="docutils literal notranslate"><span class="pre">MissionUploadChoreography</span></code> and <code class="docutils literal notranslate"><span class="pre">ExecuteChoreography</span></code> messages. The robot must have a choreography license in order to use this. Please see the <a class='reference internal' href='/docs/concepts/choreography/choreographer'><span class="doc">choreography documentation</span></a> for more information.</p></li> <li><p>Support for visualization of route progress with the addition of <code class="docutils literal notranslate"><span class="pre">CompletedRoute</span></code> to the <code class="docutils literal notranslate"><span class="pre">NavigationFeedbackResponse</span></code> message.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">Prompt</span></code> nodes now support custom parameter specification for answers, enabling prompts for any data supported by the Service Customization service. More detailed descriptions of how to specify these parameters can be found in the <a class='reference internal' href='/docs/concepts/service_customization'><span class="doc">service customization documentation</span></a>.</p></li> </ul> </section> <section id="orbit-formerly-scout"> <h4>Orbit (formerly Scout)<a class="headerlink" href="#orbit-formerly-scout" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p><a class='reference external' href='/docs/concepts/orbit/about_orbit#webhooks'><strong>Webhooks</strong></a>: Webhooks are a new mechanism for clients to subscribe to real-time Orbit events. In order to receive events, Webhook subscribers must register with Orbit via the settings UI or the new <code class="docutils literal notranslate"><span class="pre">/webhooks</span></code> endpoints documented as part of the <a href='/docs/orbit/docs'>Orbit API</a>. Corresponding helper functions such as <code class="docutils literal notranslate"><span class="pre">post_webhook</span></code> are available in <a class="reference external" href="https://pypi.org/project/bosdyn-orbit/">bosdyn-orbit</a>’s client.</p></li> <li><p><a class='reference external' href='/docs/concepts/orbit/about_orbit#scheduling-missions'><strong>Scheduler</strong></a>: Alongside the new Orbit scheduler, one can also schedule missions via the new <code class="docutils literal notranslate"><span class="pre">/calendar</span></code> set of <a href='/docs/orbit/docs'>Orbit API</a> endpoints. Corresponding helper functions such as <code class="docutils literal notranslate"><span class="pre">post_calendar_event</span></code> and <code class="docutils literal notranslate"><span class="pre">get_calendar</span></code> are available in <a class="reference external" href="https://pypi.org/project/bosdyn-orbit/">bosdyn-orbit</a>’s client.</p></li> </ul> </section> <section id="gps"> <h4>GPS<a class="headerlink" href="#gps" title="Permalink to this heading"></a></h4> <p>Spot can now autonomously navigate and localize on Graph Nav maps that have been recorded while using a Global Positioning System (GPS) receiver. Note that the robot does not consume GPS data directly from GPS receivers. Instead, the GPS receiver must be connected to a payload computer (e.g., Core I/O) that is running software that receives the required information from the GPS receiver, then communicates it to the <code class="docutils literal notranslate"><span class="pre">Aggregator</span> <span class="pre">Service</span></code> using the <code class="docutils literal notranslate"><span class="pre">NewGpsDataRequest</span></code> RPC. Extensive documentation is available <a class='reference internal' href='/docs/concepts/autonomy/gps'><span class="doc">here</span></a>; an <a class='reference internal' href='/python/examples/gps_service/readme'><span class="doc">example</span></a> is also provided. One thing worth noting is that although the example makes use of NMEA messages, there is no reason the payload computer could not receive configure the receiver to output messages in a different format (e.g., GSOF, UBX, OEM7).</p> </section> <section id="robot-mobility"> <h4>Robot Mobility<a class="headerlink" href="#robot-mobility" title="Permalink to this heading"></a></h4> <p>A new enum value, <code class="docutils literal notranslate"><span class="pre">SWING_HEIGHT_AUTO</span></code>, has been added to the <code class="docutils literal notranslate"><span class="pre">SwingHeight</span></code> enum. This setting results in the swing height being automatically adjusted based upon the current state of the robot and its surrounding environment.</p> <p>A new enum, <code class="docutils literal notranslate"><span class="pre">DescentPreference</span></code>, has been added to the <code class="docutils literal notranslate"><span class="pre">StairData</span></code> message. The user may allow the robot to descend the stairs facing forwards by setting <code class="docutils literal notranslate"><span class="pre">DESCENT_PREFERENCE_PREFER_REVERSE</span></code> or <code class="docutils literal notranslate"><span class="pre">DESCENT_PREFERENCE_NONE</span></code>. This setting can be useful for allowing the robot to descend a staircase where there was not enough room to turn around after the initial descent (e.g., a catwalk).</p> </section> <section id="data-acquisition-live-data"> <h4>Data Acquisition Live Data<a class="headerlink" href="#data-acquisition-live-data" title="Permalink to this heading"></a></h4> <p>This feature allows payloads to display live data on the tablet and Orbit during teleoperation. The <code class="docutils literal notranslate"><span class="pre">GetLiveData</span></code> RPC has been added to both the Data Acquisition and Data Acquisition Plugin services. Please see the <a class='reference internal' href='/python/examples/data_acquisition_service/signals_coreio_modem_plugin/readme'><span class="doc">CoreIO Modem Plugin</span></a> example. Helper functions have been added to <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/signals_helpers'><span class="doc">signal_helpers.py</span></a>, <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/units_helpers'><span class="doc">unit_helpers.py</span></a>, and <code class="docutils literal notranslate"><span class="pre">test_signals_helpers.py</span></code>. The <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/data_acquisition'><span class="doc">DataAcquisitionClient</span></a> and <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/data_acquisition_plugin_service'><span class="doc">DataAcquisitionPluginService</span></a> classes have been updated accordingly.</p> </section> <section id="id32"> <h4>Data Acquisition Store<a class="headerlink" href="#id32" title="Permalink to this heading"></a></h4> <p>Two RPCs have been added, namely <code class="docutils literal notranslate"><span class="pre">QueryStoredCaptures</span></code> and <code class="docutils literal notranslate"><span class="pre">QueryMaxCaptureId</span></code>. <code class="docutils literal notranslate"><span class="pre">QueryStoredCaptures</span></code> is used to query the Data Acquisition Store Store for stored data while <code class="docutils literal notranslate"><span class="pre">QueryMaxCaptureId</span></code> returns only the largest capture ID for the associated query. These RPCs are intended to be used instead of the <code class="docutils literal notranslate"><span class="pre">/v1/data-buffer/daq-data/</span></code> endpoint.</p> </section> <section id="spot-arm"> <h4>Spot Arm<a class="headerlink" href="#spot-arm" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>The field, <code class="docutils literal notranslate"><span class="pre">disable_velocity_limiting</span></code>, has been added to the <code class="docutils literal notranslate"><span class="pre">ArmCartesianCommand</span></code> message. Setting this field to <code class="docutils literal notranslate"><span class="pre">true</span></code> <strong>disables</strong> protections that prevent the arm from moving unexpectedly fast. Users must exercise extreme caution when setting this field to <code class="docutils literal notranslate"><span class="pre">true</span></code>.</p></li> <li><p>The field, <code class="docutils literal notranslate"><span class="pre">disable_safety_check</span></code>, has been added to the <code class="docutils literal notranslate"><span class="pre">ArmImpedanceCommand</span></code> message. Setting this field to <code class="docutils literal notranslate"><span class="pre">true</span></code> <strong>disables</strong> the cancellation of an arm trajectory for unsafe behaviors. Users must exercise extreme caution when setting this field to <code class="docutils literal notranslate"><span class="pre">true</span></code>.</p></li> <li><p>A new enum value, <code class="docutils literal notranslate"><span class="pre">STATUS_TRAJECTORY_CANCELLED</span></code>, has been added to the <code class="docutils literal notranslate"><span class="pre">Feedback</span></code> message of <code class="docutils literal notranslate"><span class="pre">ArmImpedanceCommand</span></code>. This feedback status indicates whether an arm instability was detected, and if it was detected, the command is cancelled. This new status may be useful for debugging purposes.</p></li> </ul> </section> <section id="network-compute-bridge"> <h4>Network Compute Bridge<a class="headerlink" href="#network-compute-bridge" title="Permalink to this heading"></a></h4> <p>A new enum value, <code class="docutils literal notranslate"><span class="pre">NETWORK_COMPUTE_STATUS_ANALYSIS_FAILED</span></code>, has been added to the <code class="docutils literal notranslate"><span class="pre">NetworkComputeStatus</span></code> enum. If the Network Compute Bridge Worker fails to process the input image for some reason (e.g., it was blurry), the Worker may use this status to indicate that the action should be retried. If the action is part of an autowalk, the <code class="docutils literal notranslate"><span class="pre">retry_count</span></code> in the <code class="docutils literal notranslate"><span class="pre">FailureBehavior</span></code> message must be &gt; 0.</p> </section> <section id="service-customization"> <h4><a class='reference internal' href='/docs/concepts/service_customization'><span class="doc">Service Customization</span></a><a class="headerlink" href="#service-customization" title="Permalink to this heading"></a></h4> <p>Our <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/service_customization_helpers'><span class="doc">service customization helpers</span></a> now include more helper functions, including:</p> <ul class="simple"> <li><p>Generation of specs from a set of Python-native objects as arguments. See <code class="docutils literal notranslate"><span class="pre">make_list_param_spec</span></code> for an example.</p></li> <li><p>Conversions to Python-native values for <code class="docutils literal notranslate"><span class="pre">DictParams</span></code>, <code class="docutils literal notranslate"><span class="pre">ListParams</span></code>, and <code class="docutils literal notranslate"><span class="pre">OneOfParams</span></code>. See <code class="docutils literal notranslate"><span class="pre">dict_params_to_dict</span></code> for an example.</p></li> <li><p>Generation of default parameter values from a parameter spec. See <code class="docutils literal notranslate"><span class="pre">double_spec_to_default</span></code> for an example.</p></li> <li><p><a class='reference external' href='/docs/concepts/service_customization#parameter-coercion'>Value coercion</a>, which allows you to gracefully handle errors from parameter values being out of spec. See <code class="docutils literal notranslate"><span class="pre">int_param_coerce_to</span></code> for an example of this, although one is more likely to use <code class="docutils literal notranslate"><span class="pre">dict_param_coerce_to</span></code>.</p></li> </ul> </section> <section id="id33"> <h4>Choreography<a class="headerlink" href="#id33" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Added <code class="docutils literal notranslate"><span class="pre">GetChoreographySequence</span></code> RPC to request the full sequence proto with a given name from Spot.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">ChoreographyTimeAdjust</span></code> RPC to slightly modify the start time of the next <code class="docutils literal notranslate"><span class="pre">ExecuteChoreography</span></code> RPC request that will be received by the robot in the future.</p></li> </ul> </section> <section id="safety-related-stopping-function"> <h4>Safety-Related Stopping Function<a class="headerlink" href="#safety-related-stopping-function" title="Permalink to this heading"></a></h4> <p>Added <code class="docutils literal notranslate"><span class="pre">ResetSafetyStop</span></code> RPC for Safety-Related Stopping Function (SRSF) compatible robots. Robots equipped with this feature will be listed as Safety-Related Stopping Function (SRSF) “Enabled” under the hardware information section found in the “About” page on the robot’s admin console.</p> </section> <section id="id34"> <h4>GraphNav<a class="headerlink" href="#id34" title="Permalink to this heading"></a></h4> <p>New <a class='reference external' href='/docs/concepts/autonomy/graphnav_area_callbacks#configuring-behavior-for-a-callback'>configuration options</a> have been added to Area Callbacks to specify GraphNav’s behavior with respect to blockages, impairment, entities, and stopping poses for callback regions.</p> </section> </section> <section id="id35"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id35" title="Permalink to this heading"></a></h3> <p>Clients are now configured with a default 5s keep-alive time, which triggers a faster reconnect with the service, when the network connection goes down.</p> <p>Lease update change: ignore failed old leases in the case the wallet contains the new lease.</p> <p>A new <code class="docutils literal notranslate"><span class="pre">SystemState</span></code> message that includes the temperature data for the robot’s motors has been added to the <code class="docutils literal notranslate"><span class="pre">RobotState</span></code> message. This new message is expected to expand in the future. The documentation for the <code class="docutils literal notranslate"><span class="pre">Kinematic</span> <span class="pre">State</span></code> message in <a class='reference external' href='/protos/bosdyn/api/proto_reference#bosdyn-api-robot-state-proto'>robot_state.proto</a> has been improved.</p> <p>The SpotCam <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_cam/compositor'><span class="doc">CompositorClient</span></a> now sets both the <code class="docutils literal notranslate"><span class="pre">coords</span></code> (deprecated in v3.3) and <code class="docutils literal notranslate"><span class="pre">meter</span></code> fields for backwards compatibility purposes in the <code class="docutils literal notranslate"><span class="pre">set_ir_meter_overlay</span></code> and <code class="docutils literal notranslate"><span class="pre">set_ir_meter_overlay_async</span></code> methods.</p> <p>In the SpotCam <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/spot_cam/ptz'><span class="doc">PtzClient</span></a>, <code class="docutils literal notranslate"><span class="pre">focus_mode</span></code> overrides <code class="docutils literal notranslate"><span class="pre">distance</span></code> in the <code class="docutils literal notranslate"><span class="pre">set_ptz_focus_state</span></code> and <code class="docutils literal notranslate"><span class="pre">set_ptz_focus_state_async</span></code> methods, so long as it is not set to <code class="docutils literal notranslate"><span class="pre">None</span></code>.</p> <p>Two new helper functions have been added to the <code class="docutils literal notranslate"><span class="pre">Vec3</span></code> class in <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/math_helpers'><span class="doc">math_helpers.py</span></a>, namely <code class="docutils literal notranslate"><span class="pre">to_numpy</span></code> and <code class="docutils literal notranslate"><span class="pre">from_numpy</span></code>. These functions may be used to convert back and forth between <code class="docutils literal notranslate"><span class="pre">Vec3</span></code> and numpy arrays.</p> <p>The <code class="docutils literal notranslate"><span class="pre">get_info</span></code> method in the <a class='reference internal' href='/python/bosdyn-mission/src/bosdyn/mission/client'><span class="doc">Mission Client</span></a> now supports very large missions which would have previously exceeded the maximum protobuf size. If the robot software version is such that the <code class="docutils literal notranslate"><span class="pre">GetInfoAsChunks</span></code> RPC is unimplemented, <code class="docutils literal notranslate"><span class="pre">get_info</span></code> falls back to the <code class="docutils literal notranslate"><span class="pre">GetInfo</span></code> RPC instead.</p> <p>For non-Core I/O payloads, it is now recommended to <a class='reference internal' href='/python/examples/self_registration/readme'><span class="doc">authenticate and register payloads</span></a> by generating a payload credentials file with a unique GUID and secret. The <code class="docutils literal notranslate"><span class="pre">read_or_create_payload_credentials</span></code> and <code class="docutils literal notranslate"><span class="pre">add_payload_credentials_file_argument</span></code> <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/util'><span class="doc">helper functions</span></a> assist with doing this. Core I/O Extensions should continue reading the existing on-disk file, located at <code class="docutils literal notranslate"><span class="pre">/opt/payload_credentials/payload_guid_and_secret</span></code>.</p> <p>GraphNav will no longer restart an Area Callback in the middle of a region if it re-routes. It will instead call a <a class='reference external' href='/docs/concepts/autonomy/graphnav_area_callbacks#handling-re-routing'>new Area Callback RPC</a> to inform the callback of the change.</p> <p>Published robot state messages previously contained kinematic information for a non-existent HR0 joint on Spot’s arm, set to all zeros. This has been removed and the published kinematic information now only contains existing joints. The number of published joints will be one less than on releases &lt; 4.0. Customers storing local copies of Spot URDF files may need to reacquire them from the robot after updating to 4.0.</p> </section> <section id="id36"> <h3>Deprecations<a class="headerlink" href="#id36" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>The protos in the <code class="docutils literal notranslate"><span class="pre">bosdyn-choreography-protos</span></code> package have been moved into <a class="reference external" href="https://pypi.org/project/bosdyn-api/">bosdyn-api</a>; <code class="docutils literal notranslate"><span class="pre">bosdyn-choreography-protos</span></code> is now an empty package that just depends on <code class="docutils literal notranslate"><span class="pre">bosdyn-api</span></code>.</p></li> <li><p>The <code class="docutils literal notranslate"><span class="pre">number_of_steps</span></code> in the <code class="docutils literal notranslate"><span class="pre">Staircase</span></code> message is deprecated and replaced by the length of the <code class="docutils literal notranslate"><span class="pre">steps</span></code> field in the same message (<code class="docutils literal notranslate"><span class="pre">Staircase</span></code>).</p></li> <li><p>The <code class="docutils literal notranslate"><span class="pre">pixel_to_camera_space</span></code> method in the <code class="docutils literal notranslate"><span class="pre">ImageClient</span></code> class has been updated such that the <code class="docutils literal notranslate"><span class="pre">image_proto</span></code> argument should now be of type <code class="docutils literal notranslate"><span class="pre">image_pb2.ImageSource</span></code> (previously <code class="docutils literal notranslate"><span class="pre">image_pb2.Image</span></code>). If the method is called with an <code class="docutils literal notranslate"><span class="pre">image_proto</span></code> argument of type <code class="docutils literal notranslate"><span class="pre">image_pb2.ImageCaptureAndSource</span></code> or <code class="docutils literal notranslate"><span class="pre">image_pb2.ImageResponse</span></code>, a warning message is logged.</p></li> <li><p><strong>Network Compute Bridge</strong>: The <code class="docutils literal notranslate"><span class="pre">object_in_image</span></code> in the <code class="docutils literal notranslate"><span class="pre">NetworkComputeResponse</span></code> message is deprecated and replaced by <code class="docutils literal notranslate"><span class="pre">object_in_image</span></code> in <code class="docutils literal notranslate"><span class="pre">OutputImage</span></code></p></li> <li><p><strong>Autowalk</strong>: The <code class="docutils literal notranslate"><span class="pre">root_id</span></code> in the <code class="docutils literal notranslate"><span class="pre">ElementIdentifiers</span></code> message is deprecated and replaced by <code class="docutils literal notranslate"><span class="pre">navigation_id</span></code> in the same message.</p></li> <li><p><strong>Mission Prompt</strong>: The <code class="docutils literal notranslate"><span class="pre">options</span></code> list in <code class="docutils literal notranslate"><span class="pre">Prompt</span></code> message is deprecated and replaced by the wrapped <code class="docutils literal notranslate"><span class="pre">OptionsList</span> <span class="pre">options_list</span></code> field to support answer specification by both <code class="docutils literal notranslate"><span class="pre">OptionsList</span> <span class="pre">options</span></code> and <code class="docutils literal notranslate"><span class="pre">DictParam.Spec</span> <span class="pre">custom_params</span></code>.</p></li> <li><p><strong>Mission Service</strong>: the <code class="docutils literal notranslate"><span class="pre">impl</span></code> field (type <code class="docutils literal notranslate"><span class="pre">google.protobuf.Any</span></code>) in <code class="docutils literal notranslate"><span class="pre">type</span></code> oneof</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">bosdyn.client.robot_id.create_strict_version()</span></code> uses deprecated <code class="docutils literal notranslate"><span class="pre">distutils</span></code> functionality. Use <code class="docutils literal notranslate"><span class="pre">bosdyn.client.robot_id.version_tuple()</span></code> instead.</p></li> <li><p>The kinematic_state’s transforms_snapshot now uses “arm0.link_wr1” instead of “link_wr1” for the name of the frame attached to the SpotArm’s wr1 link. This is (1) the name used in the URDF description of the robot and (2) the name used in the image service snapshots. We will continue to publish the kinematic_state’s snapshot with the deprecated name in the 4.0 release, but it will be removed in a future release.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">bosdyn.client</span></code> command <code class="docutils literal notranslate"><span class="pre">become-estop</span></code> is deprecated and is now a subcommand under <code class="docutils literal notranslate"><span class="pre">estop</span></code></p></li> </ul> <section id="id37"> <h4>Orbit (formerly Scout)<a class="headerlink" href="#id37" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>The package <code class="docutils literal notranslate"><span class="pre">bosdyn-scout</span></code> is deprecated and replaced with <a class="reference external" href="https://pypi.org/project/bosdyn-orbit/">bosdyn-orbit</a>, due to Scout being renamed to Orbit. As a result, the pre-existing examples in <code class="docutils literal notranslate"><span class="pre">../python/examples/scout/</span></code> are moved to <code class="docutils literal notranslate"><span class="pre">../python/examples/orbit/</span></code>. All examples use <code class="docutils literal notranslate"><span class="pre">bosdyn-orbit</span></code> instead of <code class="docutils literal notranslate"><span class="pre">bosdyn-scout</span></code>.</p></li> <li><p>The <code class="docutils literal notranslate"><span class="pre">/login</span></code> <a href='/docs/orbit/docs'>Orbit API</a> endpoint is now deprecated. It has been functionally replaced by the <code class="docutils literal notranslate"><span class="pre">/api_token/authenticate</span></code> endpoint. This endpoint allows an admin user to generate an API Access Token with specific permissions for use against the Orbit API. A corresponding <code class="docutils literal notranslate"><span class="pre">authenticate_with_api_token</span></code> helper function in <a class="reference external" href="https://pypi.org/project/bosdyn-orbit/">bosdyn-orbit</a>’s client has replaced 3.3’s <code class="docutils literal notranslate"><span class="pre">authenticate_with_password</span></code> function.</p></li> <li><p>The <code class="docutils literal notranslate"><span class="pre">/missions</span></code> set of <a href='/docs/orbit/docs'>Orbit API</a> endpoints are now deprecated in favor of the <code class="docutils literal notranslate"><span class="pre">/site_walks</span></code> endpoints. Corresponding helper functions such as <code class="docutils literal notranslate"><span class="pre">get_site_walks</span></code> in <a class="reference external" href="https://pypi.org/project/bosdyn-orbit/">bosdyn-orbit</a>’s client support this.</p></li> </ul> </section> </section> <section id="id38"> <h3>Known Issues<a class="headerlink" href="#id38" title="Permalink to this heading"></a></h3> <section id="new-in-4-0"> <h4>New in 4.0<a class="headerlink" href="#new-in-4-0" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>There are circular imports between bosdyn/api/gps/registration.proto and bosdyn/api/world_object.proto. This may break proto code generation for some languages (e.g., Go).</p></li> </ul> </section> <section id="preexisting-but-undiscovered-prior-to-4-0-0"> <h4>Preexisting, but undiscovered prior to 4.0.0<a class="headerlink" href="#preexisting-but-undiscovered-prior-to-4-0-0" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>The /v1/data-buffer/daq-data/ REST endpoint sometimes fails to return all of the requested data. Two workarounds are to (1) modify the query parameters such that a subset of data is returned or (2) use the new QueryStoredCaptures RPC.</p></li> </ul> </section> <section id="id39"> <h4>Preexisting<a class="headerlink" href="#id39" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Same as 3.3.2.</p></li> </ul> </section> </section> <section id="id40"> <h3>Sample Code<a class="headerlink" href="#id40" title="Permalink to this heading"></a></h3> <section id="id41"> <h4>New<a class="headerlink" href="#id41" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p><a class='reference internal' href='/python/examples/arm_freeze/readme'><span class="doc">Arm Freeze </span></a>: Command Spot’s end-effector to hold a pose expressed in the ODOM and BODY frames, demonstrating the differences of holding a pose relative to and expressed in fixed versus moving frames.</p></li> <li><p><a class='reference internal' href='/python/examples/arm_trajectory/readme'><span class="doc">Long Arm Cartesian Trajectory</span></a>: Show how to follow a long cartesian trajectory with the arm.</p></li> <li><p><a class='reference internal' href='/python/examples/orbit/schedule_mission/readme'><span class="doc">Orbit Schedule Mission</span></a>: An example to show how to create, edit, and delete a mission calendar event using Orbit web API.</p></li> <li><p><a class='reference internal' href='/python/examples/orbit/runs_response/readme'><span class="doc">Orbit Runs Response</span></a>: Tutorial to show how to use the Orbit client to get runs response and process data through the Orbit web API.</p></li> <li><p><a class='reference internal' href='/python/examples/orbit/send_robot_back_to_dock/readme'><span class="doc">Orbit Send Robot Back to Dock</span></a>: An example to show how to send robot back to the dock using Orbit web API.</p></li> <li><p><a class='reference internal' href='/python/examples/orbit/toggle_mission_based_on_weather/readme'><span class="doc">Orbit Disable/Enable Calendar Events Based on Weather</span></a>: An example to show how to enable or disable calendar events based on weather using Orbit web API.</p></li> <li><p><a class='reference internal' href='/python/examples/orbit/webhook/readme'><span class="doc">Orbit Webhooks</span></a>: An example to show how to utilize webhooks using Orbit web API to obtain data.</p></li> <li><p><a class='reference internal' href='/python/examples/spot_cam/readme'><span class="doc">SpotCam Video Recording</span></a>: An example that shows how to record a video using SpotCam.</p></li> <li><p><a class='reference internal' href='/python/examples/service_customization/custom_parameters_data_acquisition/readme'><span class="doc">DAQ Plugin with Custom Parameters</span></a>: An example that shows how to use custom parameters with a DAQ plugin.</p></li> <li><p><a class='reference internal' href='/python/examples/reset_safety_stop/readme'><span class="doc">Reset Safety Stop</span></a>: An example that shows how to reset the primary and redundant safety stops on a Safety-Related Stopping Function (SRSF) configured robot. Robots equipped with this feature will be listed as SRSF “Enabled” under the hardware information section found in the “About” page on the robot’s admin console.</p></li> <li><p><a class='reference internal' href='/python/examples/metrics_over_coreio/readme'><span class="doc">Metrics Over CoreIO</span></a>: An example that shows to upload metrics to Boston Dynamics via CoreIO LTE or WiFi (using a WiFi dongle).</p></li> <li><p><a class='reference internal' href='/python/examples/graph_nav_view_gps/readme'><span class="doc">View GraphNav Map in a Web Browser</span></a>: An example that shows how to view a GraphNav map on Open Street Maps in a Web Browser.</p></li> <li><p><a class='reference internal' href='/python/examples/gps_service/readme'><span class="doc">GPS Listener</span></a>: An example that shows how to consume data from a GPS receiver and send it to Spot. The example includes configurations for the Trimble SPS986 and Leica GA03 receivers, though any GPS receiver that publishes the required information could hypothetically be used (your mileage may vary based upon the receiver’s performance).</p></li> <li><p><a class='reference internal' href='/python/examples/extract_images_from_walk/readme'><span class="doc">Extract Images from Walk</span></a>: An example that shows how to extract all of the record-time images embedded in a .walk and create a .pptx slideshow containing them.</p></li> <li><p><a class='reference internal' href='/python/examples/data_acquisition_service/signals_coreio_modem_plugin/readme'><span class="doc">Signals CoreIO Modem</span></a>: An example that gets modem data from the CoreIO and sends it to the robot in such a way (using the Signals API) that it is displayed on the tablet and Orbit in real-time.</p></li> <li><p><a class='reference internal' href='/python/examples/extensions/readme'><span class="doc">Extensions</span></a>: A couple of <a class='reference external' href='/docs/payload/docker_containers#helper-scripts'>helper scripts</a> have been introduced to help create CORE I/O and Scout Extensions. These can even be used to package any other Dockerized example into an Extension.</p></li> </ul> </section> <section id="id42"> <h4>Updated<a class="headerlink" href="#id42" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p><a class='reference internal' href='/python/examples/area_callback/readme'><span class="doc">Area Callbacks</span></a>: Updated to set the new callback configuration parameters.</p></li> <li><p><a class='reference internal' href='/python/examples/orbit/hello_orbit/readme'><span class="doc">Orbit Hello</span></a>: Updated to use <code class="docutils literal notranslate"><span class="pre">bosdyn-orbit</span></code> instead of <code class="docutils literal notranslate"><span class="pre">bosdyn-scout</span></code>.</p></li> <li><p><a class='reference internal' href='/python/examples/orbit/export_run_archives/readme'><span class="doc">Orbit Export Run Archives</span></a>: Updated to use <code class="docutils literal notranslate"><span class="pre">bosdyn-orbit</span></code> instead of <code class="docutils literal notranslate"><span class="pre">bosdyn-scout</span></code>.</p></li> <li><p><a class='reference internal' href='/python/examples/fan_command/readme'><span class="doc">Fan Control Mission Service</span></a>: FanOffServicer now implements GetRemoteMissionServiceInfo, which prevents a harmless message from being printed when the example is run.</p></li> <li><p><a class='reference internal' href='/python/examples/graph_nav_command_line/readme'><span class="doc">GraphNav Command Line</span></a>: Added support for navigating the robot to a given latitude/longitude/yaw. Some new helper functions include <code class="docutils literal notranslate"><span class="pre">_clear_graph_and_cache</span></code>, <code class="docutils literal notranslate"><span class="pre">_navigate_to_gps_coords</span></code>, <code class="docutils literal notranslate"><span class="pre">_parse_gps_goal_from_args</span></code>, and <code class="docutils literal notranslate"><span class="pre">_navigate_to_parsed_gps_coords</span></code>.</p></li> <li><p><a class='reference internal' href='/python/examples/graph_nav_command_line/readme'><span class="doc">GraphNav View Map</span></a>: Added two command-line arguments that control whether text for each waypoint and world object should be shown.</p></li> <li><p><a class='reference internal' href='/python/examples/arm_impedance_control/readme'><span class="doc">Arm Impedance Control</span></a>: Updated to use “arm0.link_wr1” instead of “link_wr1” for the name of the WR1 frame.</p></li> <li><p><a class='reference internal' href='/python/examples/bddf_download/readme'><span class="doc">BDDF Download</span></a>: Updated documentation to indicate that (at most) 1 hour of data may be requested. If the user requests more than 1 hour, an error is now bubbled up through the GUI.</p></li> <li><p><a class='reference internal' href='/python/examples/network_compute_bridge/fire_extinguisher_server/readme'><span class="doc">Network Compute Bridge Worker (Fire Extinguisher)</span></a>: The base image in Dockerfile.l4t has been updated to account for v4.0 CoreIO running on Jetpack 5.</p></li> <li><p><a class='reference internal' href='/python/examples/network_request_callback/readme'><span class="doc">Network Request Callback</span></a>: The base image in Dockerfile.coreio has been updated to account for a dependency that requires Python 3.10. NetworkRequestCallbackServicer now implements GetRemoteMissionServiceInfo, which prevents a harmless message from being printed when the example is run.</p></li> <li><p><a class='reference internal' href='/python/examples/post_docking_callbacks/readme'><span class="doc">Post-Docking Callback (Cloud Upload)</span></a>: FanOffServicer now implements GetRemoteMissionServiceInfo, which prevents a harmless message from being printed when the example is run.</p></li> <li><p><a class='reference internal' href='/python/examples/remote_mission_service/readme'><span class="doc">Power Off Mission Service Callback</span></a>: PowerOffServicer now implements GetRemoteMissionServiceInfo, which prevents a harmless message from being printed when the example is run.</p></li> <li><p><a class='reference internal' href='/python/examples/ricoh_theta/readme'><span class="doc">Ricoh Theta</span></a>: The base image in Dockerfile.l4t has been updated to account for v4.0 CoreIO running on Jetpack 5. When no password argument is supplied, the default password for the Ricoh Theta now includes only the numeric portion of the Ricoh Theta SSID (as described in the Ricoh Theta documentation).</p></li> <li><p><a class='reference internal' href='/python/examples/service_customization/custom_parameter_image_server/readme'><span class="doc">Custom Parameter Image Server</span></a>: The base image in Dockerfile.l4t has been updated to account for v4.0 CoreIO running on Jetpack 5.</p></li> <li><p><a class='reference internal' href='/python/examples/service_customization/custom_parameter_ncb_worker/readme'><span class="doc">Custom Parameter Network Compute Bridge Worker</span></a>: The base image in Dockerfile.l4t has been updated to account for v4.0 CoreIO running on Jetpack 5. Specific instructions for how to build the corresponding Spot Extension are now included.</p></li> <li><p><a class="reference external" href="https://github.com/boston-dynamics/spot-sdk/blob/577c45e26241ba1cbbbdf3d85013b2a5b2b52888/python/examples/spot_detect_and_follow/README">Detect and Follow</a>: The base image in Dockerfile.l4t has been updated to account for v4.0 CoreIO running on Jetpack 5. Specific instructions for how to build the corresponding Spot Extension are now included.</p></li> <li><p><a class='reference internal' href='/python/examples/tester_programs/readme'><span class="doc">DAQ Plugin Tester</span></a>: The plugin now tests for whether the DAQ plugin is publishing live data.</p></li> <li><p><a class='reference internal' href='/docs/python/fetch_tutorial/fetch1'><span class="doc">Fetch Tutorial</span></a>: The example has been updated such that it no longer uses the <code class="docutils literal notranslate"><span class="pre">trajectory_command</span></code> method, which has been removed. The base image in Dockerfile.l4t has been updated to account for v4.0 CoreIO running on Jetpack 5.</p></li> <li><p><a class='reference internal' href='/python/examples/self_registration/readme'><span class="doc">Self Registration</span></a>: Updated to generate and read a unique GUID and secret from a payload credentials file, as is now recommended for payload authentication.</p></li> <li><p><a class='reference internal' href='/python/examples/payloads/readme'><span class="doc">Payloads</span></a>: Updated to generate and read a unique GUID and secret from a payload credentials file, as is now recommended for payload authentication.</p></li> <li><p><a class='reference internal' href='/docs/concepts/data_acquisition_thermal_raw'><span class="doc">SpotCam - Opening .pgm/.raw Files</span></a>: The example code for opening SpotCam .pgm and/or .raw files has been updated to also work for files downloaded from the tablet and/or Scout. Previously, it only worked for files downloaded from the SpotCam.</p></li> </ul> <p><a class='reference internal' href='/python/examples/mission_question_answerer/readme'><span class="doc">Mission question answerer (updated)</span></a></p> </section> </section> </section> <section id="id43"> <h2>3.3.1<a class="headerlink" href="#id43" title="Permalink to this heading"></a></h2> <section id="upcoming-removals"> <h3>Upcoming Removals<a class="headerlink" href="#upcoming-removals" title="Permalink to this heading"></a></h3> <p>Several protobuf fields or services are scheduled to be removed in the 4.0 release. Please ensure that they are no longer used within your code.</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">LogAnnotationService</span></code></p></li> <li><p>Auth application token.</p></li> <li><p>Robot commands: non-synchronized mobility commands. Top-level feedback messages.</p></li> <li><p>Graph Nav map edge annotations: <code class="docutils literal notranslate"><span class="pre">vel_limit</span></code>, <code class="docutils literal notranslate"><span class="pre">ground_mu_hint</span></code>, <code class="docutils literal notranslate"><span class="pre">grated_floor</span></code></p></li> <li><p>SpotCheck feedback: <code class="docutils literal notranslate"><span class="pre">foot_height_results</span></code> and <code class="docutils literal notranslate"><span class="pre">leg_pair_results</span></code></p></li> </ul> </section> <section id="id44"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id44" title="Permalink to this heading"></a></h3> <p>In the upcoming release 4.0, we plan to change the encoding for real-valued fields in local grids to RAW instead of RLE (Run-Length Encoded) and provide client helpers for decoding. Make sure your code handles the <code class="docutils literal notranslate"><span class="pre">encoding</span></code> field in <code class="docutils literal notranslate"><span class="pre">LocalGridResponse</span></code> correctly.</p> <p>Updated Data Acquisition system diagram and Network Compute Bridge documentation.</p> <p>Added LogStatus documentation in the list of robot services.</p> <p><code class="docutils literal notranslate"><span class="pre">min_timeout</span></code> value in <code class="docutils literal notranslate"><span class="pre">AcquireDataRequest</span></code>:</p> <ul class="simple"> <li><p>Added as an argument in Data Acquisition Service SDK client.</p></li> <li><p>Updated mission service to specify the field in requests to Data Acquisition Service.</p></li> <li><p>Propagated to RPCs sent to the Image and Network Compute Bridge services.</p></li> </ul> <p>Added <code class="docutils literal notranslate"><span class="pre">path_following_mode</span></code> and <code class="docutils literal notranslate"><span class="pre">ground_clutter_mode</span></code> arguments in <code class="docutils literal notranslate"><span class="pre">most_restrictive_travel_params</span></code> method in <code class="docutils literal notranslate"><span class="pre">boston.mission</span></code> util.py (found <a class='reference internal' href='/python/bosdyn-mission/src/bosdyn/mission/readme'><span class="doc">here</span></a>).</p> <p>Added <code class="docutils literal notranslate"><span class="pre">get_run_archives_by_id</span></code> method in <a class='reference internal' href='/python/bosdyn-scout/src/bosdyn/scout/readme'><span class="doc">Scout client</span></a>.</p> <p>The Inverse Kinematics Service is now available on robots without arms. Only body-mounted tools are supported on such robots.</p> </section> <section id="id45"> <h3>Known Issues<a class="headerlink" href="#id45" title="Permalink to this heading"></a></h3> <p>Same as 3.3.0</p> </section> <section id="id46"> <h3>Sample Code<a class="headerlink" href="#id46" title="Permalink to this heading"></a></h3> <section id="id47"> <h4>New<a class="headerlink" href="#id47" title="Permalink to this heading"></a></h4> <p><a class='reference internal' href='/python/examples/log_status/readme'><span class="doc">Log Status</span></a>: Show how to query the log status service.</p> <p><a class='reference internal' href='/python/examples/orbit/export_run_archives/readme'><span class="doc">Scout Export Run Archives</span></a>: Show how to export run archives from Scout for the recent completed missions.</p> <p><a class='reference internal' href='/python/examples/network_compute_bridge/readme'><span class="doc">Simple Alert Server</span></a>: Additional Network Compute Bridge worker that generates responses with alerts.</p> </section> <section id="id48"> <h4>Updated<a class="headerlink" href="#id48" title="Permalink to this heading"></a></h4> <p><a class='reference internal' href='/python/examples/edit_autowalk/readme'><span class="doc">Edit Autowalk</span></a>: Fixed documentation and improved arguments accepted by the example application so the walk filename is not assumed to be autogenerated.</p> <p><a class='reference internal' href='/python/examples/network_compute_bridge/fire_extinguisher_server/readme'><span class="doc">Fire Extinguisher Network Compute Bridge Worker</span></a>: Added <code class="docutils literal notranslate"><span class="pre">min_confidence</span></code> parameter and fixed output images so they are displayed on the tablet.</p> <p><a class='reference internal' href='/python/examples/network_compute_bridge/readme'><span class="doc">Network Compute Bridge</span></a>: Updated requirements files and docker instructions.</p> <p><a class='reference internal' href='/python/examples/replay_mission/readme'><span class="doc">Replay Mission</span></a>: Fixed documentation and improved arguments accepted by the example application so the walk filename is not assumed to be autogenerated. Updated example to use Autowalk service to load Autowalk missions.</p> </section> </section> </section> <section id="id49"> <h2>3.3.0<a class="headerlink" href="#id49" title="Permalink to this heading"></a></h2> <section id="id50"> <h3>Upcoming Removals<a class="headerlink" href="#id50" title="Permalink to this heading"></a></h3> <p>Several protobuf fields or services are scheduled to be removed in the 4.0 release. Please ensure that they are no longer used within your code.</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">LogAnnotationService</span></code></p></li> <li><p>Auth application token.</p></li> <li><p>Robot commands: non-synchronized mobility commands. Top-level feedback messages.</p></li> <li><p>Graph Nav map edge annotations: <code class="docutils literal notranslate"><span class="pre">vel_limit</span></code>, <code class="docutils literal notranslate"><span class="pre">ground_mu_hint</span></code>, <code class="docutils literal notranslate"><span class="pre">grated_floor</span></code></p></li> <li><p>SpotCheck feedback: <code class="docutils literal notranslate"><span class="pre">foot_height_results</span></code> and <code class="docutils literal notranslate"><span class="pre">leg_pair_results</span></code></p></li> </ul> </section> <section id="id51"> <h3>New Features<a class="headerlink" href="#id51" title="Permalink to this heading"></a></h3> <section id="new-service-inverse-kinematics"> <h4>New Service - Inverse Kinematics<a class="headerlink" href="#new-service-inverse-kinematics" title="Permalink to this heading"></a></h4> <p>Users can make reachability and stance-selection queries for reaching to locations with the arm or pointing a body-mounted sensor. Requests can specify pose or gaze targets for a wrist-mounted or body-mounted tool, with a variety of options for body, arm, and stance configuration. The service responds with a full robot configuration (and frame snapshot including body, feet, and tool) that satisfies the specifications of the request, or an indication that no solution was found.</p> <p>This service is only available if an arm is attached to the robot.</p> </section> <section id="new-service-logstatus"> <h4>New Service - LogStatus<a class="headerlink" href="#new-service-logstatus" title="Permalink to this heading"></a></h4> <p>Use the <a class='reference external' href='/docs/concepts/robot_services#log-status'>LogStatus service</a> to start and terminate experiment or retro logs. These logs can be used with Boston Dynamics support to diagnose problems with the robot or its systems.</p> </section> <section id="id52"> <h4>Service Customization<a class="headerlink" href="#id52" title="Permalink to this heading"></a></h4> <p>When writing a service to extend the capabilities of the robot, there are now additional fields and messages to allow the service to specify which and what kind of parameters that the service can accept with its requests. These parameters can be modified by end users via tablet operation or Scout. The services that support this customization are</p> <ul class="simple"> <li><p>Image services</p></li> <li><p>Data Acquisition plugins</p></li> <li><p>Network Compute Bridge workers</p></li> <li><p>Remote Mission callbacks</p></li> <li><p>Area Callbacks</p></li> </ul> <p>More detailed descriptions of how to specify these parameters can be found in the <a class='reference internal' href='/docs/concepts/service_customization'><span class="doc">service customization documentation</span></a>.</p> </section> <section id="arm-and-manipulation"> <h4>Arm and Manipulation<a class="headerlink" href="#arm-and-manipulation" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p><strong>Constrained Manipulation</strong>: Users can put constrained manipulation in velocity control or position control of the task space. Previously, all constrained manipulation motions were velocity controlled, meaning that users would for example specify the velocity of turning a crank. In position control mode, the user can specify target positions, such as the angle or distance to move the object, as well as acceleration limits to obey. Previously, the internal estimator was always reset with a new request. Now users can disable that resetting, for cases where the task configuration has not changed from the previous request.</p></li> <li><p><strong>Door opening</strong>: Added new <code class="docutils literal notranslate"><span class="pre">STATUS_STALLED</span></code> and <code class="docutils literal notranslate"><span class="pre">STATUS_NOT_DETECTED</span></code> <a class='reference external' href='/protos/bosdyn/api/proto_reference#doorcommand-feedback-status'>error statuses</a>, and <code class="docutils literal notranslate"><span class="pre">DoorCommand.Feedback</span></code> reports progress through the door.</p></li> <li><p><strong>Gripper Camera</strong>: New options added for controlling white balance, gamma, and sharpness.</p></li> <li><p>Added many pieces of information to <code class="docutils literal notranslate"><span class="pre">ArmImpedanceCommand.Feedback</span></code>.</p></li> </ul> </section> <section id="id53"> <h4>Navigation<a class="headerlink" href="#id53" title="Permalink to this heading"></a></h4> <p><strong>No-Go Regions</strong>: Added the ability to apply user-defined rectangular obstacles to the foot and body obstacle maps.<br />A user can define rectangular regions in which the robot should not step, and/or rectangular regions the body should not enter, in addition to the standard obstacle mapping. By default, a User No-Go Region will add both a body obstacle, and a slightly expanded footstep obstacle to the respective obstacle maps. If this default behavior is not desired there are optional flags to designate the User No-Go Region as just a body obstacle or just a foot obstacle instead of both, and to remove the extra padding on the foot obstacle. These regions are added via the World Object Service, which now includes an <code class="docutils literal notranslate"><span class="pre">object_lifetime</span></code> field with the duration after which the obstacle expires.</p> <p><strong>Area Callbacks</strong> can raise a <code class="docutils literal notranslate"><span class="pre">PathBlocked</span></code> error to indicate that the region is blocked and graph nav should re-route. Area callbacks that control the robot through the region can now update the localization to the end of the region when they have successfully moved the robot through the region so that Graph Nav does not try to re-navigate the region.</p> <p><strong>Uploading Graphs</strong> has more validation steps and will report <code class="docutils literal notranslate"><span class="pre">STATUS_INVALID_GRAPH</span></code> under more scenarios. There is a new <code class="docutils literal notranslate"><span class="pre">ValidationStatus</span></code> to show the results of this process. Recoverable graph problems will not cause the load to fail, but will instead be reported as “warnings” in the <code class="docutils literal notranslate"><span class="pre">ValidationStatus</span></code> message.</p> <p><strong>Topology Processing</strong> (auto loop closure) is now much less aggressive about creating loop closures and will make fewer and better loop closures than before, with the exception of waypoints near docks which are more forgiving (to allow the robot to get back to the dock from more locations).</p> <p>If the robot gets stuck, it will report a “stuck reason” indicating which kind of failure resulted in getting stuck.</p> </section> <section id="id54"> <h4>Choreography<a class="headerlink" href="#id54" title="Permalink to this heading"></a></h4> <p>Added a new <code class="docutils literal notranslate"><span class="pre">ChoreographyCommand</span></code> RPC to support <a class='reference internal' href='/docs/concepts/choreography/custom_gait'><span class="doc">interactive choreography moves</span></a>.</p> <p>Added a new <code class="docutils literal notranslate"><span class="pre">ChoreographyStatus</span></code> RPC so that users can receive feedback on the dance state a robot is in and a robot’s progress in completing a dance or current move(s) in a dance.</p> <ul class="simple"> <li><p>Added <code class="docutils literal notranslate"><span class="pre">exit_state</span></code> field in <code class="docutils literal notranslate"><span class="pre">SequenceInfo</span></code> message to specify the exit transition state of the sequence.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">execution_id</span></code> field in <code class="docutils literal notranslate"><span class="pre">ExecuteChoreographyResponse</span></code> message with the unique ID for the execution.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">id</span></code> field in <code class="docutils literal notranslate"><span class="pre">MoveParams</span></code> message, set by the client or auto-assigned by the service, to be reported in the <code class="docutils literal notranslate"><span class="pre">ChoreographyStatusResponse</span></code> <code class="docutils literal notranslate"><span class="pre">ActiveMoves</span></code> field.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">custom_gait_params</span></code> and <code class="docutils literal notranslate"><span class="pre">leg_joint_params</span></code> fields in <code class="docutils literal notranslate"><span class="pre">MoveParams</span></code> object.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">is_looping</span></code> field in <code class="docutils literal notranslate"><span class="pre">MoveInfo</span></code> message.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">entrance_state</span></code> field in <code class="docutils literal notranslate"><span class="pre">ChoreographySequence</span></code> message to specify an explicit entrance state in the case where the first legs-track move accepts multiple entrance states.</p></li> <li><p>Animations now support more flexibility to adjusting timing, can specify whether the animation starts from a sit pose, or can specify that an Animation can be used for a custom gait.</p></li> </ul> </section> <section id="payloads"> <h4>Payloads<a class="headerlink" href="#payloads" title="Permalink to this heading"></a></h4> <p>New fields in the Payload proto enable a liveness check, similar to a service liveness check. The robot will periodically try to ping (ICMP) the payload to see if it is still connected.</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">liveness_timeout_secs</span></code>: How long payload can be unpingable before a liveness fault is raised.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">ipv4_address</span></code>: Address for the robot to ping the payload at.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">link_speed</span></code>: Expected ethernet speed negotiated.</p></li> </ul> <p>If present, the <code class="docutils literal notranslate"><span class="pre">ipv4_address</span></code> field will also be used to detect whether a payload is mounted to the front or rear payload port. If a payload preset has a label “mount_port:rear” and the payload is connected to the front port, it will not be displayed on the registration page. The same is true if there is a preset “mount_port:front” and the payload is connected to the rear port.</p> </section> <section id="images-and-data"> <h4>Images and Data<a class="headerlink" href="#images-and-data" title="Permalink to this heading"></a></h4> <p>Added the SpotCamAlignment action wrapper for aligning Spot Cam image captures.</p> <p>Images can be stored for Data Acquisition and RemoteGrpc elements in order to aid in editing walks.</p> <p>Updated the <code class="docutils literal notranslate"><span class="pre">IrMeterOverlay</span></code> Spot Cam message and added a new RPC to get the current overlay.</p> <p>Added new RPCs for setting and getting the focus state of the Spot Cam PTZ.</p> <p>Added exposure settings to the <code class="docutils literal notranslate"><span class="pre">StreamParams</span></code> message.</p> <p>New <code class="docutils literal notranslate"><span class="pre">AvailableModels</span></code> message to describe Network Compute Bridge models available for data acquisition capture.</p> <p>New unique <code class="docutils literal notranslate"><span class="pre">id</span></code> returned in <code class="docutils literal notranslate"><span class="pre">Store*</span></code> responses from the <code class="docutils literal notranslate"><span class="pre">DataAcquisitionStore</span></code> service. This id can be used in a <code class="docutils literal notranslate"><span class="pre">DataIdentifier</span></code> to uniquely identify a particular piece of stored data.</p> </section> <section id="robot-control"> <h4>Robot Control<a class="headerlink" href="#robot-control" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">ClearBehaviorFault</span></code> echos back the behavior fault if it was active at the time of request.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">ClearBehaviorFault</span></code> specifies a list of blocking hardware faults for an unclearable behavior fault.</p></li> <li><p>An absolute desired position and orientation of the robot’s body origin can now be specified when standing.</p></li> <li><p>Users can override the configured Leases and Params when issuing an Autoreturn <code class="docutils literal notranslate"><span class="pre">StartRequest</span></code>.</p></li> <li><p>A new <code class="docutils literal notranslate"><span class="pre">ImpairedStatus</span></code> value indicates when the entity detector (required for certain new avoidance behaviors) is not working.</p></li> </ul> </section> </section> <section id="id55"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id55" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>Mission blackboard state is now reported in the <code class="docutils literal notranslate"><span class="pre">NodeState</span></code> message.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">GraphNavClient.set_localization_full_response</span></code> added to return the full response.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">RecordingClient.start_recording_full</span></code> added to return the full response.</p></li> <li><p>The Robot object has <code class="docutils literal notranslate"><span class="pre">get_cached_hardware_hardware_configuration()</span></code> for checking the hardware configuration efficiently.</p></li> <li><p>The Robot object has an explicit <code class="docutils literal notranslate"><span class="pre">shutdown()</span></code> to stop any background threads it may be running.</p></li> <li><p>World objects can be added or deleted in bulk using the <code class="docutils literal notranslate"><span class="pre">send_add_mutation_requests()</span></code> and <code class="docutils literal notranslate"><span class="pre">send_delete_mutation_requests()</span></code> helpers.</p></li> <li><p>Uploading Graphs has more validation steps and will report <code class="docutils literal notranslate"><span class="pre">STATUS_INVALID_GRAPH</span></code> under more scenarios. There is a new <code class="docutils literal notranslate"><span class="pre">ValidationStatus</span></code> to show the results of this process. Recoverable graph problems will not cause the load to fail, but will instead be reported as warnings in the <code class="docutils literal notranslate"><span class="pre">ValidationStatus</span></code> message.</p></li> <li><p>Some mission RPCs could fail due to response message size limits when missions become very large. Newly added RPCs (LoadMissionAsChunks2, GetInfoAsChunks, GetMissionAsChunks) use streaming responses that are assembled into the proper response.</p></li> </ul> </section> <section id="dependencies"> <h3>Dependencies<a class="headerlink" href="#dependencies" title="Permalink to this heading"></a></h3> <p>The Python SDK now requires protobuf &gt;= 3.19.4</p> </section> <section id="id56"> <h3>Deprecations<a class="headerlink" href="#id56" title="Permalink to this heading"></a></h3> <p>The following will continue to work, but have been deprecated and may be removed in a future release.</p> <section id="networkcomputebridge"> <h4>NetworkComputeBridge<a class="headerlink" href="#networkcomputebridge" title="Permalink to this heading"></a></h4> <p>The NetworkComputeBridge Worker service has been re-worked to be more straightforward and provide additional options. The <code class="docutils literal notranslate"><span class="pre">NetworkCompute</span></code> RPC is deprecated from the NetworkComputeBridge Workers services; use the new <code class="docutils literal notranslate"><span class="pre">WorkerCompute</span></code> RPC instead.</p> <p>When calling the NetworkComputeBridge service, the <code class="docutils literal notranslate"><span class="pre">input_data</span></code> is deprecated in the <code class="docutils literal notranslate"><span class="pre">NetworkComputeRequest</span></code> message; use <code class="docutils literal notranslate"><span class="pre">input_data_bridge</span></code> instead. When using the <code class="docutils literal notranslate"><span class="pre">input_data_bridge</span></code> input, the following changes will apply to the <code class="docutils literal notranslate"><span class="pre">NetworkComputeResponse</span></code> output:</p> <ul class="simple"> <li><p>Deprecated <code class="docutils literal notranslate"><span class="pre">image_response</span></code> field; use <code class="docutils literal notranslate"><span class="pre">image_responses</span></code> instead.</p></li> <li><p>Deprecated <code class="docutils literal notranslate"><span class="pre">image_rotation_angle</span></code> field; The worker should handle rotation on its own.</p></li> <li><p>Deprecated the <code class="docutils literal notranslate"><span class="pre">alert_data</span></code> field; use <code class="docutils literal notranslate"><span class="pre">alert_data</span></code> in <code class="docutils literal notranslate"><span class="pre">OutputImage</span></code> instead.</p></li> <li><p>Deprecated <code class="docutils literal notranslate"><span class="pre">roi_output_data</span></code> field; support for non-image products will be added in a future release.</p></li> </ul> </section> <section id="deprecated-fields-and-values"> <h4>Deprecated fields and values<a class="headerlink" href="#deprecated-fields-and-values" title="Permalink to this heading"></a></h4> <p><strong>GripperCameraParam</strong>: Renamed <code class="docutils literal notranslate"><span class="pre">CameraMode</span></code> enum values.</p> <p><strong>Graph Nav</strong>: The <code class="docutils literal notranslate"><span class="pre">StraightStaircase</span></code> representation of staircases is deprecated and replaced with the new <code class="docutils literal notranslate"><span class="pre">StaircaseWithLandings</span></code>.</p> <p><strong>Choreography</strong>; The <code class="docutils literal notranslate"><span class="pre">precise_timing</span></code> in <code class="docutils literal notranslate"><span class="pre">Animation</span></code> message is deprecated and replaced by the more fine-grained control of <code class="docutils literal notranslate"><span class="pre">timing_adjustability</span></code> field.</p> <p><strong>Leases</strong>: Use <code class="docutils literal notranslate"><span class="pre">is_stale</span></code> instead of the stale time in the <code class="docutils literal notranslate"><span class="pre">LeaseResource</span></code> message to determine staleness.</p> </section> <section id="python-functions"> <h4>Python functions<a class="headerlink" href="#python-functions" title="Permalink to this heading"></a></h4> <p><code class="docutils literal notranslate"><span class="pre">BaseClient.chunk_message</span></code> has been moved to the <code class="docutils literal notranslate"><span class="pre">data_chunk</span></code> module, along with other serialization functions.</p> <p><code class="docutils literal notranslate"><span class="pre">BaseClient.request_trim_for_log</span></code> and <code class="docutils literal notranslate"><span class="pre">BaseClient.response_trim_for_log</span></code> are deprecated with no replacement. Logging should use regular %-based formatting, rather than prematurely forcing serialization.</p> </section> </section> <section id="id57"> <h3>Breaking Changes<a class="headerlink" href="#id57" title="Permalink to this heading"></a></h3> <p>When the robot loses connection with an E-stop endpoint, an attempt to power on the robot will now return <code class="docutils literal notranslate"><span class="pre">STATUS_KEEP_ALIVE_MOTOR_OFF</span></code> instead of <code class="docutils literal notranslate"><span class="pre">STATUS_ESTOPPED</span></code>. In python code it will raise the <code class="docutils literal notranslate"><span class="pre">KeepaliveMotorsOffError</span></code> exception instead of <code class="docutils literal notranslate"><span class="pre">EstoppedError</span></code>.</p> <p>Some malformed Graph Nav graphs were previously accepted, but would leave the service in a bad state. These graphs are now explicitly rejected during upload.</p> </section> <section id="id58"> <h3>Known Issues<a class="headerlink" href="#id58" title="Permalink to this heading"></a></h3> <p><strong>When a network transport failure occurs,</strong> depending on the particular operating system and version of gRPC installed, the error from the python SDK may not always be the most specific error possible, such as <code class="docutils literal notranslate"><span class="pre">UnknownDnsNameError</span></code>. It may instead be raised as either a generic <code class="docutils literal notranslate"><span class="pre">RpcError</span></code>, or another generic failure type such as <code class="docutils literal notranslate"><span class="pre">UnableToConnectToRobotError</span></code>.</p> <p><strong>If you write a custom data acquisition plugin or image service,</strong> do not change its <code class="docutils literal notranslate"><span class="pre">DataAcquisitionCapability</span></code> or <code class="docutils literal notranslate"><span class="pre">ImageSource</span></code> set once it is running and registered. New capabilities may not be detected, and old capabilities may still be listed as available in the Data Acquisition service. To change the capabilities of a service: unregister it from the directory, wait until its capabilities are no longer listed in the Data Acquisition service, and then re-register it. This waiting also applies to restarting a service if its capabilities will be different upon restart.</p> <p><strong>If you write a custom data acquisition plugin without using our helper class,</strong> its <code class="docutils literal notranslate"><span class="pre">GetStatus()</span></code> RPC is expected to complete immediately. If it takes too long to complete it can cause timeouts when requesting <code class="docutils literal notranslate"><span class="pre">GetStatus()</span></code> of the data acquisition service.</p> <p><strong>If you register a new service with the robot</strong>, calling <code class="docutils literal notranslate"><span class="pre">robot.ensure_client()</span></code> to create a client for that service may result in a <code class="docutils literal notranslate"><span class="pre">UnregisteredServiceNameError</span></code>.</p> <ul class="simple"> <li><p>Workaround: call <code class="docutils literal notranslate"><span class="pre">robot.sync_with_directory()</span></code> before <code class="docutils literal notranslate"><span class="pre">robot.ensure_client()</span></code></p></li> </ul> <p><strong>SE2VelocityLimits require care</strong>. Correct usage of the <code class="docutils literal notranslate"><span class="pre">SE2VelocityLimit</span></code> message requires the user to fully fill out all the fields, setting unlimited values to a large number, say 1e6.</p> <p><strong>Velodyne client API example has python/matplotlib issue</strong> and it needs PyQt5</p> <ul class="simple"> <li><p>Workaround: run <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">pyqt5</span></code> in the venv to get it to work.</p></li> </ul> <p><strong>Robot command feedback response incorrect with multiple clients running</strong> in the configuration with a Mission client sending synchro arm commands with body lease and a Localnav client sending synchro mobility command with mobility lease. In this case, sending both robot command requests and robot command feedback requests, messes up the feedback request for the mission client. It was receiving feedback for the mobility request, and not the arm request.</p> <p><strong>CustomParam validation</strong> will fail if extra parameters are provided that are not in the spec.</p> </section> <section id="id59"> <h3>Sample Code<a class="headerlink" href="#id59" title="Permalink to this heading"></a></h3> <section id="id60"> <h4>New<a class="headerlink" href="#id60" title="Permalink to this heading"></a></h4> <p><a class='reference internal' href='/python/examples/arm_grasp_carry_overrides/readme'><span class="doc">Arm Grasp Carry Overrides</span></a>: Show how to set grasp and carry overrides for Spot Arms.</p> <p><a class='reference internal' href='/python/examples/arm_impedance_control/readme'><span class="doc">Arm Impedance Control</span></a>: Show how to send arm impedance commands to the robot.</p> <p><a class='reference internal' href='/python/examples/arm_wasd/readme'><span class="doc">Arm WASD</span></a>: Create an interface for controlling the arm with your keyboard.</p> <p><a class='reference internal' href='/python/examples/inverse_kinematics/readme'><span class="doc">Inverse Kinematics</span></a>: Show to interact with the <a class='reference external' href='/docs/concepts/arm/arm_services#inverse-kinematics-service'>Inverse Kinematics Service</a>.</p> <p><a class='reference internal' href='/python/examples/network_request_callback/readme'><span class="doc">Network Request Callback</span></a>: Provide a callback that queries a network endpoint and then checks if the response contains a particular string.</p> <p><a class='reference internal' href='/python/examples/record_autowalk/readme'><span class="doc">Record Autowalk</span></a>: Create an interface for recording an Autowalk with your keyboard.</p> <p><a class='reference internal' href='/python/examples/orbit/hello_orbit/readme'><span class="doc">Scout - Hello Scout</span></a>: Introductory programming example for the Scout client, which uses the Scout web API.</p> <p><a class='reference internal' href='/python/examples/service_customization/custom_parameter_image_server/readme'><span class="doc">Service Customization for Image Services</span></a>: Show how to host an image service that contains an image source with custom parameters.</p> <p><a class='reference internal' href='/python/examples/service_customization/custom_parameter_ncb_worker/readme'><span class="doc">Service Customization for Network Compute Worker Services</span></a>: Show how to host a Network Compute Bridge Worker service that contains custom parameters.</p> <p><a class='reference internal' href='/python/examples/user_nogo_regions/readme'><span class="doc">User Nogo Region</span></a>: Show how to add and delete user no-go regions to create user-defined body and/or foot obstacles using the World Object service.</p> </section> <section id="id61"> <h4>Updated<a class="headerlink" href="#id61" title="Permalink to this heading"></a></h4> <p><a class='reference internal' href='/python/examples/area_callback/readme'><span class="doc">Area_callback</span></a>: Added <code class="docutils literal notranslate"><span class="pre">lease_client.take()</span></code> call.</p> <p><a class='reference internal' href='/python/examples/arm_constrained_manipulation/readme'><span class="doc">Arm_constrained_manipulation</span></a>: Improved documentation, introduced the position control loop for constrained manipulation and fixed bugs in setting position and velocity variables.</p> <p><a class='reference internal' href='/python/examples/arm_impedance_control/readme'><span class="doc">Arm Impedance_Control</span></a>: Added impedance feedback.</p> <p><a class='reference internal' href='/python/examples/estop/readme'><span class="doc">Estop</span></a>: Added feedback in GUI.</p> <p><a class='reference internal' href='/python/examples/gripper_camera_params/readme'><span class="doc">Gripper Camera Params</span></a>: Made all gripper camera parameters configurable.</p> <p><a class='reference internal' href='/python/examples/hello_spot/readme'><span class="doc">Hello_spot</span></a>: Updated body control command.</p> <p><a class='reference internal' href='/python/examples/replay_mission/readme'><span class="doc">Replay Mission</span></a>: Split timeout parameter into upload timeout and mission timeout.</p> <p><a class='reference internal' href='/python/examples/spot_cam/readme'><span class="doc">Spot CAM</span></a></p> <ul class="simple"> <li><p>Added compositor get/set reticle calls.</p></li> <li><p>Removed network settings calls.</p></li> <li><p>Added get/set ptz focus calls.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">exposure_mode</span></code> and <code class="docutils literal notranslate"><span class="pre">exposure_duration</span></code> in <code class="docutils literal notranslate"><span class="pre">StreamQualityCommand</span></code>.</p></li> </ul> <p><a class="reference external" href="https://github.com/boston-dynamics/spot-sdk/blob/577c45e26241ba1cbbbdf3d85013b2a5b2b52888/python/examples/spot_detect_and_follow/README">Spot Detect and Follow</a></p> <ul class="simple"> <li><p>Added documentation for running it as a Spot Extension.</p></li> <li><p>Added authentication through payload credentials.</p></li> </ul> <p><a class='reference internal' href='/python/examples/payloads/readme'><span class="doc">Payloads</span></a>: Updated example to work with robots that do not have an arm.</p> <p><a class='reference internal' href='/python/examples/remote_mission_service/readme'><span class="doc">Remote Mission Service</span></a>: Updated example to use custom parameters.</p> </section> </section> </section> <section id="id62"> <h2>3.2.3<a class="headerlink" href="#id62" title="Permalink to this heading"></a></h2> <p>No changes from 3.2.2.</p> </section> <section id="id63"> <h2>3.2.2<a class="headerlink" href="#id63" title="Permalink to this heading"></a></h2> <section id="id64"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id64" title="Permalink to this heading"></a></h3> <p>Improved CORE I/O documentation on passwords, user specifications in Spot Extensions, and ports for incoming traffic.</p> <p>Updated <a class='reference internal' href='/docs/python/daq_tutorial/daq1'><span class="doc">Data Acquisition Tutorial</span></a> documentation on udev rules to reflect changes on the automatic execution of udev rules during a Spot Extension installation.</p> </section> <section id="id65"> <h3>Known Issues<a class="headerlink" href="#id65" title="Permalink to this heading"></a></h3> <p>Same as 3.2.0</p> </section> <section id="id66"> <h3>Sample Code<a class="headerlink" href="#id66" title="Permalink to this heading"></a></h3> <section id="id67"> <h4>Updated<a class="headerlink" href="#id67" title="Permalink to this heading"></a></h4> <p>Updated Nvidia base docker image version in Dockerfile of the following:</p> <ul class="simple"> <li><p><a class='reference internal' href='/docs/python/fetch_tutorial/fetch1'><span class="doc">Fetch tutorial</span></a>,</p></li> <li><p>Crosswalk Lights and Look Both Ways <a class='reference internal' href='/python/examples/area_callback/readme'><span class="doc">Area Callback examples</span></a>,</p></li> <li><p>Fire Extinguisher Detector Network Compute Bridge worker <a class='reference internal' href='/python/examples/network_compute_bridge/fire_extinguisher_server/readme'><span class="doc">example</span></a>,</p></li> <li><p><a class='reference internal' href='/python/examples/ricoh_theta/readme'><span class="doc">Ricoh Theta example</span></a></p></li> </ul> <p>Updated <a class='reference internal' href='/python/examples/network_compute_bridge/fire_extinguisher_server/readme'><span class="doc">Fire Extinguisher Detector example</span></a> to work with the updated tensorflow version installed in the updated nvidia base docker image.</p> </section> </section> </section> <section id="id68"> <h2>3.2.1<a class="headerlink" href="#id68" title="Permalink to this heading"></a></h2> <section id="id69"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id69" title="Permalink to this heading"></a></h3> <p>Fixed issues relating to GraphNav Area Callbacks and loop closures where connections could be made in the middle of an Area Callback. These connections are now prohibited. Maps with incorrect connections must be re-recorded or reprocessed with the map processing service to re-create better loop closures.</p> <p>Updated Fetch tutorial with information to run on CORE I/O payload.</p> <p>Added <a class='reference internal' href='/docs/concepts/orbit/about_orbit'><span class="doc">Getting Started</span></a> section in Scout documentation.</p> <p>Removed unused imports in the protobuf files <code class="docutils literal notranslate"><span class="pre">protos/bosdyn/api/autowalk/walks.proto</span></code>, <code class="docutils literal notranslate"><span class="pre">protos/bosdyn/api/graph_nav/area_callback.proto</span></code>, <code class="docutils literal notranslate"><span class="pre">protos/bosdyn/api/graph_nav/graph_nav.proto</span></code>, <code class="docutils literal notranslate"><span class="pre">protos/bosdyn/api/mission/nodes.proto</span></code>.</p> <p>Autowalk missions:</p> <ul class="simple"> <li><p>Added flag for skipping actions.</p></li> <li><p>Added action duration field.</p></li> </ul> <p>Fixed a bug in our <code class="docutils literal notranslate"><span class="pre">Vec3</span></code> cross product in <code class="docutils literal notranslate"><span class="pre">python/bosdyn-client/src/bosdyn/client/math_helpers.py</span></code></p> </section> <section id="id70"> <h3>Known Issues<a class="headerlink" href="#id70" title="Permalink to this heading"></a></h3> <p>Same as 3.2.0</p> </section> <section id="id71"> <h3>Sample Code<a class="headerlink" href="#id71" title="Permalink to this heading"></a></h3> <section id="id72"> <h4>Updated<a class="headerlink" href="#id72" title="Permalink to this heading"></a></h4> <p><a class='reference internal' href='/python/examples/replay_mission/readme'><span class="doc">Replay Mission</span></a>: Updated example to point to correct mission file.</p> <p><a class='reference internal' href='/python/examples/velodyne_client/readme'><span class="doc">Velodyne Client</span></a>: Fixed velodyne client PyQt dependency issue.</p> </section> </section> </section> <section id="id73"> <h2>3.2.0<a class="headerlink" href="#id73" title="Permalink to this heading"></a></h2> <section id="id74"> <h3>New Features<a class="headerlink" href="#id74" title="Permalink to this heading"></a></h3> <section id="autowalk-service"> <h4>Autowalk Service<a class="headerlink" href="#autowalk-service" title="Permalink to this heading"></a></h4> <p>Enables API clients to specify high level autonomous behaviors for Spot using an easily editable format. The autowalk format is a list of actions and their associated locations. Using this service, users can program the robot to “go to location A, perform action A, go to location B, perform action B, etc.”. The autowalk service compiles the autowalk into a behavior tree that can then be uploaded to the robot and played using the mission service. Previously this feature was only available on the tablet, but now it is a service for all client applications.</p> </section> <section id="arm-impedance-control-beta"> <h4>Arm Impedance Control (Beta)<a class="headerlink" href="#arm-impedance-control-beta" title="Permalink to this heading"></a></h4> <p>Enables users to specify virtual springs and forces about the end effector. Users can specify a trajectory that the hand (or something attached to the hand) should follow while being dragged along by those springs. They can also add an additional feed-forward wrench (force + torque) that the end effector can apply. This command can be useful for tasks such as inserting a peg into a hole, or sliding along a surface.</p> <p>Notes:</p> <ul class="simple"> <li><p>This is a beta release, so care should be taken when specifying parameters, as damage to the robot or the surrounding environment may occur.</p></li> <li><p>Currently the maximum stiffness achievable with an impedance command is less than an ArmCartesianCommand, so if high positioning accuracy is required, ArmCartesianCommand or ArmSurfaceContact should be used.</p></li> </ul> </section> <section id="graph-nav-area-callbacks"> <h4>Graph Nav – Area Callbacks<a class="headerlink" href="#graph-nav-area-callbacks" title="Permalink to this heading"></a></h4> <p>Enables users to register a callback that is called in certain areas of the map during navigation. These “Area Callbacks” can instruct the robot to wait until the area is safe to cross (such as a crosswalk), take control of the robot and perform an action (such as opening a door), or perform a background action while in a certain area of the map (such as flashing lights or playing sounds). This enables integration with the <a class='reference internal' href='/docs/concepts/autonomy/graphnav_service'><span class="doc">Graph Nav</span></a> navigation system to extend its capabilities in terms of safety and new actions while navigating. See the <a class='reference internal' href='/docs/concepts/autonomy/graphnav_area_callbacks'><span class="doc">Area Callback</span></a> documentation for more details.</p> </section> <section id="fan-power-control"> <h4>Fan Power Control<a class="headerlink" href="#fan-power-control" title="Permalink to this heading"></a></h4> <p>Fan Commands request the robot to power the fans to a certain percent level (0 being off, 100 being full power) for a certain duration, for use cases such as temporarily turning the fans off during an audio recording. A fan command being accepted does not guarantee that it will work for its entire duration, for cases such as the robot ran too hot and therefore took back control of the fans, or another fan command was overrode the existing fan command.</p> </section> <section id="ground-clutter"> <h4>Ground Clutter<a class="headerlink" href="#ground-clutter" title="Permalink to this heading"></a></h4> <p>When this feature is enabled, the robot will treat low objects (shorter than 30cm height) as obstacles during mission playback. The robot will only be willing to step up or down onto different surfaces if it had stepped on them during mission recording. This mode may cause the robot to take unexpected turns in some environments if the robot perceives small objects (real or imagined). Very small objects (e.g. extension cords) will likely still be ignored by the robot.</p> </section> <section id="added-core-i-o-documentation"> <h4>Added CORE I/O Documentation<a class="headerlink" href="#added-core-i-o-documentation" title="Permalink to this heading"></a></h4> <p>CORE I/O payload replaces the Spot CORE payload. We added the documentation related to the new features in CORE I/O in <a class='reference internal' href='/docs/payload/coreio_documentation'><span class="doc">here</span></a></p> </section> <section id="added-spot-extensions-documentation"> <h4>Added Spot Extensions Documentation<a class="headerlink" href="#added-spot-extensions-documentation" title="Permalink to this heading"></a></h4> <p>CORE I/O contains improved functionality to package and run applications as Spot Extensions. We added the Spot Extensions documentation <a class='reference external' href='/docs/payload/docker_containers#manage-payload-software-in-core-i-o'>here</a></p> </section> </section> <section id="id75"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id75" title="Permalink to this heading"></a></h3> <section id="api"> <h4>API<a class="headerlink" href="#api" title="Permalink to this heading"></a></h4> <p>Choreography API:</p> <ul class="simple"> <li><p>Deprecated <code class="docutils literal notranslate"><span class="pre">known_sequences</span></code> and added <code class="docutils literal notranslate"><span class="pre">SequenceInfo</span></code> with the list of choreography sequences the robot knows about.</p></li> <li><p>RPC additions:</p> <ul> <li><p><code class="docutils literal notranslate"><span class="pre">DeleteSequence</span></code>: Delete the retained file for a choreography sequence so the sequence will be forgotten on reboot.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">SaveSequence</span></code>: Write a choreography sequence as a file to robot memory so it will be retained through reboot.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">ModifyChoreographyInfo</span></code>: Edit the metadata of a choreography sequence and update any retained files for that sequence with the new metadata.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">ClearAllSequenceFiles</span></code>: Reset to a clean slate with no retained files by deleting all non-permanent choreography related files.</p></li> </ul> </li> </ul> <p>Added full <code class="docutils literal notranslate"><span class="pre">ImageRequest</span></code> in data_acquisition request and deprecated <code class="docutils literal notranslate"><span class="pre">image_source</span></code> and <code class="docutils literal notranslate"><span class="pre">image_format</span></code> fields.</p> <p>Docking:</p> <ul class="simple"> <li><p>Added UpdateDockingParams in DockingCommandFeedbackRequest to update parameters relating to the specified command ID.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">STATUS_ERROR_STUCK</span></code> in <code class="docutils literal notranslate"><span class="pre">DockingCommandFeedbackResponse</span></code> to flag the robot not making progress towards docking.</p></li> </ul> <p>Added <code class="docutils literal notranslate"><span class="pre">Matrixf</span></code>, <code class="docutils literal notranslate"><span class="pre">MatrixInt64</span></code>, <code class="docutils literal notranslate"><span class="pre">MatrixInt32</span></code> and <code class="docutils literal notranslate"><span class="pre">Vector</span></code> in <code class="docutils literal notranslate"><span class="pre">geometry.proto</span></code>.</p> <p>GraphNav:</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">graph_nav.proto</span></code>:</p> <ul> <li><p>Added refinement field in GraphNav’s <code class="docutils literal notranslate"><span class="pre">SetLocalizationRequest</span></code> as a choice of refining fiducial results with ICP or with visual features.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">STATUS_VISUAL_ALIGNMENT_FAILED</span></code> in SetLocalizationResponse to flag the visual feature based alignment failing or the pose solution being considered unreliable.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">path_following_mode</span></code>, <code class="docutils literal notranslate"><span class="pre">blocked_path_wait_time</span></code> and <code class="docutils literal notranslate"><span class="pre">ground_clutter_mode</span></code> in GraphNav’s <code class="docutils literal notranslate"><span class="pre">TravelParams</span></code>.</p></li> <li><p>Added definitions to support the new Area Callbacks feature.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">route_following_status</span></code> in <code class="docutils literal notranslate"><span class="pre">NavigationFeedbackResponse</span></code> with additional information about what kind of route the robot is following and why.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">blockage_status</span></code> in <code class="docutils literal notranslate"><span class="pre">NavigationFeedbackResponse</span></code> with additional information about whether or not the robot believes the current route to be blocked.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">ValidateGraph</span></code> RPC to run a check on the currently loaded map.</p></li> </ul> </li> <li><p><code class="docutils literal notranslate"><span class="pre">map.proto</span></code>:</p> <ul> <li><p>Added optional <code class="docutils literal notranslate"><span class="pre">ClientMetadata</span></code> field with information to attach to waypoints that are being recorded.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">robot_id</span></code> field with information of the robot that created this waypoint and <code class="docutils literal notranslate"><span class="pre">recording_started_on</span></code> field with information about when the recording session started in robot time basis in <code class="docutils literal notranslate"><span class="pre">WaypointSnapshot</span></code>.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">path_following_mode</span></code>, <code class="docutils literal notranslate"><span class="pre">disable_directed_exploration</span></code>, <code class="docutils literal notranslate"><span class="pre">area_callbacks</span></code>, <code class="docutils literal notranslate"><span class="pre">ground_clutter_mode</span></code> to <code class="docutils literal notranslate"><span class="pre">Edge</span></code> definition.</p></li> </ul> </li> <li><p><code class="docutils literal notranslate"><span class="pre">recording.proto</span></code>:</p> <ul> <li><p>Added <code class="docutils literal notranslate"><span class="pre">STATUS_ROBOT_IMPAIRED</span></code> in <code class="docutils literal notranslate"><span class="pre">StartRecordingResponse</span></code> to flag the robot being unable to start recording because it is impaired</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">STATUS_ROBOT_IMPAIRED</span></code> in <code class="docutils literal notranslate"><span class="pre">StartRecordingResponse</span></code> with information on why the robot is impaired.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">status</span></code> and <code class="docutils literal notranslate"><span class="pre">impaired_state</span></code> fields in <code class="docutils literal notranslate"><span class="pre">GetRecordStatusResponse</span></code> with information on whether the robot is impaired.</p></li> </ul> </li> </ul> <p>Missions:</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">mission.proto</span></code>:</p> <ul> <li><p>Added <code class="docutils literal notranslate"><span class="pre">severity</span></code> field in <code class="docutils literal notranslate"><span class="pre">Question</span></code> with the severity of the question.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">path_following_mode</span></code> and <code class="docutils literal notranslate"><span class="pre">ground_clutter_mode</span></code> in <code class="docutils literal notranslate"><span class="pre">PlaySettings</span></code> with information on whether to use default or strict path following mode and whether or not to enable ground clutter avoidance, and which type.</p></li> </ul> </li> <li><p><code class="docutils literal notranslate"><span class="pre">nodes.proto</span></code>:</p> <ul> <li><p>Added <code class="docutils literal notranslate"><span class="pre">Switch</span></code> node definition in mission definition to run a specific child based on a specified pivot_value.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">respect_child_failure</span></code> flag in mission <code class="docutils literal notranslate"><span class="pre">Repeat</span></code> nodes to control whether a repeat node will keep running its child regardless of whether or not the child succeeds or fails.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">BosdynRecordEvent</span></code> message:</p> <ul> <li><p>Added <code class="docutils literal notranslate"><span class="pre">succeed_early</span></code> to control the wait for the <code class="docutils literal notranslate"><span class="pre">RecordEvents</span></code> RPC.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">additional_parameters</span></code> to support runtime parameters.</p></li> </ul> </li> <li><p><code class="docutils literal notranslate"><span class="pre">RemoteGrpc</span></code> message:</p> <ul> <li><p>Added <code class="docutils literal notranslate"><span class="pre">severity</span></code> field to determine what sort of alerting a prompt triggers.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">BosdynGripperCameraParamsState</span></code> message to get the state of the gripper camera params from the robot.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">SetGripperCameraParams</span></code> message to set gripper camera params.</p></li> <li><p>Added optional variables <code class="docutils literal notranslate"><span class="pre">cleared_cause_fall_blackboard_name</span></code>, <code class="docutils literal notranslate"><span class="pre">cleared_cause_hardware_blackboard_name</span></code> and <code class="docutils literal notranslate"><span class="pre">cleared_cause_lease_timeout_blackboard_name</span></code> in <code class="docutils literal notranslate"><span class="pre">FormatBlackboard</span></code> message to store cleared behavior faults.</p></li> </ul> </li> </ul> </li> </ul> <p>Network Compute Bridge:</p> <ul class="simple"> <li><p>Updated <code class="docutils literal notranslate"><span class="pre">ImageSourceAndService</span></code> field in <code class="docutils literal notranslate"><span class="pre">NetworkComputeRequest</span></code> to be a choice between existing <code class="docutils literal notranslate"><span class="pre">image_source</span></code> field and a more complete <code class="docutils literal notranslate"><span class="pre">ImageRequest</span></code> field with all the image requests field.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">output_images</span></code> field in <code class="docutils literal notranslate"><span class="pre">NetworkComputeResponse</span></code> to output images generated by a model.</p></li> </ul> <p>Added <code class="docutils literal notranslate"><span class="pre">stair_mode</span></code> field in <code class="docutils literal notranslate"><span class="pre">MobilityParams</span></code> with selected option for stairs mode.</p> <p>Spotcheck:</p> <ul class="simple"> <li><p>Added <code class="docutils literal notranslate"><span class="pre">STATE_ARM_JOINT_CHECK</span></code> in <code class="docutils literal notranslate"><span class="pre">SpotCheckFeedbackResponse.State</span></code> message for arm joint endstops and cross error check being underway.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">ERROR_ARM_CHECK_COLLISION</span></code> and <code class="docutils literal notranslate"><span class="pre">ERROR_ARM_CHECK_TIMEOUT</span></code> enum values in <code class="docutils literal notranslate"><span class="pre">SpotCheckFeedbackResponse.Error</span></code> to flag an arm motion causing collisions (e.g. w/ a payload) or timeout during arm joint check.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">ERROR_ENCODER_SHIFTED</span></code> and <code class="docutils literal notranslate"><span class="pre">ERROR_COLLISION</span></code> enum values in <code class="docutils literal notranslate"><span class="pre">JointKinematicCheckResult.Error</span></code> to flag whether the measured endstops shifted from kin cal or the joint would have a collision.</p></li> <li><p>Added <code class="docutils literal notranslate"><span class="pre">STATUS_CALIBRATION_VERIFICATION_FAILED</span></code> enum in <code class="docutils literal notranslate"><span class="pre">CameraCalibrationFeedbackResponse.Status</span></code> to flag Spotcheck failed after the camera calibration.</p></li> </ul> </section> <section id="documentation"> <h4>Documentation<a class="headerlink" href="#documentation" title="Permalink to this heading"></a></h4> <p>Improved Choreography documentation with 3.2 functionality and API changes.</p> <p>Updated the lease usage in the Fetch tutorial.</p> <p>Updated the Data Acquisition Tutorial documentation with information on how to convert the tutorial into a Spot Extension to run on the CORE I/O.</p> <p>Added documentation on thermal SpotCAM images <a class='reference internal' href='/docs/concepts/data_acquisition_thermal_raw'><span class="doc">here</span></a>.</p> </section> <section id="sdk"> <h4>SDK<a class="headerlink" href="#sdk" title="Permalink to this heading"></a></h4> <p>Added <code class="docutils literal notranslate"><span class="pre">AutowalkClient</span></code> to support the new Autowalk functionality</p> <p>Added <code class="docutils literal notranslate"><span class="pre">LoggingHandler</span></code> class in <code class="docutils literal notranslate"><span class="pre">data_buffer.py</span></code> as a logging system Handler that will publish text to the data-buffer service</p> <p>Added <code class="docutils literal notranslate"><span class="pre">InvalidGravityAlignmentError</span></code> error in <code class="docutils literal notranslate"><span class="pre">map_processing.py</span></code> to report if one or more anchoring hints disagrees with gravity.</p> <p>Updated <code class="docutils literal notranslate"><span class="pre">PayloadRegistrationKeepAlive</span></code> to catch <code class="docutils literal notranslate"><span class="pre">TooManyRequestsError</span></code> exceptions and continue on in such cases.</p> <p>Added fan power control/feedback methods in python PowerClient; also added <code class="docutils literal notranslate"><span class="pre">FanControlTemperatureError</span></code> to report current measured robot temperatures are too high to accept user fan commands.</p> <p>Added <code class="docutils literal notranslate"><span class="pre">RobotImpairedError</span></code> in Python <code class="docutils literal notranslate"><span class="pre">GraphNavRecordingServiceClient</span></code> to report failures to start recording because the robot is impaired.</p> <p>Added <code class="docutils literal notranslate"><span class="pre">sync_with_services_list</span></code> in <code class="docutils literal notranslate"><span class="pre">robot.py</span></code> as an alternate version of <code class="docutils literal notranslate"><span class="pre">sync_with_directory</span></code> that takes the list of services directly and does not perform any RPCs.</p> <p>Added <code class="docutils literal notranslate"><span class="pre">update_secure_channel_port</span></code> in <code class="docutils literal notranslate"><span class="pre">robot.py</span></code> to update the port used for creating secure channels, instead of using the default 443</p> <p>Added <code class="docutils literal notranslate"><span class="pre">payload_estimation_command</span></code> method in <code class="docutils literal notranslate"><span class="pre">robot_command.py</span></code> to get the robot estimate payload mass.</p> <p>Added <code class="docutils literal notranslate"><span class="pre">exc_callback</span></code> function as an argument in <code class="docutils literal notranslate"><span class="pre">ResponseContext</span></code> in <code class="docutils literal notranslate"><span class="pre">server_util.py</span></code> to be called with exception type, value, and traceback info if an exception is raised in the body of the “with” statement.</p> <p>Added <code class="docutils literal notranslate"><span class="pre">CameraSpotCheckTimedOutError</span></code>, <code class="docutils literal notranslate"><span class="pre">CameraSpotCheckFeedbackError</span></code> and <code class="docutils literal notranslate"><span class="pre">CameraCalibrationResponseError</span></code> in <code class="docutils literal notranslate"><span class="pre">spot_check.py</span></code> as errors for timing out waiting for SUCCESS response from camera spot check, general class of errors for camera spot check feedback and general class of errors for camera calibration routines, respectively.</p> <p>Updated <code class="docutils literal notranslate"><span class="pre">RemoteClient</span></code> to use lease processors and lease wallet when not given explicit leases.</p> <p>Added <code class="docutils literal notranslate"><span class="pre">_build_establish_session_request</span></code> and <code class="docutils literal notranslate"><span class="pre">_build_tick_request</span></code> helper functions in <code class="docutils literal notranslate"><span class="pre">remote_client.py</span></code>.</p> <p>Added <code class="docutils literal notranslate"><span class="pre">lease_resource_hierarchy.py</span></code> with helper functionality for managing hierarchy of lease resources.</p> <p>Added <code class="docutils literal notranslate"><span class="pre">lease_validator.py</span></code> with functionality to track lease usage in intermediate services.</p> <p>Added <code class="docutils literal notranslate"><span class="pre">spot_cam/lights_helper.py</span></code> with helper functionality to control SpotCAM lights.</p> </section> </section> <section id="id76"> <h3>Deprecations<a class="headerlink" href="#id76" title="Permalink to this heading"></a></h3> <p>Deprecated Choreography API <code class="docutils literal notranslate"><span class="pre">known_sequences</span></code>; use new <code class="docutils literal notranslate"><span class="pre">SequenceInfo</span></code> instead.</p> <p>Deprecated <code class="docutils literal notranslate"><span class="pre">image_source</span></code> and <code class="docutils literal notranslate"><span class="pre">image_format</span></code> fields in DAQ requests and added full <code class="docutils literal notranslate"><span class="pre">ImageRequest</span></code> instead.</p> <p>The boolean field <code class="docutils literal notranslate"><span class="pre">stair_hint</span></code> is deprecated from <code class="docutils literal notranslate"><span class="pre">MobilityParams</span></code> and it has been replaced by the field <code class="docutils literal notranslate"><span class="pre">stairs_mode</span></code>.</p> <p>Deprecated <code class="docutils literal notranslate"><span class="pre">LogAnnotationHandler</span></code>; use <code class="docutils literal notranslate"><span class="pre">bosdyn.client.data_buffer.LoggingHandler</span></code> instead.</p> <p><code class="docutils literal notranslate"><span class="pre">safe_power_off</span></code> method is deprecated in <code class="docutils literal notranslate"><span class="pre">PowerClient</span></code> and replaced by the less ambiguous <code class="docutils literal notranslate"><span class="pre">safe_power_off_motors</span></code> function.</p> <p>Removed <code class="docutils literal notranslate"><span class="pre">_should_send_app_token_on_each_request</span></code> method in <code class="docutils literal notranslate"><span class="pre">robot.py</span></code>.</p> <p>Deprecated Spot CORE Documentation and moved to <a class='reference internal' href='/docs/payload/spot_core_documentation'><span class="doc">Pre-3.2 Spot CORE Documentation</span></a>.</p> </section> <section id="id77"> <h3>Breaking Changes<a class="headerlink" href="#id77" title="Permalink to this heading"></a></h3> </section> <section id="id78"> <h3>Dependencies<a class="headerlink" href="#id78" title="Permalink to this heading"></a></h3> </section> <section id="id79"> <h3>Known Issues<a class="headerlink" href="#id79" title="Permalink to this heading"></a></h3> <p><strong>When a network transport failure occurs,</strong> depending on the particular operating system and version of gRPC installed, the error from the python SDK may not always be the most specific error possible, such as <code class="docutils literal notranslate"><span class="pre">UnknownDnsNameError</span></code>. It may instead be raised as either a generic <code class="docutils literal notranslate"><span class="pre">RpcError</span></code>, or another generic failure type such as <code class="docutils literal notranslate"><span class="pre">UnableToConnectToRobotError</span></code>.</p> <p><strong>If you write a custom data acquisition plugin or image service,</strong> do not change its <code class="docutils literal notranslate"><span class="pre">DataAcquisitionCapability</span></code> or <code class="docutils literal notranslate"><span class="pre">ImageSource</span></code> set once it is running and registered. New capabilities may not be detected, and old capabilities may still be listed as available in the Data Acquisition service. To change the capabilities of a service: unregister it from the directory, wait until its capabilities are no longer listed in the Data Acquisition service, and then re-register it. This waiting also applies to restarting a service if its capabilities will be different upon restart.</p> <p><strong>If you write a custom data acquisition plugin without using our helper class,</strong> its <code class="docutils literal notranslate"><span class="pre">GetStatus()</span></code> RPC is expected to complete immediately. If it takes too long to complete it can cause timeouts when requesting <code class="docutils literal notranslate"><span class="pre">GetStatus()</span></code> of the data acquisition service.</p> <p><strong>If you register a new service with the robot</strong>, calling <code class="docutils literal notranslate"><span class="pre">robot.ensure_client()</span></code> to create a client for that service may result in a <code class="docutils literal notranslate"><span class="pre">UnregisteredServiceNameError</span></code>.</p> <ul class="simple"> <li><p>Workaround: call <code class="docutils literal notranslate"><span class="pre">robot.sync_with_directory()</span></code> before <code class="docutils literal notranslate"><span class="pre">robot.ensure_client()</span></code></p></li> </ul> <p><strong>SE2VelocityLimits require care</strong>. Correct usage of the <code class="docutils literal notranslate"><span class="pre">SE2VelocityLimit</span></code> message requires the user to fully fill out all the fields, setting unlimited values to a large number, say 1e6.</p> <p><strong>Python wheels 3.1.2.1 and 3.2.0 do not work on nvidia docker image</strong> <code class="docutils literal notranslate"><span class="pre">nvcr.io/nvidia/l4t-tensorflow:r32.6.1-tf2.5-py3</span></code>.</p> <ul class="simple"> <li><p>Workaround: Use <code class="docutils literal notranslate"><span class="pre">nvcr.io/nvidia/l4t-tensorflow:r32.7.1-tf2.5-py3</span></code> as the base image instead.</p></li> </ul> <p><strong>Velodyne client API example has python/matplotlib issue</strong> and it needs PyQt5</p> <ul class="simple"> <li><p>Workaround: run <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">pyqt5</span></code> in the venv to get it to work.</p></li> </ul> <p><strong>Robot command feedback response incorrect with multiple clients running</strong> in the configuration with a Mission client sending synchro arm commands with body lease and a Localnav client sending synchro mobility command with mobility lease. In this case, sending both robot command requests and robot command feedback requests, messes up the feedback request for the mission client. It was receiving feedback for the mobility request, and not the arm request.</p> <p><strong>Binary files are not handled correctly in git when cloning SDK on Windows</strong> The failure is due to a random string of bytes mapping to <code class="docutils literal notranslate"><span class="pre">\n</span></code> in the binary protobuf getting converted to <code class="docutils literal notranslate"><span class="pre">^M</span></code> (CRLF) in Windows.</p> </section> <section id="id80"> <h3>Sample Code<a class="headerlink" href="#id80" title="Permalink to this heading"></a></h3> <section id="id81"> <h4>New<a class="headerlink" href="#id81" title="Permalink to this heading"></a></h4> <p><a class='reference internal' href='/python/examples/area_callback/readme'><span class="doc">Area Callback</span></a>: Example with a Crosswalk Area Callback action</p> <p><a class='reference internal' href='/python/examples/arm_impedance_control/readme'><span class="doc">Arm Impedance Control</span></a>: Example for how to send arm impedance commands with the robot</p> <p><a class='reference internal' href='/python/examples/core_io_gpio/readme'><span class="doc">CORE I/O GPIO</span></a>: Example to demonstrate how to use the CORE I/O GPIO pins to blink an LED</p> <p><a class='reference internal' href='/python/examples/edit_autowalk/readme'><span class="doc">Edit Autowalk</span></a>: Example on how to edit and replay an Autowalk via the API</p> <p><a class='reference internal' href='/python/examples/fan_command/readme'><span class="doc">Fan Commands</span></a>: Example to provide a basic Python script to call and receive feedback on a fan command and provide a usable template for writing a callback that issues and blocks during a fan command.</p> </section> <section id="id82"> <h4>Updated<a class="headerlink" href="#id82" title="Permalink to this heading"></a></h4> <p><a class='reference internal' href='/python/examples/docking/readme'><span class="doc">Docking</span></a>: Added undock function.</p> <p><a class='reference internal' href='/python/examples/fiducial_follow/readme'><span class="doc">Fiducial Follow</span></a>: Updated example for better lease usage.</p> <p><a class='reference internal' href='/python/examples/graph_nav_command_line/readme'><span class="doc">GraphNav Command-Line</span></a>: Fixed lease usage.</p> <p><a class='reference internal' href='/python/examples/mission_recorder/readme'><span class="doc">Mission Recorder</span></a>: Added metadata for the recording session.</p> <p><a class='reference internal' href='/python/examples/network_compute_bridge/readme'><span class="doc">Network Compute Bridge</span></a>: Added configuration to create a Spot Extension with the example.</p> <p><a class='reference internal' href='/python/examples/post_docking_callbacks/readme'><span class="doc">Post Docking Callback</span></a>: Added configuration to create a Spot Extension with the example.</p> <p><a class='reference internal' href='/python/examples/remote_mission_service/readme'><span class="doc">Remote Mission Callback</span></a>: Updated example to use lease processors and lease wallet when not given explicit leases.</p> <p><a class='reference internal' href='/python/examples/replay_mission/readme'><span class="doc">Replay Mission</span></a>: Added strict_mode option to use strict path following mode and cleaned up lease use.</p> <p><a class='reference internal' href='/python/examples/spot_cam/readme'><span class="doc">SpotCAM</span></a>:</p> <ul class="simple"> <li><p>Fixed SpotCAM <code class="docutils literal notranslate"><span class="pre">webrtc</span></code> client reliance on CLI credentials.</p></li> <li><p>Added spotcam ir meter example into command line.</p></li> <li><p>Hardcoded dependency versions that work with Python 3.6.</p></li> </ul> <p><a class="reference external" href="https://github.com/boston-dynamics/spot-sdk/blob/577c45e26241ba1cbbbdf3d85013b2a5b2b52888/python/examples/spot_detect_and_follow/README">Spot Detect and Follow</a>: Added configuration to create a Spot Extension with the example and various improvements.</p> <p><a class='reference internal' href='/python/examples/stitch_front_images/readme'><span class="doc">Stitch Front Images</span></a>: Add live viewer to example.</p> </section> </section> </section> <section id="id83"> <h2>3.1.2.1<a class="headerlink" href="#id83" title="Permalink to this heading"></a></h2> <section id="id84"> <h3>Dependencies<a class="headerlink" href="#id84" title="Permalink to this heading"></a></h3> <p>The <code class="docutils literal notranslate"><span class="pre">bosdyn-api</span></code> and <code class="docutils literal notranslate"><span class="pre">bosdyn-choreography-protos</span></code> packages have been rebuilt to support the latest <code class="docutils literal notranslate"><span class="pre">protobuf</span></code> package. They now require a minimum <code class="docutils literal notranslate"><span class="pre">protobuf</span></code> version of 3.6.1.</p> </section> </section> <section id="id85"> <h2>3.1.2<a class="headerlink" href="#id85" title="Permalink to this heading"></a></h2> <section id="id86"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id86" title="Permalink to this heading"></a></h3> <p>Added payloads and lidar transform in GraphNav’s <code class="docutils literal notranslate"><span class="pre">WaypointSnapshot</span></code> to help with:</p> <ul class="simple"> <li><p>Not getting lost when a big payload occluded the lidar.</p></li> <li><p>Determine which payloads were used to record a map.</p></li> </ul> </section> <section id="id87"> <h3>Known Issues<a class="headerlink" href="#id87" title="Permalink to this heading"></a></h3> <p>Same as 3.1.0</p> </section> </section> <section id="id88"> <h2>3.1.1<a class="headerlink" href="#id88" title="Permalink to this heading"></a></h2> <section id="id89"> <h3>Known Issues<a class="headerlink" href="#id89" title="Permalink to this heading"></a></h3> <p>Same as 3.1.0</p> </section> <section id="id90"> <h3>Sample Code<a class="headerlink" href="#id90" title="Permalink to this heading"></a></h3> <p><a class='reference internal' href='/python/examples/network_compute_bridge/readme'><span class="doc">Network Compute Bridge (updated)</span></a> Modified server to use user confidence value as a threshold for returning detections</p> </section> </section> <section id="id91"> <h2>3.1.0<a class="headerlink" href="#id91" title="Permalink to this heading"></a></h2> <section id="id92"> <h3>New Features<a class="headerlink" href="#id92" title="Permalink to this heading"></a></h3> <section id="safely-powering-off-on-staircases"> <h4>Safely powering off on staircases.<a class="headerlink" href="#safely-powering-off-on-staircases" title="Permalink to this heading"></a></h4> <p>To improve safety when operating on stairs, the robot may now autonomously walk off staircases in scenarios where it may have previously entered a sit. In the event of communication loss, critically low battery state of charge, or a Safe Power Off Request, the robot will walk off the staircase before sitting and powering off. The direction of travel will generally be to descend the stairs unless the robot has already reached the top landing. This includes automatic sit-and-power-off cases such as from low battery or the E-stop <code class="docutils literal notranslate"><span class="pre">SETTLE_THEN_CUT</span></code> level, as well as any client SafePowerOff commands. It does <em>not</em> affect immediate power cut cases such the PowerOff command or the E-stop CUT level.<br />To override this behavior for SafePowerOff commands, there is a new unsafe_action field in <code class="docutils literal notranslate"><span class="pre">SafePowerOffCommand</span></code> which can be set to <code class="docutils literal notranslate"><span class="pre">UNSAFE_FORCE_COMMAND</span></code> to force the command to take place immediately. To override this behavior for E-stop or battery power off, set the <code class="docutils literal notranslate"><span class="pre">disable_stair_error_auto_descent</span></code> field in the mobility params for the robot commands. As part of this change, a new <code class="docutils literal notranslate"><span class="pre">TerrainState</span></code> message in <code class="docutils literal notranslate"><span class="pre">RobotState</span></code> contains the <code class="docutils literal notranslate"><span class="pre">is_unsafe_to_sit</span></code> value to report when the robot considers the terrain unsafe to sit on.</p> </section> <section id="lease-timeout-changes"> <h4>Lease timeout changes.<a class="headerlink" href="#lease-timeout-changes" title="Permalink to this heading"></a></h4> <p>The behavior of the robot and leases is changed when the lease owner fails to retain the lease. Prior to 3.1, the robot would sit down and power off, and the lease would be revoked. This behavior allowed a new owner to smoothly take control of the robot in the case that a previous owner left without first returning the lease, but has proved to be frustrating when short comms losses trigger this behavior. Starting in 3.1, failing to retain the lease will cause the lease to become “stale”. If the lease is stale, another client can acquire the lease and begin using the robot. However, if the original owner returns and begins retaining the lease or sending commands before another client acquires ownership, the lease will become “fresh” again without the original owner needing to re-acquire the robot. This staleness is reported via the new <code class="docutils literal notranslate"><span class="pre">stale_time</span></code> field in the <code class="docutils literal notranslate"><span class="pre">LeaseResource</span></code> message. This change means that <strong>the robot will no longer sit down and power off if the lease owner disappears.</strong> For clients that still want that behavior, it is recommended to use an E-stop endpoint with the owner (which is already the common case), so that a comms interruption will cause the robot to sit and power off via the E-stop system.</p> </section> <section id="data-acquisition"> <h4>Data Acquisition<a class="headerlink" href="#data-acquisition" title="Permalink to this heading"></a></h4> <p>A <a class='reference internal' href='/docs/python/daq_tutorial/daq1'><span class="doc">new tutorial</span></a> provides a walk-through of integrating new sensors with the data acquisition system. It explains how to write, deploy, and use image services and data acquisition plugins with Spot, and how to process the resulting data.</p> <p>In addition to images and data capabilities, DataAcquisitionRequests can specify network compute actions to perform on captured images by adding a <a class='reference external' href='/protos/bosdyn/api/proto_reference#bosdyn-api-data-acquisition-proto'>NetworkComputeCapture</a> in the acquisition request list. This capture will save the image and any computed data from the network compute response. This currently only operates on images and will only save the data returned in the response. For use cases that require sending other input data or saving other kinds of output data, it is still recommended to implement a data acquisition plugin to do that work.</p> <p>Robot image services now report which image formats and pixel formats they support via new fields in the <code class="docutils literal notranslate"><span class="pre">ImageSource</span></code> message. When requesting images, clients can specify a desired pixel format, and also a resize ratio. These options allow for reduced bandwidth in cases where the client only needs a smaller image or a grayscale image. New status errors <code class="docutils literal notranslate"><span class="pre">STATUS_UNSUPPORTED_PIXEL_FORMAT_REQUESTED</span></code> and <code class="docutils literal notranslate"><span class="pre">STATUS_UNSUPPORTED_RESIZE_RATIO_REQUESTED</span></code> can now be returned if the client makes a request that is unsupported. User image services should also report the options they support. The <code class="docutils literal notranslate"><span class="pre">VisualImageSource</span></code> constructor now includes an optional argument for a list of supported pixel formats.</p> </section> <section id="alerts"> <h4>Alerts<a class="headerlink" href="#alerts" title="Permalink to this heading"></a></h4> <p>A new <a class='reference external' href='/protos/bosdyn/api/proto_reference#bosdyn-api-alerts-proto'>AlertData</a> message has been added for the purpose of triggering live alerts for various events that can happen during a mission. These alerts can be saved into the <code class="docutils literal notranslate"><span class="pre">DataAcquisitionStore</span></code> service using the new <code class="docutils literal notranslate"><span class="pre">StoreAlertData</span></code> RPC and queried using the <code class="docutils literal notranslate"><span class="pre">ListStoredAlertData</span></code> RPC. Additionally, the alert data can be added to the response from a network compute bridge worker, where it will be automatically saved into the data acquisition store when captured as part of a data acquisition request. If a client calls the network compute bridge service itself, the alert data will be returned to the client in the response but not automatically saved to the data acquisition store.</p> </section> <section id="new-services"> <h4>New Services<a class="headerlink" href="#new-services" title="Permalink to this heading"></a></h4> <p><a class='reference external' href='/protos/bosdyn/api/proto_reference#bosdyn-api-gripper-camera-param-proto'><strong>GripperCameraParamService</strong></a> – Set or query various modes and options on the camera in the robot’s gripper.</p> <p><a class='reference external' href='/protos/bosdyn/api/proto_reference#bosdyn-api-ray-cast-proto'><strong>RayCastService</strong></a> – Find intersections between a ray and the robot’s representation of the environment.</p> </section> <section id="control-and-feedback"> <h4>Control and Feedback<a class="headerlink" href="#control-and-feedback" title="Permalink to this heading"></a></h4> <p>The Self-Right command now provides feedback in the <code class="docutils literal notranslate"><span class="pre">SelfRightCommand.Feedback</span></code> message as to whether it has successfully completed.</p> <p>When Stand commands come to rest at their final pose, they will now enter a “frozen” state with locked joints. This keeps the robot more stationary for sensor data collection. Disturbances will still cause the robot to adjust and react to recover its position. The status of this “frozen” state is provided by the new <code class="docutils literal notranslate"><span class="pre">StandingState</span></code> enum in <code class="docutils literal notranslate"><span class="pre">StandCommand.Feedback</span></code>.</p> <p>A new option, <code class="docutils literal notranslate"><span class="pre">enable_robot_locomotion</span></code> has been added to <code class="docutils literal notranslate"><span class="pre">ConstrainedManipulationCommand.Request</span></code>. When set to true, the robot will take steps to keep the hand in the workspace during a constrained manipulation command.</p> <p>A new message, <code class="docutils literal notranslate"><span class="pre">BodyAssistForManipulation</span></code>, has been added to the BodyControlParams to allow clients to specify whether the body height or yaw should be used to assist the arm in manipulation. This new option cannot be used together with body offset trajectories specified in the <code class="docutils literal notranslate"><span class="pre">base_offset_rt_footprint</span></code> field.</p> </section> <section id="python-helpers"> <h4>Python Helpers<a class="headerlink" href="#python-helpers" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">image.depth_image_to_pointcloud()</span></code> to convert depth images to numpy point clouds.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">image_service_helpers.convert_RGB_to_grayscale()</span></code> to convert color images to grayscale.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">math_helpers</span></code> now includes <code class="docutils literal notranslate"><span class="pre">Vec2</span></code> and <code class="docutils literal notranslate"><span class="pre">Vec3</span></code> objects.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">robot_command.arm_joint_move_helper()</span></code> constructs RobotCommands for joint trajectories.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">robot_command.blocking_sit()</span></code> and <code class="docutils literal notranslate"><span class="pre">robot_command.blocking_selfright()</span></code> command sit and self-right commands and block until they complete.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">robot_command.block_for_trajectory_cmd()</span></code> will block until the feedback for a given body trajectory command indicates that it is complete.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">util.add_payload_credentials_arguments()</span></code> adds a <code class="docutils literal notranslate"><span class="pre">–payloads-credentials-file</span></code> argument that can be used in place of the <code class="docutils literal notranslate"><span class="pre">–guid</span></code> and <code class="docutils literal notranslate"><span class="pre">–secret</span></code> arguments. This simplifies deployment to payload computers that contain a file with the correct credentials.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">util.read_payload_credentials()</span></code> reads payload GUID and secret values from a file for use with payload registration and authentication.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">util.get_guid_and_secret()</span></code> is a helper that will return the guid and secret, regardless of if the user used <code class="docutils literal notranslate"><span class="pre">–guid</span></code> and <code class="docutils literal notranslate"><span class="pre">--secret</span></code> or <code class="docutils literal notranslate"><span class="pre">--payload-credentials-file</span></code>.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">world_object.draw_sphere()</span></code> and <code class="docutils literal notranslate"><span class="pre">world_object.draw_oriented_bounding_box()</span></code> can be used to set objects in the world object service for debugging purposes.</p></li> </ul> </section> <section id="id93"> <h4>Choreography<a class="headerlink" href="#id93" title="Permalink to this heading"></a></h4> <p>A new <code class="docutils literal notranslate"><span class="pre">ListAllSequences</span></code> RPC allows clients to list all of the available sequences that are known to the robot and can be executed.</p> </section> <section id="id94"> <h4>Missions<a class="headerlink" href="#id94" title="Permalink to this heading"></a></h4> <p>A new node type, <code class="docutils literal notranslate"><span class="pre">ClearBehaviorFaults</span></code> will allow a mission to autonomously clear behavior faults when desired.</p> </section> </section> <section id="id95"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id95" title="Permalink to this heading"></a></h3> <p>In the python client library the <a class='reference internal' href='/python/bosdyn-client/src/bosdyn/client/lease'><span class="doc">LeaseKeepAlive</span></a> context manager continually sends RetainLease commands to the robot to keep ownership of a lease. It has been upgraded to support more complete lease management by acquiring the lease if it is not owned when created and an option to return it when it exits. To preserve backwards compatibility, the initial acquisition is allowed to fail, and it does not return it by default. There are two options that control this behavior: <code class="docutils literal notranslate"><span class="pre">must_acquire=True</span></code> means that any exceptions that are raised during acquisition are not caught and are raised to the code creating the keep-alive, and <code class="docutils literal notranslate"><span class="pre">return_at_exit=True</span></code> means that the lease will be returned when exiting or shutting down the keep-alive. Both of these options default to <code class="docutils literal notranslate"><span class="pre">False</span></code> currently.</p> <p>Arm joint trajectories now include self-collision avoidance to prevent hitting the body or payload with the arm.</p> <p>The DockProperties of the docks from the World Object Service have an additional <code class="docutils literal notranslate"><span class="pre">from_prior</span></code> field that can indicate when that particular object comes from prior map knowledge and was not directly detected. Docking Feedback includes a new failure case <code class="docutils literal notranslate"><span class="pre">STATUS_ERROR_UNREFINED_PRIOR</span></code>, for situations in which the dock prior could not be confirmed as a real dock.</p> <p>Certain commands may be unavailable when the robot is docked (such as rolling over to change the battery). In those cases, the command response will fail with the new <code class="docutils literal notranslate"><span class="pre">STATUS_DOCKED</span></code>.</p> <p>Many gRPC services on the robot have now enabled support gRPC compression, which will be used if the client gRPC library supports it.</p> <p>The <code class="docutils literal notranslate"><span class="pre">bosdyn.client</span></code> <code class="docutils literal notranslate"><span class="pre">metrics</span></code> command will print the metrics correctly again.</p> <section id="id96"> <h4>Graph Nav<a class="headerlink" href="#id96" title="Permalink to this heading"></a></h4> <p>When localizing to a graph nav map, the <code class="docutils literal notranslate"><span class="pre">SetLocalization</span></code>, <code class="docutils literal notranslate"><span class="pre">UploadGraph</span></code>, and <code class="docutils literal notranslate"><span class="pre">UploadWaypointSnapshot</span></code> RPCs can fail with the new <code class="docutils literal notranslate"><span class="pre">STATUS_INCOMPATIBLE_SENSORS</span></code> if the map was recorded using a different sensor setup than the robot currently has onboard. For example, if the map was recorded with a lidar scanner, and the robot does not currently have one equipped. For <code class="docutils literal notranslate"><span class="pre">UploadWaypointSnapshot</span></code>, the new status enum will not be known to clients using older versions of the SDK and thus they will not recognize it as an error. The new <code class="docutils literal notranslate"><span class="pre">SensorCompatibilityStatus</span></code> in the responses will report whether the map and/or robot have lidar data for these error cases.</p> <p>Clearing the map when in the middle of recording would break the recording process. Requesting to clear the map in this case will now return <code class="docutils literal notranslate"><span class="pre">STATUS_RECORDING</span></code>. Clients using older versions of the SDK will not know about this new status field and will not treat it as an error case.</p> </section> <section id="spot-check"> <h4>Spot Check<a class="headerlink" href="#spot-check" title="Permalink to this heading"></a></h4> <p>Spot Check now has two extra states that it can report being in: <code class="docutils literal notranslate"><span class="pre">STATE_GRIPPER_CAL</span></code> and <code class="docutils literal notranslate"><span class="pre">STATE_SIT_DOWN_AFTER_RUN</span></code>. It also has two extra error types it can detect and report: <code class="docutils literal notranslate"><span class="pre">ERROR_GRIPPER_CAL_TIMEOUT</span></code> as a top-level error and <code class="docutils literal notranslate"><span class="pre">ERROR_INVALID_RANGE_OF_MOTION</span></code> for joints.</p> </section> </section> <section id="id97"> <h3>Deprecations<a class="headerlink" href="#id97" title="Permalink to this heading"></a></h3> <p>Automatic data buffer logging of gRPC messages is deprecated. The gRPC messages will continue to be available for download via HTTP in 3.1, but support will be removed in a future release.</p> <p>FollowArmCommand’s <code class="docutils literal notranslate"><span class="pre">disable_walking</span></code> is deprecated. To reproduce the robot’s behavior of <code class="docutils literal notranslate"><span class="pre">disable_walking</span> <span class="pre">==</span> <span class="pre">true</span></code>, issue a StandCommand setting the <code class="docutils literal notranslate"><span class="pre">enable_body_yaw_assist_for_manipulation</span></code> and <code class="docutils literal notranslate"><span class="pre">enable_hip_height_assist_for_manipulation</span></code> MobilityParams to true. Any combination of the <code class="docutils literal notranslate"><span class="pre">enable_*_for_manipulation</span></code> are accepted in stand giving finer control of the robot’s behavior.</p> <p>When commanding door opening, the options <code class="docutils literal notranslate"><span class="pre">SWING_DIRECTION_INSWING</span></code> and <code class="docutils literal notranslate"><span class="pre">SWING_DIRECTION_OUTSWING</span></code> have been renamed to <code class="docutils literal notranslate"><span class="pre">SWING_DIRECTION_PULL</span></code> and <code class="docutils literal notranslate"><span class="pre">SWING_DIRECTION_PUSH</span></code>.</p> <p>The signature of <code class="docutils literal notranslate"><span class="pre">CameraInterface.image_decode()</span></code> for user image services has changed from passing individual parameters such as <code class="docutils literal notranslate"><span class="pre">image_format</span></code> and <code class="docutils literal notranslate"><span class="pre">quality_percent</span></code> to directly passing in the image request proto. This change makes it easier to add new options to image requests without breaking existing image service implementations. Services can access the previous parameters via the image request proto, as well as accessing new parameters such as <code class="docutils literal notranslate"><span class="pre">pixel_format</span></code> and <code class="docutils literal notranslate"><span class="pre">resize_ratio</span></code>.</p> <p>The <code class="docutils literal notranslate"><span class="pre">–username</span></code> and <code class="docutils literal notranslate"><span class="pre">–password</span></code> command line options are deprecated in the Python SDK. There are security concerns with using usernames and passwords on the command line. Instead of using <code class="docutils literal notranslate"><span class="pre">bosdyn.client.util.add_common_arguments(parser)</span></code> we recommend using <code class="docutils literal notranslate"><span class="pre">bosdyn.client.util.add_base_arguments(parser)</span></code> which will not include those options, and then authenticating via <code class="docutils literal notranslate"><span class="pre">bosdyn.client.util.authenticate(robot)</span></code>, which will read from the <code class="docutils literal notranslate"><span class="pre">BOSDYN_CLIENT_USERNAME</span></code> and <code class="docutils literal notranslate"><span class="pre">BOSDYN_CLIENT_PASSWORD</span></code> environment variables. The <code class="docutils literal notranslate"><span class="pre">bosdyn.client</span></code> and <code class="docutils literal notranslate"><span class="pre">bosdyn.client.bddf_download</span></code> programs will continue to support the old options for now but usage should be switched to the environment variable method instead.</p> <p>We have changed the <a class='reference external' href='/python/bosdyn-client/src/bosdyn/client/lease#bosdyn.client.lease.LeaseKeepAlive'>LeaseKeepAlive</a> helper to handle more of the lease life-cycle management, where it can acquire and return the lease itself. However, we have kept its default behavior largely unchanged for now to not break existing code. In a future release we may change the defaults for <code class="docutils literal notranslate"><span class="pre">return_at_exit</span></code> and <code class="docutils literal notranslate"><span class="pre">must_acquire</span></code> to <code class="docutils literal notranslate"><span class="pre">True</span></code>. Applications that desire the previous behavior should explicitly set <code class="docutils literal notranslate"><span class="pre">must_acquire</span></code> and <code class="docutils literal notranslate"><span class="pre">return_at_exit</span></code> to <code class="docutils literal notranslate"><span class="pre">False</span></code> to preserve that behavior across a change in the defaults.</p> <p>The <code class="docutils literal notranslate"><span class="pre">DARK</span></code> option for auto white balance for the Spot CAM stream has been deprecated.</p> <section id="renamed-functions-and-classes"> <h4>Renamed functions and classes<a class="headerlink" href="#renamed-functions-and-classes" title="Permalink to this heading"></a></h4> <p>The original names still exist, but are deprecated.</p> <p><code class="docutils literal notranslate"><span class="pre">bosdyn.client.graph_nav.UnrecongizedCommandError</span></code> has been renamed to <code class="docutils literal notranslate"><span class="pre">bosdyn.client.graph_nav.UnrecognizedCommandError</span></code>.</p> <p><code class="docutils literal notranslate"><span class="pre">bosdyn.bddf.message_reader.channel_name_to_series_decriptor()</span></code> has been renamed to <code class="docutils literal notranslate"><span class="pre">bosdyn.bddf.message_reader.channel_name_to_series_descriptor()</span></code></p> <p>The <code class="docutils literal notranslate"><span class="pre">from_obj()</span></code> methods on the math helper classes have been renamed to <code class="docutils literal notranslate"><span class="pre">from_proto()</span></code>.</p> </section> </section> <section id="id98"> <h3>Breaking Changes<a class="headerlink" href="#id98" title="Permalink to this heading"></a></h3> <section id="behavior-change-on-lease-timeout"> <h4>Behavior change on lease timeout<a class="headerlink" href="#behavior-change-on-lease-timeout" title="Permalink to this heading"></a></h4> <p>Because leases are no longer revoked when the owner fails to check in, there are two changes that must be accounted for:</p> <ol class="simple"> <li><p>The robot will not automatically sit down and power off if the owner times out. It will still sit down and power off if an E-stop endpoint times out. For use cases that want the owner’s absence to cause the robot to sit and power off, make sure that the owner is also maintaining an E-stop endpoint.</p></li> <li><p>Any client calling <code class="docutils literal notranslate"><span class="pre">ListLeases</span></code> to try to determine if the robot is owned will need to check the <code class="docutils literal notranslate"><span class="pre">stale_time</span></code> of the <code class="docutils literal notranslate"><span class="pre">LeaseResource</span></code>. Instead of calling <code class="docutils literal notranslate"><span class="pre">ListLeases</span></code> before <code class="docutils literal notranslate"><span class="pre">AcquireLease</span></code>, we recommend just calling <code class="docutils literal notranslate"><span class="pre">AcquireLease</span></code> first, and reacting to any <code class="docutils literal notranslate"><span class="pre">STATUS_RESOURCE_ALREADY_CLAIMED</span></code> status in the response.</p></li> </ol> </section> <section id="behavior-change-of-powering-off-on-stairs"> <h4>Behavior change of powering off on stairs<a class="headerlink" href="#behavior-change-of-powering-off-on-stairs" title="Permalink to this heading"></a></h4> <p>The new safety features to avoid powering off and sliding down stairs means that there is a behavioral change to SafePowerOff commands, powering off due to low battery, and powering off due to an E-stop <code class="docutils literal notranslate"><span class="pre">LEVEL_SETTLE_THEN_CUT</span></code>. While the new behavior should be safer, be aware that these commands will now cause locomotion before sitting and powering off.</p> </section> <section id="disallowed-commands"> <h4>Disallowed Commands<a class="headerlink" href="#disallowed-commands" title="Permalink to this heading"></a></h4> <p>The robot may not be commanded to go to the battery change pose when docked.</p> <p>The Graph Nav map may not be cleared in the middle of recording.</p> </section> <section id="id99"> <h4>Data Acquisition<a class="headerlink" href="#id99" title="Permalink to this heading"></a></h4> <p>The DataAcquisitionStore service is queryable for the IDs of items that have been stored by it. It would previously track everything that had been stored since the last time that the robot had been restarted. As of 3.1, it will track only the last 10,000 items stored.</p> </section> </section> <section id="id100"> <h3>Dependencies<a class="headerlink" href="#id100" title="Permalink to this heading"></a></h3> <p>The <code class="docutils literal notranslate"><span class="pre">bosdyn-client</span></code> package no longer depends on <code class="docutils literal notranslate"><span class="pre">requests</span></code>.</p> </section> <section id="id101"> <h3>Known Issues<a class="headerlink" href="#id101" title="Permalink to this heading"></a></h3> <p><strong>When a network transport failure occurs,</strong> depending on the particular operating system and version of gRPC installed, the error from the python SDK may not always be the most specific error possible, such as <code class="docutils literal notranslate"><span class="pre">UnknownDnsNameError</span></code>. It may instead be raised as either a generic <code class="docutils literal notranslate"><span class="pre">RpcError</span></code>, or another generic failure type such as <code class="docutils literal notranslate"><span class="pre">UnableToConnectToRobotError</span></code>.</p> <p><strong>Spot CAM LED illumination levels</strong> are not currently recorded or played back in Autowalk missions.</p> <p><strong>If you write a custom data acquisition plugin or image service,</strong> do not change its <code class="docutils literal notranslate"><span class="pre">DataAcquisitionCapability</span></code> or <code class="docutils literal notranslate"><span class="pre">ImageSource</span></code> set once it is running and registered. New capabilities may not be detected, and old capabilities may still be listed as available in the Data Acquisition service. To change the capabilities of a service: unregister it from the directory, wait until its capabilities are no longer listed in the Data Acquisition service, and then re-register it. This waiting also applies to restarting a service if its capabilities will be different upon restart.</p> <p><strong>If you write a custom data acquisition plugin without using our helper class,</strong> its <code class="docutils literal notranslate"><span class="pre">GetStatus()</span></code> RPC is expected to complete immediately. If it takes too long to complete it can cause timeouts when requesting <code class="docutils literal notranslate"><span class="pre">GetStatus()</span></code> of the data acquisition service.</p> <p><strong>If you register a new service with the robot</strong>, calling <code class="docutils literal notranslate"><span class="pre">robot.ensure_client()</span></code> to create a client for that service may result in a <code class="docutils literal notranslate"><span class="pre">UnregisteredServiceNameError</span></code>.</p> <ul class="simple"> <li><p>Workaround: call <code class="docutils literal notranslate"><span class="pre">robot.sync_with_directory()</span></code> before <code class="docutils literal notranslate"><span class="pre">robot.ensure_client()</span></code></p></li> </ul> <p><strong>SE2VelocityLimits require care</strong>. Correct usage of the <code class="docutils literal notranslate"><span class="pre">SE2VelocityLimit</span></code> message requires the user to fully fill out all the fields, setting unlimited values to a large number, say 1e6.</p> </section> <section id="id102"> <h3>Sample Code<a class="headerlink" href="#id102" title="Permalink to this heading"></a></h3> <p>All examples have been changed to read the username and password from environment variables instead of taking <code class="docutils literal notranslate"><span class="pre">--username</span></code> and <code class="docutils literal notranslate"><span class="pre">--password</span></code> arguments.</p> <p>Additionally, most examples now use the LeaseKeepAlive for complete lease management by setting the <code class="docutils literal notranslate"><span class="pre">must_acquire</span></code> and <code class="docutils literal notranslate"><span class="pre">return_at_exit</span></code> arguments to <code class="docutils literal notranslate"><span class="pre">True</span></code> at construction. This helps ensure that the lease is properly returned when the example is complete.</p> <p>The arm and manipulation examples have been updated to use the new <code class="docutils literal notranslate"><span class="pre">block_until_arm_arrives()</span></code> helper instead of <code class="docutils literal notranslate"><span class="pre">sleep()</span></code> calls.</p> <p>The included Dockerfiles now contain default command line arguments for their entrypoints where appropriate. This means that it is not necessary to specify any command line arguments when running them in their default configuration (on the Spot CORE). However when running in a non-default configuration, <em>all</em> command line arguments will need to be specified.</p> <p><a class='reference internal' href='/python/examples/comms_mapping/readme'><span class="doc">Comms Mapping (new)</span></a> Creates an image service that can be selected on the tablet controller that displays a map of wifi signal strength.</p> <p><a class='reference internal' href='/python/examples/gripper_camera_params/readme'><span class="doc">Gripper Camera Params (new)</span></a> Demonstrates how to control the capture parameters for the gripper camera.</p> <p><a class='reference internal' href='/python/examples/ray_cast/readme'><span class="doc">Ray Cast (new)</span></a> Demonstrates how to perform ray-casting queries using the new RayCastService.</p> <p><a class='reference internal' href='/python/examples/animation_recorder/readme'><span class="doc">Animation Recorder (updated)</span></a> First checks if the robot has the correct license for choreography.</p> <p><a class='reference internal' href='/python/examples/arm_force_control/readme'><span class="doc">Arm Force Control (updated)</span></a> Updated to use the new <code class="docutils literal notranslate"><span class="pre">BodyAssistForManipulation</span></code> parameters.</p> <p><a class='reference internal' href='/python/examples/arm_gcode/readme'><span class="doc">Arm Gcode (updated)</span></a> Some updates to parsing gcode files. Added a new <code class="docutils literal notranslate"><span class="pre">--test-file-parsing</span></code> option to only try to read the file, without executing it.</p> <p><a class='reference internal' href='/python/examples/arm_joint_move/readme'><span class="doc">Arm joint move (updated)</span></a> Added a more advanced example that shows how to send a continuous trajectory with many points.</p> <p><a class='reference internal' href='/python/examples/bddf_download/readme'><span class="doc">BDDF download (updated)</span></a> Fixed the ping check on Windows.</p> <p><a class='reference internal' href='/python/examples/data_acquisition_service/readme'><span class="doc">Data Acquisition (updated)</span></a> Includes a new example plugin that saves battery data. This is used as part of the <a class='reference internal' href='/docs/python/daq_tutorial/daq1'><span class="doc">Data Collection Tutorial</span></a></p> <p><a class='reference internal' href='/python/examples/get_image/readme'><span class="doc">Get Image (updated)</span></a> Supports a new <code class="docutils literal notranslate"><span class="pre">--pixel-format</span></code> option to be able to specify the desired format.</p> <p><a class='reference internal' href='/python/examples/graph_nav_command_line/readme'><span class="doc">Graph Nav Command Line (updated)</span></a> The recording example correctly handles the <code class="docutils literal notranslate"><span class="pre">NotReadyYetError</span></code> response when stopping recording.</p> <p><a class='reference internal' href='/python/examples/ricoh_theta/readme'><span class="doc">Ricoh Theta (updated)</span></a> Includes support for pixel format and resize ratio.</p> <p><a class='reference internal' href='/python/examples/spot_cam/readme'><span class="doc">Spot CAM (updated)</span></a> Fixed a memory leak related to audio streams.</p> <p><a class='reference internal' href='/python/examples/tester_programs/readme'><span class="doc">Tester Programs (updated)</span></a> The image service tester only requests image and pixel formats that the service reports that it supports, and it will check that the returned type matches the requested type. It will also report a summary at the end of all errors and warnings it found.</p> <p><a class='reference internal' href='/python/examples/upload_choreographed_sequence/readme'><span class="doc">Upload Choreographed Sequence (updated)</span></a> Checks that the robot is correctly licensed for choreography before running. Includes a new <code class="docutils literal notranslate"><span class="pre">--upload-only</span></code> option that will upload the sequence without running it.</p> <p><a class='reference internal' href='/python/examples/visualizer/readme'><span class="doc">Basic Streaming Visualizer (updated)</span></a> Added an example to draw gripper depth data as a point cloud.</p> <p><a class='reference internal' href='/python/examples/service_customization/custom_parameter_image_server/readme'><span class="doc">Web Cam Image Service (updated)</span></a> Includes support for pixel format and resize ratio.</p> <p><a class='reference internal' href='/python/examples/world_object_mutations/readme'><span class="doc">World Object Mutations (updated)</span></a> Demonstrate using the new drawing helper.</p> <p><a class='reference internal' href='/python/examples/xbox_controller/readme'><span class="doc">Xbox Controller (updated)</span></a> Cleaner lease usage throughout.</p> </section> </section> <section id="id103"> <h2>3.0.3<a class="headerlink" href="#id103" title="Permalink to this heading"></a></h2> <section id="id104"> <h3>Bug fixes and improvements<a class="headerlink" href="#id104" title="Permalink to this heading"></a></h3> <p>Reduced RPC calls to the Fault service in <code class="docutils literal notranslate"><span class="pre">image_service_helpers.py</span></code>.</p> <p>Example documentation cleanup and improvements.</p> </section> <section id="id105"> <h3>Known Issues<a class="headerlink" href="#id105" title="Permalink to this heading"></a></h3> <p>Same as 3.0.0</p> </section> </section> <section id="id106"> <h2>3.0.2<a class="headerlink" href="#id106" title="Permalink to this heading"></a></h2> <section id="id107"> <h3>New Features<a class="headerlink" href="#id107" title="Permalink to this heading"></a></h3> <p>Added <code class="docutils literal notranslate"><span class="pre">GetSystemLog</span></code> RPC in SpotCAM Health service to retrieve an encrypted log of system events, for factory diagnosis of possible issues.</p> </section> <section id="id108"> <h3>Bug fixes and improvements<a class="headerlink" href="#id108" title="Permalink to this heading"></a></h3> <p>Fixed UploadEdgeSnapshot typo in GraphNav client.</p> <p>Fixed usage of <code class="docutils literal notranslate"><span class="pre">SE2Trajectory</span></code> robot commands in mission service.</p> </section> <section id="id109"> <h3>Known Issues<a class="headerlink" href="#id109" title="Permalink to this heading"></a></h3> <p>Same as 3.0.0</p> </section> </section> <section id="id110"> <h2>3.0.1<a class="headerlink" href="#id110" title="Permalink to this heading"></a></h2> <section id="id111"> <h3>New Features<a class="headerlink" href="#id111" title="Permalink to this heading"></a></h3> <p>Added <code class="docutils literal notranslate"><span class="pre">COLORMAP_INFERNO</span></code> and <code class="docutils literal notranslate"><span class="pre">COLORMAP_TURBO</span></code> as SpotCAM IR color map options.</p> </section> <section id="id112"> <h3>Bug fixes and improvements<a class="headerlink" href="#id112" title="Permalink to this heading"></a></h3> <p>The new <code class="docutils literal notranslate"><span class="pre">base_tform_sensor</span></code> fields in SpotCAM protos have the transform in the right direction. The old <code class="docutils literal notranslate"><span class="pre">base_tfrom_sensor</span></code> fields, now deprecated, had the inverse transform.</p> </section> <section id="id113"> <h3>Deprecations<a class="headerlink" href="#id113" title="Permalink to this heading"></a></h3> <p>Deprecated field <code class="docutils literal notranslate"><span class="pre">base_tfrom_sensor</span></code> in SpotCAM camera proto and added field <code class="docutils literal notranslate"><span class="pre">base_tform_sensor</span></code> so it follows the intended naming convention.</p> <p>Deprecated field <code class="docutils literal notranslate"><span class="pre">base_tfrom_sensor</span></code> in SpotCAM logging proto and added field <code class="docutils literal notranslate"><span class="pre">base_tform_sensor</span></code> so it follows the intended naming convention.</p> <p>Deprecated the <code class="docutils literal notranslate"><span class="pre">decode_token()</span></code> and <code class="docutils literal notranslate"><span class="pre">log_token_time_remaining()</span></code> functions in <code class="docutils literal notranslate"><span class="pre">bosdyn.client.sdk</span></code>. The SDK no longer supports decoding tokens. If you need to decode one, use pyjwt directly.</p> </section> <section id="id114"> <h3>Known Issues<a class="headerlink" href="#id114" title="Permalink to this heading"></a></h3> <p>Same as 3.0.0</p> </section> <section id="id115"> <h3>Sample Code<a class="headerlink" href="#id115" title="Permalink to this heading"></a></h3> <p><a class='reference internal' href='/python/examples/arm_constrained_manipulation/readme'><span class="doc">Arm Constrained Manipulation (updated)</span></a> Cleanup to clamp normalized velocity and also use normalized velocity for knob.</p> <p><a class='reference internal' href='/python/examples/graph_nav_command_line/readme'><span class="doc">GraphNav Command Line (updated)</span></a> Improved handling in certain failure cases</p> <p><a class='reference internal' href='/python/examples/spot_cam/readme'><span class="doc">Spot Cam (updated)</span></a> Handle new IR color map options and removed the usage of the deprecated pose fields</p> </section> </section> <section id="id116"> <h2>3.0.0<a class="headerlink" href="#id116" title="Permalink to this heading"></a></h2> <section id="id117"> <h3>New Features<a class="headerlink" href="#id117" title="Permalink to this heading"></a></h3> <section id="id118"> <h4>Graph Nav<a class="headerlink" href="#id118" title="Permalink to this heading"></a></h4> <p><strong>Map Processing</strong> The new map processing service provides two ways to process the data in a graph nav map:</p> <ul class="simple"> <li><p>adding new waypoints and edges to close loops and add connections in a map</p></li> <li><p>optimizing “anchorings” of a map, which will generate optimized positions of waypoints in the world for display or navigation.</p></li> </ul> <p><strong>Navigate to Anchor</strong> A new NavigateToAnchor RPC can be used to command GraphNav to drive the robot to a specific place in an anchoring. GraphNav will find the waypoint that has the shortest path length from the robot’s current position but is still close to the goal.</p> <p>See the <a class='reference internal' href='/docs/concepts/autonomy/graphnav_map_structure'><span class="doc">Graph Nav</span></a> documentation for more information.</p> </section> <section id="auto-return"> <h4>Auto Return<a class="headerlink" href="#auto-return" title="Permalink to this heading"></a></h4> <p>Auto Return is a service which can be configured to take control of the robot in the event of a communication loss, and return it back along its recently traveled route to attempt to regain communications with its user. See the <a class='reference internal' href='/docs/concepts/autonomy/auto_return'><span class="doc">Auto Return</span></a> documentation for more details.</p> </section> <section id="id119"> <h4>Choreography<a class="headerlink" href="#id119" title="Permalink to this heading"></a></h4> <p>The Choreography API now provides ‘choreography logging’ which will capture timestamped data about the robot’s pose and joint state for either a user defined time period or for the duration of a dance. See the <a class='reference internal' href='/docs/concepts/choreography/choreography_service'><span class="doc">Choreography Service</span></a> documentation for more details.</p> <p>Users can now create animated moves using timestamped keyframes; these can be built through common animation software (like Autodesk Maya), handwritten, or constructed from choreography log data. The animated moves can be uploaded to the robot and used within dances like the base moves. See the <a class='reference internal' href='/docs/concepts/choreography/animations_in_choreographer'><span class="doc">Animations Overview</span></a> documentation for more details.</p> </section> <section id="constrained-manipulation"> <h4>Constrained manipulation<a class="headerlink" href="#constrained-manipulation" title="Permalink to this heading"></a></h4> <p>The constrained manipulation API provides the functionality to manipulate objects such as cranks, levers, cabinets and other similar objects with Spot. The API allows for the selection of a task type along with the desired task velocity to manipulate the object.</p> </section> <section id="pushbar-door-opening"> <h4>Pushbar Door Opening<a class="headerlink" href="#pushbar-door-opening" title="Permalink to this heading"></a></h4> <p>API and tablet support for opening pushbar doors. The AutoPush API command takes a push point which the robot uses to detect the door and push it open at the specified location. See door.proto or arm_door.py for more details.</p> </section> <section id="spotcam"> <h4>SpotCam<a class="headerlink" href="#spotcam" title="Permalink to this heading"></a></h4> <p>New SetPtzFocus and GetPtzFocus RPCs allow for control over the focus of the PTZ camera.</p> </section> <section id="id120"> <h4>Payloads<a class="headerlink" href="#id120" title="Permalink to this heading"></a></h4> <p>Payload registration now supports mounting payloads to the wrist or gripper of the arm. The new MountFrameName enum contains the valid mounting locations.</p> <p>A new UpdatePayloadAttached RPC allows for attaching and detaching payloads while the robot is operating.</p> </section> <section id="id121"> <h4>Missions<a class="headerlink" href="#id121" title="Permalink to this heading"></a></h4> <p>Missions have a new <code class="docutils literal notranslate"><span class="pre">STATUS_STOPPED</span></code> state that can be triggered by the new <code class="docutils literal notranslate"><span class="pre">StopMission</span></code> RPC. This state differs from a paused mission in that it means that the mission is no longer running and cannot be resumed.</p> <p>New mission node types:</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">BosdynNavigateRoute</span></code>: Use GraphNav via NavigateRoute</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">BosdynRecordEvent</span></code>: Record an API event in the data buffer.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">SpotCamLed</span></code>: Change the brightnesses of the LEDs on a SpotCam.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">SpotCamResetAutofocus</span></code>: Reset the autofocus on a SpotCam PTZ.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">StoreMetadata</span></code>: Attach metadata to some data stored by a DataAcquisition node.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">RetainLease</span></code>: Keep mission leases alive while the mission is running. This allows the mission to run a larger variety of missions without requiring the mission service’s client to keep the lease alive.</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">RestartWhenPaused</span></code>: Restarts its child tree when a mission resumes, rather than resuming its child from the state it was in when it paused.</p></li> </ul> </section> <section id="enable-and-disable-ir-emitters"> <h4>Enable and Disable IR Emitters<a class="headerlink" href="#enable-and-disable-ir-emitters" title="Permalink to this heading"></a></h4> <p>A new <code class="docutils literal notranslate"><span class="pre">IREnableDisable</span></code> service and request have been added. This request allows clients to enable/disable the robot’s IR light emitters in the body and hand sensors. This new service supports special situations where Spot’s emitters may interfere with a custom attached payload. Disabling the IR emission will cause a SystemFault to be raised and have a negative effect on mobility since the robot’s perception system is hindered.</p> </section> </section> <section id="id122"> <h3>Bug fixes and improvements<a class="headerlink" href="#id122" title="Permalink to this heading"></a></h3> <section id="id123"> <h4>Graph Nav<a class="headerlink" href="#id123" title="Permalink to this heading"></a></h4> <p>For RPCs that can fail because the robot is impaired, the response message now includes a RobotImpairedState message providing details about the nature of the impairment.</p> <p>NavigationFeedbackStatus now includes body_movement_status to make it simple to determine when the body has come to rest after completing navigation.</p> <p>Directed exploration and alternate route finding can now be disabled using new fields in TravelParams.</p> <p>RouteFollowingParams have been added to NavigateRouteRequest to specify the desired behavior in certain situations (not starting from the start of the route, resuming a route, and becoming blocked on a route).</p> <p>New methods <code class="docutils literal notranslate"><span class="pre">navigate_to_full()</span></code> and <code class="docutils literal notranslate"><span class="pre">navigate_route_full()</span></code> has been added to the Graph Nav client which will return the full response instead of just the command id.</p> <p>Additional statuses have been added to NavigateRouteResponse (<code class="docutils literal notranslate"><span class="pre">STATUS_NO_PATH</span></code> and <code class="docutils literal notranslate"><span class="pre">STATUS_NOT_LOCALIZED_TO_MAP</span></code>) to capture possible errors.</p> <p>UploadGraph can fail with <code class="docutils literal notranslate"><span class="pre">STATUS_INVALID_GRAPH</span></code> when the specified graph is invalid, for example containing missing waypoints referenced by edges.</p> <p>DownloadWaypointSnapshotRequest has an additional option to not include point cloud data. The new has_remote_point_cloud_sensor field in WaypointSnapshot indicates that the point has point cloud data from a remote service.</p> <p>Starting to record a new map can fail with the new status <code class="docutils literal notranslate"><span class="pre">STATUS_TOO_FAR_FROM_EXISTING_MAP</span></code>.</p> <p>The RPC for creating a new waypoint can now be provided a list of world objects to include in that waypoint’s snapshot.</p> </section> <section id="id124"> <h4>Missions<a class="headerlink" href="#id124" title="Permalink to this heading"></a></h4> <p>For very large missions, a new RPC has been added to the mission service to stream the mission to the robot in chunks, rather than as a single message. The chunks should still deserialize to the same LoadMissionRequest message when assembled.</p> <p>When a mission node fails to compile, the resulting FailedNode message has a new string that lists the protobuf type of the node implementation.</p> </section> <section id="arm-and-gripper-control"> <h4>Arm and Gripper Control<a class="headerlink" href="#arm-and-gripper-control" title="Permalink to this heading"></a></h4> <p>We have improved the feedback for ArmJointMoveCommand Requests to now include the status of the underlying trajectory planner and to return the planner’s solved trajectory, which is the trajectory the robot will execute.</p> <p>The ManipulationFeedbackState contains extra enum values for additional placing states that the robot can be in during manipulation.</p> <p>By default, the robot will assume all grasped items are not “carriable”. We have modified ApiGraspOverride to be able to override the carry state to one of <code class="docutils literal notranslate"><span class="pre">CARRIABLE</span></code>, <code class="docutils literal notranslate"><span class="pre">NOT_CARRIABLE</span></code>, or <code class="docutils literal notranslate"><span class="pre">CARRIABLE_AND_STOWABLE</span></code>.</p> <p>If holding an item, the stowing behavior is:</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">NOT_CARRIABLE</span></code> and <code class="docutils literal notranslate"><span class="pre">CARRIABLE</span></code> - The arm will not stow, instead it will stop</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">CARRIABLE_AND_STOWABLE</span></code> - The arm will stow while continuing to grasp the item</p></li> </ul> <p>In addition, the communication loss behavior of the arm when it is holding an item is also modified:</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">NOT_CARRIABLE</span></code> - The arm will release the item and stow</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">CARRIABLE</span></code> - The arm will not stow, instead entering stop</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">CARRIABLE_AND_STOWABLE</span></code> - The arm will stow while continuing to grasp the item</p></li> </ul> </section> <section id="docking"> <h4>Docking<a class="headerlink" href="#docking" title="Permalink to this heading"></a></h4> <p>The docking state includes additional “in-between” states, <code class="docutils literal notranslate"><span class="pre">DOCK_STATUS_UNDOCKING</span></code> and <code class="docutils literal notranslate"><span class="pre">LINK_STATUS_DETECTING</span></code> that indicate that a process is still ongoing. Additional errors have been added to DockingCommandResponse for particular ways that docking can fail (<code class="docutils literal notranslate"><span class="pre">STATUS_ERROR_GRIPPER_HOLDING_ITEM</span></code>, <code class="docutils literal notranslate"><span class="pre">STATUS_ERROR_NOT_AVAILABLE</span></code>, <code class="docutils literal notranslate"><span class="pre">STATUS_ERROR_SYSTEM</span></code>). The feedback also has a new error status: <code class="docutils literal notranslate"><span class="pre">STATUS_ERROR_NOT_AVAILABLE</span></code>. See the <a class='reference external' href='/protos/bosdyn/api/proto_reference#bosdyn-api-docking-docking-proto'>protobuf documentation</a> for more details.</p> <p>The docking python client include a new <code class="docutils literal notranslate"><span class="pre">docking_command_full()</span></code> call which returns the full response instead of only the command id. Additionally a new <code class="docutils literal notranslate"><span class="pre">docking_command_feedback_full()</span></code> returns the full feedback instead of only the status.</p> </section> <section id="id125"> <h4>Network Compute Bridge<a class="headerlink" href="#id125" title="Permalink to this heading"></a></h4> <p>Models can now have a list of labels associated with them.</p> <p>When the image is requested to be rotated, the rotation angle will be returned in the response.</p> </section> <section id="id126"> <h4>Data Acquisition<a class="headerlink" href="#id126" title="Permalink to this heading"></a></h4> <p>DataAcquisitionCapabilities can now also report the plugin service name of the service that will be performing that acquisition.</p> <p>The DataAcquisitionClient has a new <code class="docutils literal notranslate"><span class="pre">acquire_data_from_request()</span></code> that takes a full request proto, instead of building it internally.</p> <p>The DataService client has been updated to have the correct service name.</p> </section> <section id="robot-commands"> <h4>Robot Commands<a class="headerlink" href="#robot-commands" title="Permalink to this heading"></a></h4> <p>Power commands can now report a <code class="docutils literal notranslate"><span class="pre">STATUS_OVERRIDDEN</span></code> if the robot overrides the power command and disables motor power.</p> <p>Power command responses and feedback will report system faults if a fault blocks the power command from succeeding.</p> <p>LeaseUseResults have been added to messages for RobotCommand and ManipulationApi</p> <p>New helpers <code class="docutils literal notranslate"><span class="pre">safe_power_off_robot()</span></code> and <code class="docutils literal notranslate"><span class="pre">safe_power_cycle_robot()</span></code> can completely power off the robot or power cycle the robot from any robot state.</p> <p>Additional options have been added to ObstacleParams for tuning obstacle avoidance by turning off negative obstacle avoidance or body assist for avoiding foot obstacles.</p> </section> <section id="leases"> <h4>Leases<a class="headerlink" href="#leases" title="Permalink to this heading"></a></h4> <p>Leases represent ownership over the robot. Leases have been updated to support ownership over only part of the robot, so that you can delegate control to different services, such as using Graph Nav to control robot mobility while simultaneously controlling the robot’s arm via a user-written script. Details are in the <a class='reference internal' href='/docs/concepts/lease_service'><span class="doc">lease documentation</span></a>, but in general users can just continue to use the “body” lease and everything will work as expected.</p> </section> <section id="other-changes"> <h4>Other Changes<a class="headerlink" href="#other-changes" title="Permalink to this heading"></a></h4> <p>The image service will now report <code class="docutils literal notranslate"><span class="pre">PixelFormat</span></code> for JPEG image sources even though the pixel format can be determined from the JPEG header.</p> <p>Spot Check has some additional failure statuses that it can report.</p> <p>Events logged to the data buffer may now include a LogPreserveHint to tell the robot whether this event is worth preserving a log for.</p> <p>RobotState now includes additional data about the terrain under each foot.</p> <p>Additional properties have been added to world objects to assist in image processing.</p> <p>An additional level of hierarchy has been added for transport-level errors to simplify most error cases. RpcError has two new subclasses: <code class="docutils literal notranslate"><span class="pre">PersistentRpcError</span></code> and <code class="docutils literal notranslate"><span class="pre">RetryableRpcError</span></code>. <code class="docutils literal notranslate"><span class="pre">PersistentRpcError</span></code> indicates an error such that attempting to retry the call will fail again. <code class="docutils literal notranslate"><span class="pre">RetryableRpcError</span></code> means that the call <em>may</em> succeed if retried.</p> <p>Calling <code class="docutils literal notranslate"><span class="pre">ensure_secure_channel()</span></code> directly will now result in max message sizes not being correctly.</p> </section> </section> <section id="id127"> <h3>Breaking Changes<a class="headerlink" href="#id127" title="Permalink to this heading"></a></h3> <p>Invalid RobotCommands will no longer result in <code class="docutils literal notranslate"><span class="pre">STATUS_INVALID_REQUEST</span></code> in the RobotCommandResponse message, but will instead use the <code class="docutils literal notranslate"><span class="pre">CODE_INVALID_REQUEST</span></code> error in the common header, like other RPCs do. In the python client library, this will still raise the same <code class="docutils literal notranslate"><span class="pre">InvalidRequestError</span></code> as before.</p> <p>E-stops may not be unregistered from the estop service while the robot’s motors are powered. This prevents accidentally powering the robot off. A new <code class="docutils literal notranslate"><span class="pre">STATUS_MOTORS_ON</span></code> status will be returned in the response to indicate this error. To unregister an estop, first safely power off the robot.</p> <p>RPCs to the AuthService and PayloadRegistration service are now rate-limited to 5 and 10 requests/second respectively. Requesting more than that will result in an HTTP 429 error, or raising the <code class="docutils literal notranslate"><span class="pre">TooManyRequestsError</span></code> if using the python client.</p> <p>The “obstacle_distance” local grid inadvertently included some generated obstacles used only for foot-placement control. These grids no longer include those generated obstacle regions.</p> <p>The python function <code class="docutils literal notranslate"><span class="pre">bosdyn.client.lease.test_active_lease</span></code> previously took an optional <code class="docutils literal notranslate"><span class="pre">make_sublease</span></code> argument. That has been replaced with an optional <code class="docutils literal notranslate"><span class="pre">sublease_name</span></code> argument so that if a sublease is desired, it gets created with a client name correctly.</p> <p>The StraightStaircase message has been moved to bosdyn/api/stairs.proto so that it can be used in more places. This is compatible with existing serialized protobufs, but any code that is manually creating these messages will need to be updated.</p> </section> <section id="id128"> <h3>Deprecations<a class="headerlink" href="#id128" title="Permalink to this heading"></a></h3> <section id="id129"> <h4>Robot Control<a class="headerlink" href="#id129" title="Permalink to this heading"></a></h4> <p>The <code class="docutils literal notranslate"><span class="pre">enable_grated_floor</span></code> field is superseded by the new <code class="docutils literal notranslate"><span class="pre">grated_surfaces_mode</span></code> which will auto-detect the need for grated surface handling.</p> <p>The <code class="docutils literal notranslate"><span class="pre">safe_power_off()</span></code> helper has been replaced by the less ambiguous <code class="docutils literal notranslate"><span class="pre">safe_power_off_motors()</span></code> helper.</p> <p>The <code class="docutils literal notranslate"><span class="pre">docking_command_feedback()</span></code> method of DockingClient incorrectly raised an exception if the docking command had encountered lease errors, and has been replaced by <code class="docutils literal notranslate"><span class="pre">docking_command_feedback_full()</span></code> which returns the full feedback response.</p> </section> <section id="id130"> <h4>Graph Nav<a class="headerlink" href="#id130" title="Permalink to this heading"></a></h4> <p>For limiting the speed on an edge, use the <code class="docutils literal notranslate"><span class="pre">vel_limit</span></code> in <code class="docutils literal notranslate"><span class="pre">mobility_params</span></code> instead of the Edge annotation’s <code class="docutils literal notranslate"><span class="pre">vel_limit</span></code>.</p> </section> <section id="id131"> <h4>Missions<a class="headerlink" href="#id131" title="Permalink to this heading"></a></h4> <p>Docking nodes should not use the child node anymore. If a mission needs to react to docking results, it should use the responses written into the blackboard by the docking node.</p> </section> <section id="id132"> <h4>Payloads<a class="headerlink" href="#id132" title="Permalink to this heading"></a></h4> <p>The <code class="docutils literal notranslate"><span class="pre">guid</span></code> and <code class="docutils literal notranslate"><span class="pre">secret</span></code> fields on payload registration RPCs have been replaced with a standardized <code class="docutils literal notranslate"><span class="pre">PayloadCredentials</span></code> message.</p> </section> <section id="writing-services"> <h4>Writing services<a class="headerlink" href="#writing-services" title="Permalink to this heading"></a></h4> <p>Many helpers for writing services and filling out responses have been moved from <code class="docutils literal notranslate"><span class="pre">bosdyn.client.util</span></code> to <code class="docutils literal notranslate"><span class="pre">bosdyn.client.server_util</span></code>.</p> <p><code class="docutils literal notranslate"><span class="pre">bosdyn.mission.server_util.set_response_header()</span></code> has been moved to <code class="docutils literal notranslate"><span class="pre">bosdyn.client.server_util.set_response_header()</span></code>, so that it can be used by any service, not only those depending on missions.</p> </section> </section> <section id="id133"> <h3>Known Issues<a class="headerlink" href="#id133" title="Permalink to this heading"></a></h3> <p><strong>When a network transport failure occurs,</strong> depending on the particular operating system and version of gRPC installed, the error from the python SDK may not always be the most specific error possible, such as <code class="docutils literal notranslate"><span class="pre">UnknownDnsNameError</span></code>. It may instead be raised as either a generic <code class="docutils literal notranslate"><span class="pre">RpcError</span></code>, or another generic failure type such as <code class="docutils literal notranslate"><span class="pre">UnableToConnectToRobotError</span></code>.</p> <p><strong>Spot CAM LED illumination levels</strong> are not currently recorded or played back in Autowalk missions.</p> <p><strong>If you write a custom data acquisition plugin or image service,</strong> do not change its <code class="docutils literal notranslate"><span class="pre">DataAcquisitionCapability</span></code> or <code class="docutils literal notranslate"><span class="pre">ImageSource</span></code> set once it is running and registered. New capabilities may not be detected, and old capabilities may still be listed as available in the Data Acquisition service. To change the capabilities of a service: unregister it from the directory, wait until its capabilities are no longer listed in the Data Acquisition service, and then re-register it. This waiting also applies to restarting a service if its capabilities will be different upon restart.</p> <p><strong>If you write a custom data acquisition plugin without using our helper class,</strong> its <code class="docutils literal notranslate"><span class="pre">GetStatus()</span></code> RPC is expected to complete immediately. If it takes too long to complete it can cause timeouts when requesting <code class="docutils literal notranslate"><span class="pre">GetStatus()</span></code> of the data acquisition service.</p> <p><strong>If you register a new service with the robot</strong>, calling <code class="docutils literal notranslate"><span class="pre">robot.ensure_client()</span></code> to create a client for that service may result in a <code class="docutils literal notranslate"><span class="pre">UnregisteredServiceNameError</span></code>.</p> <ul class="simple"> <li><p>Workaround: call <code class="docutils literal notranslate"><span class="pre">robot.sync_with_directory()</span></code> before <code class="docutils literal notranslate"><span class="pre">robot.ensure_client()</span></code></p></li> </ul> <p><strong>SE2VelocityLimits require care</strong>. Correct usage of the <code class="docutils literal notranslate"><span class="pre">SE2VelocityLimit</span></code> message requires the user to fully fill out all the fields, setting unlimited values to a large number, say 1e6.</p> </section> <section id="id134"> <h3>Sample Code<a class="headerlink" href="#id134" title="Permalink to this heading"></a></h3> <p><a class='reference internal' href='/python/examples/animation_recorder/readme'><span class="doc">Animation Recorder (new)</span></a> Demonstrates recording motion made with the tablet and then playing it back with the choreographer service.</p> <p><a class='reference internal' href='/python/examples/arm_constrained_manipulation/readme'><span class="doc">Arm Constrained Manipulation (new)</span></a> Demonstrates using constrained manipulation to turn a crank.</p> <p><a class='reference internal' href='/python/examples/auto_return/readme'><span class="doc">Auto Return (new)</span></a> Demonstrates setting up and triggering the Auto Return service.</p> <p><a class='reference internal' href='/python/examples/data_buffer/readme'><span class="doc">Data Buffer (new)</span></a> Demonstrates adding several different kinds of data to the data buffer.</p> <p><a class='reference internal' href='/python/examples/get_depth_plus_visual_image/readme'><span class="doc">Get Depth Plus Visual Image (new)</span></a> Demonstrates how to use the <code class="docutils literal notranslate"><span class="pre">depth_in_visual_frame</span></code> image sources to visualize depth in a visual image.</p> <p><a class='reference internal' href='/python/examples/graph_nav_extract_point_cloud/readme'><span class="doc">Graph Nav Extract Point Cloud (new)</span></a> Demonstrates opening and parsing a GraphNav map and extracting a globally consistent point cloud from it.</p> <p><a class='reference internal' href='/python/examples/post_docking_callbacks/readme'><span class="doc">Post-Docking Callbacks (new)</span></a> Builds docker images for mission callbacks that can upload data acquired during a mission.</p> <p><a class='reference internal' href='/python/examples/disable_ir_emission/readme'><span class="doc">Disable IR Emission (new)</span></a> Demonstrates enabling and disabling IR light emitters via the IREnableDisableService Client.</p> <p><a class='reference internal' href='/python/examples/arm_gaze/readme'><span class="doc">Arm Gaze (updated)</span></a> Updated to use <code class="docutils literal notranslate"><span class="pre">block_until_arm_arrives()</span></code> instead of a <code class="docutils literal notranslate"><span class="pre">sleep()</span></code></p> <p><a class='reference internal' href='/python/examples/bddf_download/readme'><span class="doc">BDDF Download (updated)</span></a> Now provides a Qt-based downloading UI.</p> <p><a class='reference internal' href='/python/examples/data_acquisition_service/readme'><span class="doc">Data Acquisition Service (updated)</span></a> Now provides a plugin for capturing data from the network compute bridge.</p> <p><a class='reference internal' href='/python/examples/frame_trajectory_command/readme'><span class="doc">Frame Trajectory Command (updated)</span></a> Now takes arguments that specify how to move instead of performing fixed motions.</p> <p><a class='reference internal' href='/python/examples/graph_nav_command_line/readme'><span class="doc">Graph Nav Command Line (updated)</span></a> Now can navigate to a position in an anchoring. The recording example provides options to automatically close loops in the map or optimize the map’s anchoring.</p> <p><a class='reference internal' href='/python/examples/graph_nav_view_map/readme'><span class="doc">View Map (updated)</span></a> Now can display the map according to the anchoring.</p> <p><a class='reference internal' href='/python/examples/readme'><span class="doc">Mission Recorder (updated)</span></a> New option to build a mission from the graph on the robot. New command to automatically close loops in the graph. Uses NavigateRoute to follow waypoints in order.</p> <p><a class='reference internal' href='/python/examples/network_compute_bridge/readme'><span class="doc">Network Compute Bridge (updated)</span></a> Now includes options to run and test a worker without needing a robot. Also includes files to build docker images for deployment.</p> <p><a class='reference internal' href='/python/examples/payloads/readme'><span class="doc">Payloads (updated)</span></a> Now includes an example of how to attach and detach a payload.</p> <p><a class='reference internal' href='/python/examples/replay_mission/readme'><span class="doc">Replay Mission (updated)</span></a> Now includes extra options for playing back Autowalk missions, as well as disabling directed exploration.</p> <p><a class='reference internal' href='/python/examples/ricoh_theta/readme'><span class="doc">Ricoh Theta (updated)</span></a> Now includes a “live stream” option that provides a higher frame rate at the cost of lower-quality stitching. (Thanks Aaron Gokasian!)</p> <p><a class='reference internal' href='/python/examples/spot_cam/readme'><span class="doc">Spot Cam (updated)</span></a> New options for getting and setting PTZ focus, audio capture channel, and audio capture gain. Also an option for enabling congestion control for the stream quality.</p> <p><a class='reference internal' href='/python/examples/wasd/readme'><span class="doc">WASD (updated)</span></a> The Escape key can now be used to stop the robot.</p> <p><a class='reference internal' href='/python/examples/service_customization/custom_parameter_image_server/readme'><span class="doc">Webcam Image Service (updated)</span></a> New resolution options allow for capturing from the webcam at different resolutions.</p> </section> </section> <section id="id135"> <h2>2.3.5<a class="headerlink" href="#id135" title="Permalink to this heading"></a></h2> <section id="id136"> <h3>New Features<a class="headerlink" href="#id136" title="Permalink to this heading"></a></h3> <section id="spot-cam"> <h4>Spot CAM<a class="headerlink" href="#spot-cam" title="Permalink to this heading"></a></h4> <p>Added <code class="docutils literal notranslate"><span class="pre">InitializeLens</span></code> RPC, which resets the PTZ autofocus without needing to power cycle the Spot CAM.</p> </section> <section id="data-buffer"> <h4>Data Buffer<a class="headerlink" href="#data-buffer" title="Permalink to this heading"></a></h4> <p>A new <code class="docutils literal notranslate"><span class="pre">sync</span></code> option has been added to <code class="docutils literal notranslate"><span class="pre">RecordDataBlobsRequest</span></code> which specifies that the RPC should not return a response until the data has been fully committed and can be read back. This is exposed through the optional <code class="docutils literal notranslate"><span class="pre">write_sync</span></code> argument to the <code class="docutils literal notranslate"><span class="pre">add_blob()</span></code> and <code class="docutils literal notranslate"><span class="pre">add_protobuf()</span></code> methods of the <code class="docutils literal notranslate"><span class="pre">DataBufferClient</span></code>.</p> </section> </section> <section id="id137"> <h3>Bug fixes and improvements<a class="headerlink" href="#id137" title="Permalink to this heading"></a></h3> <p>When running with a Spot CAM+ (PTZ) running 2.3.5, the <code class="docutils literal notranslate"><span class="pre">SetPowerStatus</span></code> and <code class="docutils literal notranslate"><span class="pre">CyclePower</span></code> endpoints will now return an error if the PTZ is specified. These endpoints could previously cause the WebRTC feed to crash. These RPCs are still safe to use for other devices, but due to hardware limitations, resetting the PTZ power can possibly cause the Spot CAM to require a reboot to regain the WebRTC stream.</p> <p><code class="docutils literal notranslate"><span class="pre">RetryableUnavailableError</span></code> was raised in more cases than it should have been, and it is now more selectively raised.</p> <p>The <code class="docutils literal notranslate"><span class="pre">EstopKeepAlive</span></code> expected users to monitor its status by popping entries out of its <code class="docutils literal notranslate"><span class="pre">status_queue</span></code>. If the user did not do so, the queue would continue to grow without bound. The queue size is now bounded and old unchecked entries will be thrown away. The queue size is specified with the <code class="docutils literal notranslate"><span class="pre">max_status_queue_size</span></code> argument to the constructor.</p> </section> <section id="id138"> <h3>Breaking Changes<a class="headerlink" href="#id138" title="Permalink to this heading"></a></h3> <p>As stated above, the behavior of <code class="docutils literal notranslate"><span class="pre">SetPowerStatus</span></code> and <code class="docutils literal notranslate"><span class="pre">CyclePower</span></code> endpoints have been changed for Spot CAM+ units when attempting to change the power status of the PTZ. They now return an error instead of modifying the power status of the PTZ. They remain functional for the Spot CAM+IR. Clients using these SDK endpoints to reset the autofocus on the PTZ are recommended to use <code class="docutils literal notranslate"><span class="pre">InitializeLens</span></code> instead. Other clients are encouraged to seek alternative options.</p> </section> <section id="id139"> <h3>Deprecations<a class="headerlink" href="#id139" title="Permalink to this heading"></a></h3> <p>The <code class="docutils literal notranslate"><span class="pre">ResponseContext</span></code> helper class has been moved to the bosdyn-client package (from the bosdyn-mission package), so that it can be used for gRPC logging in data acquisition plugin services in addition to the mission service. The new import location will be from <code class="docutils literal notranslate"><span class="pre">bosdyn.client.server_util</span></code>, and the original import location of <code class="docutils literal notranslate"><span class="pre">bosdyn.mission.server_util</span></code> has been deprecated.</p> </section> <section id="id140"> <h3>Known Issues<a class="headerlink" href="#id140" title="Permalink to this heading"></a></h3> <p>Same as 2.3.0</p> </section> </section> <section id="id141"> <h2>2.3.4<a class="headerlink" href="#id141" title="Permalink to this heading"></a></h2> <section id="id142"> <h3>New Features<a class="headerlink" href="#id142" title="Permalink to this heading"></a></h3> <section id="power-control"> <h4>Power Control<a class="headerlink" href="#power-control" title="Permalink to this heading"></a></h4> <p>New options have been added to the Power Service to allow for power cycling the robot and powering the payload ports or wifi radios on or off. Additional fields have been added to the robot state message to check the payload and wifi power states. Support has also been added to the <code class="docutils literal notranslate"><span class="pre">bosdyn.client</span></code> command line interface for these commands.</p> <p>These new options will only work on some Enterprise Spot robots. Check the HardwareConfiguration message reported by a particular robot to see if it supports them.</p> </section> </section> <section id="id143"> <h3>Bug fixes and improvements<a class="headerlink" href="#id143" title="Permalink to this heading"></a></h3> <p>Fixed an issue that could cause payload registration or directory registration keep-alive threads to exit early in certain cases.</p> <p>Fixed a couple issues with the webcam example: updated the Dockerfile to create a smaller container specifically with python 3.7, added new optional argument to specify the video codec, and programmatically prevent substring arguments other than the <code class="docutils literal notranslate"><span class="pre">--device-name</span></code> argument to avoid accidental confusion with the docker container’s <code class="docutils literal notranslate"><span class="pre">--device</span></code> argument.</p> </section> <section id="id144"> <h3>Known Issues<a class="headerlink" href="#id144" title="Permalink to this heading"></a></h3> <p>Same as 2.3.0</p> </section> <section id="id145"> <h3>Sample Code<a class="headerlink" href="#id145" title="Permalink to this heading"></a></h3> <p>A new <a class='reference internal' href='/docs/python/fetch_tutorial/fetch1'><span class="doc">tutorial</span></a> has been added to walk through using machine learning, the Network Compute Bridge, and Manipulation API to play fetch with Spot.</p> </section> </section> <section id="id146"> <h2>2.3.3<a class="headerlink" href="#id146" title="Permalink to this heading"></a></h2> <section id="id147"> <h3>New Features<a class="headerlink" href="#id147" title="Permalink to this heading"></a></h3> <section id="id148"> <h4>Graph Nav<a class="headerlink" href="#id148" title="Permalink to this heading"></a></h4> <p>The python Graph Nav client now allows setting an offset to the destination, for navigating to a position relative to the final waypoint instead of exactly matching the final waypoint position and orientation.</p> </section> </section> <section id="id149"> <h3>Bug fixes and improvements<a class="headerlink" href="#id149" title="Permalink to this heading"></a></h3> <p>Fixed issues where the data acquisition download helpers did not handle absolute paths on windows and did not clean filenames correctly. (Thanks David from Levatas!)</p> <p>Zip file names from the data download service no longer contain difficult characters.</p> <p>Fixed an issue where Graph Nav would sometimes report the robot was impaired on the first usage after restarting the robot.</p> <p>Errors returned from Network Compute Bridge workers will be better propagated in the Network Compute Bridge response.</p> <p>Updated background threads for the payload and directory registration helpers to silently ignore transient errors.</p> <p>Fixed an issue where requesting thermal images with PTZ/Pano images in a single data acquisition action caused thermal images to either not be collected or saved as “blank” images.</p> </section> <section id="id150"> <h3>Breaking Changes<a class="headerlink" href="#id150" title="Permalink to this heading"></a></h3> <p>The estop service will now refuse to change configuration if the robot is already powered on, returning a status of STATUS_MOTORS_ON. This prevents accidentally cutting power while the robot is in operation.</p> </section> <section id="id151"> <h3>Known Issues<a class="headerlink" href="#id151" title="Permalink to this heading"></a></h3> <p>Same as 2.3.0</p> </section> <section id="id152"> <h3>Sample Code<a class="headerlink" href="#id152" title="Permalink to this heading"></a></h3> <p><a class='reference internal' href='/python/examples/network_compute_bridge/readme'><span class="doc">Network Compute Bridge</span></a> Updated to provide appropriate error messages from the workers.</p> </section> </section> <section id="id153"> <h2>2.3.2<a class="headerlink" href="#id153" title="Permalink to this heading"></a></h2> <section id="id154"> <h3>New Features<a class="headerlink" href="#id154" title="Permalink to this heading"></a></h3> <section id="id155"> <h4>SpotCAM<a class="headerlink" href="#id155" title="Permalink to this heading"></a></h4> <p>The SpotCAM API has been expanded to support more use cases for the SpotCAM+IR (thermal PTZ variant). This includes the following new endpoints:</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">SetIrColormap</span></code>/<code class="docutils literal notranslate"><span class="pre">GetIrColormap</span></code>: Set/get the mapping between radiometric IR samples to color, for video</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">SetIrMeterOverlay</span></code>: Set location for the “Spot Meter”, which indicates temperature at a point in the thermal video stream.</p></li> </ul> <p>The SpotCAM Power API now has an additional endpoint to cycle power for any of the components that could previously be toggled using <code class="docutils literal notranslate"><span class="pre">SetPowerStatus</span></code>. <code class="docutils literal notranslate"><span class="pre">CyclePower</span></code> can be used to help the PTZ recover from adverse behavior, such as incorrect auto-focus or poor motor behavior, which can sometimes happen as the result of a robot fall. <code class="docutils literal notranslate"><span class="pre">CyclePower</span></code> will wait the appropriate amount of time between turning components off and turning on again to make sure the power is cycled correctly without the client needing to know the correct interval.</p> </section> </section> <section id="id156"> <h3>Known Issues<a class="headerlink" href="#id156" title="Permalink to this heading"></a></h3> <p>Same as 2.3.0</p> </section> <section id="id157"> <h3>Sample Code<a class="headerlink" href="#id157" title="Permalink to this heading"></a></h3> <p><a class='reference internal' href='/python/examples/get_image/readme'><span class="doc">Get image (updated)</span></a> Support for the new pixel format of IR images.</p> <p><a class='reference internal' href='/python/examples/ricoh_theta/readme'><span class="doc">Ricoh Theta (updated)</span></a> Improved parsing of timestamp information from the camera. Correctly set the image proto format field. Defaults to not capturing continuously. Flags <code class="docutils literal notranslate"><span class="pre">--capture-continuously</span></code> and <code class="docutils literal notranslate"><span class="pre">--capture-when-requested</span></code> can be used to specify the desired behavior.</p> <p><a class='reference internal' href='/python/examples/spot_cam/readme'><span class="doc">Spot CAM (updated)</span></a> Support for IR images and power cycling functionality.</p> </section> </section> <section id="id158"> <h2>2.3.0<a class="headerlink" href="#id158" title="Permalink to this heading"></a></h2> <section id="id159"> <h3>New Features<a class="headerlink" href="#id159" title="Permalink to this heading"></a></h3> <section id="id160"> <h4>Arm and Gripper Control<a class="headerlink" href="#id160" title="Permalink to this heading"></a></h4> <p>One of the main features of the 2.3 release is control and support of Spot’s arm and gripper. Arm and gripper commands are included in the <code class="docutils literal notranslate"><span class="pre">SynchronizedCommand</span></code> message, and can be commanded in addition to mobility commands. The <code class="docutils literal notranslate"><span class="pre">RobotCommandBuilder</span></code> in the SDK provides many new helpers for building new arm and gripper commands. The synchro command builder functions now have an optional <code class="docutils literal notranslate"><span class="pre">build_on_command</span></code> argument, which is used to build a mobility/arm/gripper command onto an existing command, merging them correctly. The arm and gripper state are reported in the new <code class="docutils literal notranslate"><span class="pre">manipulator_state</span></code> field of the robot state. The Python SDK <code class="docutils literal notranslate"><span class="pre">Robot</span></code> class now has a <code class="docutils literal notranslate"><span class="pre">has_arm()</span></code> helper to determine if the robot has an arm or not. For more information about controlling the arm, see the <a class='reference internal' href='/docs/concepts/arm/readme'><span class="doc">arm documentation</span></a>.</p> <p><strong>Manipulation API (beta)</strong> This new API provides some high-level control options for walking to and picking up objects in the world.</p> <p><strong>Arm Surface Contact (beta)</strong> ArmSurfaceContactService lets you accurately move the robot’s arm in the world while having some ability to perform force control. This mode is useful for drawing, wiping, and other similar behaviors.</p> <p><strong>Doors (beta)</strong> DoorService will automatically open and move through doors, once provided some information about handles and hinges.</p> </section> <section id="id161"> <h4>Network Compute Bridge<a class="headerlink" href="#id161" title="Permalink to this heading"></a></h4> <p>An interface for integrating real-time image processing and machine learning for identifying objects and aiding grasping. For more information, see the <a class='reference internal' href='/docs/concepts/network_compute_bridge'><span class="doc">network compute bridge documentation</span></a>.</p> </section> <section id="payload-estimation"> <h4>Payload Estimation<a class="headerlink" href="#payload-estimation" title="Permalink to this heading"></a></h4> <p>A new <code class="docutils literal notranslate"><span class="pre">PayloadEstimationCommand</span></code> is available to have Spot try to estimate the mass properties of a payload itself. After moving about to perform its estimation, the mass properties will be reported in the command feedback.</p> </section> <section id="id162"> <h4>SpotCAM<a class="headerlink" href="#id162" title="Permalink to this heading"></a></h4> <p>Some SpotCAMs now include an IR camera. There are additional cameras and screens available for those versions, and a new pixel format <code class="docutils literal notranslate"><span class="pre">PIXEL_FORMAT_GREYSCALE_U16</span></code> used to represent those IR images. There are additional RPCs used to set colormaps and overlays of the IR images for live display.</p> <p>Logpoint <code class="docutils literal notranslate"><span class="pre">QUEUED</span></code> status is now broken up further with the <code class="docutils literal notranslate"><span class="pre">queue_status</span></code> field, which differentiates between when the image has or has not been captured.</p> </section> <section id="arm-support-in-choreographer"> <h4>Arm Support in Choreographer<a class="headerlink" href="#arm-support-in-choreographer" title="Permalink to this heading"></a></h4> <p>The new Choreographer executable now includes two new tracks, gripper and arm, and includes new dance moves which control the arm.</p> </section> <section id="id163"> <h4>Docking<a class="headerlink" href="#id163" title="Permalink to this heading"></a></h4> <p>A new <code class="docutils literal notranslate"><span class="pre">PREP_POSE_UNDOCK</span></code> command option can be used to undock a docked robot. It will return the new <code class="docutils literal notranslate"><span class="pre">STATUS_ERROR_NOT_DOCKED</span></code> if the robot was not already docked. When successful the status will be <code class="docutils literal notranslate"><span class="pre">STATUS_AT_PREP_POSE</span></code>.</p> </section> <section id="id164"> <h4>Graph Nav<a class="headerlink" href="#id164" title="Permalink to this heading"></a></h4> <p>When localizing the robot using <code class="docutils literal notranslate"><span class="pre">FIDUCIAL_INIT_SPECIFIC</span></code>, if the target waypoint does not contain a good measurement of the desired fiducial, nearby waypoints may be used to infer the robot’s location. This behavior can be disabled with the new <code class="docutils literal notranslate"><span class="pre">restrict_fiducial_detections_to_target_waypoint</span></code> field to only use the waypoint’s own data.</p> <p>A new <code class="docutils literal notranslate"><span class="pre">destination_waypoint_tform_body_goal</span></code> is provided for the <code class="docutils literal notranslate"><span class="pre">NavigateTo</span></code> and <code class="docutils literal notranslate"><span class="pre">NavigateRoute</span></code> RPCs. This allows the user to specify a goal position that is offset from the destination waypoint, rather than exactly on the waypoint.</p> <p>A new <code class="docutils literal notranslate"><span class="pre">command_id</span></code> field can be specified on the <code class="docutils literal notranslate"><span class="pre">NavigateTo</span></code> and <code class="docutils literal notranslate"><span class="pre">NavigateRoute</span></code> RPCs. This is used to continue a previous command without needing to re-specify all the data. An important difference between specifying the <code class="docutils literal notranslate"><span class="pre">command_id</span></code> versus sending a new command is that if the robot has reported itself stuck, continuing a command will result in a <code class="docutils literal notranslate"><span class="pre">STATUS_STUCK</span></code> error, rather than trying again. A new <code class="docutils literal notranslate"><span class="pre">STATUS_UNRECOGNIZED_COMMAND</span></code> will be returned if the <code class="docutils literal notranslate"><span class="pre">command_id</span></code> does not match the currently executing command.</p> <p>The map representation now tracks the “source” of waypoints and edges. It is possible to override the cost of an edge used when planning paths and to disable the alternate route finding for a particular edge.</p> </section> <section id="id165"> <h4>Leases<a class="headerlink" href="#id165" title="Permalink to this heading"></a></h4> <p>Leases now include client names alongside the sequence number for help in debugging. If you are writing a custom client, make sure to append your client name any time that you create a sub-lease.</p> <p>ListLeases can optionally request to have the full lease information of the latest lease, rather than only the root lease information that was previously reported.</p> </section> </section> <section id="id166"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id166" title="Permalink to this heading"></a></h3> <p>In the seconds following modifications to the robot directory to the robot directories existing clients may experience a one time request failure. This failure is transient and can be resolved by retrying the request. This has been an expected failure case and a new error (RetryableUnavailableError) has been put in to better reflect the failure.</p> <p><code class="docutils literal notranslate"><span class="pre">SE3Pose</span></code> and <code class="docutils literal notranslate"><span class="pre">Quat</span></code> math helpers have <code class="docutils literal notranslate"><span class="pre">transform_vec3</span></code> members to simplify rotating vectors.</p> <p>There is a new <code class="docutils literal notranslate"><span class="pre">get_self_ip()</span></code> helper in <code class="docutils literal notranslate"><span class="pre">common.py</span></code> for determining the ip address your client will use to talk to the robot. This is useful for determining the correct registration information for a service, particularly on a machine with multiple network interfaces. This is also available via the python command line program <code class="docutils literal notranslate"><span class="pre">python3</span> <span class="pre">-m</span> <span class="pre">bosdyn.client</span> <span class="pre">&lt;robot</span> <span class="pre">host&gt;</span> <span class="pre">self-ip</span></code>.</p> <p>When listing events from the python command line program, you can now filter by event level and by event type.</p> </section> <section id="id167"> <h3>Dependencies<a class="headerlink" href="#id167" title="Permalink to this heading"></a></h3> <p>The python SDK now depends on the <code class="docutils literal notranslate"><span class="pre">Deprecated</span></code> package, which is used to mark functions and classes that are deprecated and provide warnings, so that users are made aware that features that they are using may be removed in the future.</p> </section> <section id="id168"> <h3>Deprecations<a class="headerlink" href="#id168" title="Permalink to this heading"></a></h3> <p>The Deprecated package has been implemented across the SDK so that deprecated features will print out a warning when they are called. Documentation surrounding deprecated features has also been updated.</p> </section> <section id="id169"> <h3>Breaking Changes<a class="headerlink" href="#id169" title="Permalink to this heading"></a></h3> <p>Spot Check no longer computes the <code class="docutils literal notranslate"><span class="pre">foot_height_results</span></code> or <code class="docutils literal notranslate"><span class="pre">leg_pair_results</span></code> fields.</p> <p>All RPCs in the Python SDK have a default timeout of 30s. The global timeout can be changed by assigning a new value to <code class="docutils literal notranslate"><span class="pre">bosdyn.client.common.DEFAULT_RPC_TIMEOUT</span></code>, and individual RPC calls can still set their own timeout via a <code class="docutils literal notranslate"><span class="pre">timeout=sec</span></code> optional parameter at any call site.</p> </section> <section id="id170"> <h3>Known Issues<a class="headerlink" href="#id170" title="Permalink to this heading"></a></h3> <p><strong>When a network transport failure occurs,</strong> depending on the particular operating system and version of gRPC installed, the error from the python SDK may not always be the most specific error possible, such as <code class="docutils literal notranslate"><span class="pre">UnknownDnsNameError</span></code>. It may instead be raised as either a generic <code class="docutils literal notranslate"><span class="pre">RpcError</span></code>, or another generic failure type such as <code class="docutils literal notranslate"><span class="pre">UnableToConnectToRobotError</span></code>.</p> <p><strong>Spot CAM LED illumination levels</strong> are not currently recorded or played back in Autowalk missions.</p> <p><strong>When capturing both a PTZ and Panoramic image</strong> in the same action, there may occasionally be two PTZ images captured along with the Panoramic image, rather than just one.</p> <p><strong>If you write a custom data acquisition plugin or image service,</strong> do not change its <code class="docutils literal notranslate"><span class="pre">DataAcquisitionCapability</span></code> or <code class="docutils literal notranslate"><span class="pre">ImageSource</span></code> set once it is running and registered. New capabilities may not be detected, and old capabilities may still be listed as available in the Data Acquisition service. To change the capabilities of a service: unregister it from the directory, wait until its capabilities are no longer listed in the Data Acquisition service, and then re-register it. This waiting also applies to restarting a service if its capabilities will be different upon restart.</p> <p><strong>If you write a custom data acquisition plugin without using our helper class,</strong> its <code class="docutils literal notranslate"><span class="pre">GetStatus()</span></code> RPC is expected to complete immediately. If it takes too long to complete it can cause timeouts when requesting <code class="docutils literal notranslate"><span class="pre">GetStatus()</span></code> of the data acquisition service.</p> <p><strong>If you register a new service with the robot</strong>, calling <code class="docutils literal notranslate"><span class="pre">robot.ensure_client()</span></code> to create a client for that service may result in a <code class="docutils literal notranslate"><span class="pre">UnregisteredServiceNameError</span></code>.</p> <ul class="simple"> <li><p>Workaround: call <code class="docutils literal notranslate"><span class="pre">robot.sync_with_directory()</span></code> before <code class="docutils literal notranslate"><span class="pre">robot.ensure_client()</span></code></p></li> </ul> <p><strong>SE2VelocityLimits require care</strong>. Correct usage of the <code class="docutils literal notranslate"><span class="pre">SE2VelocityLimit</span></code> message requires the user to fully fill out all the fields, setting unlimited values to a large number, say 1e6.</p> </section> <section id="id171"> <h3>Sample Code<a class="headerlink" href="#id171" title="Permalink to this heading"></a></h3> <p><a class='reference internal' href='/python/examples/arm_and_mobility_command/readme'><span class="doc">Arm and Mobility Command (new)</span></a> Demonstrates how to issue both mobility and arm commands to the robot at the same time.</p> <p><a class='reference internal' href='/python/examples/arm_door/readme'><span class="doc">Arm Door (new)</span></a> Demonstrates how to use the door service to have Spot autonomously open a door. It opens an image display and requires the same use input as when opening a door with the tablet.</p> <p><a class='reference internal' href='/python/examples/arm_force_control/readme'><span class="doc">Arm Force Control (new)</span></a> Demonstrates how to create force controlled trajectories for the arm and gripper.</p> <p><a class='reference internal' href='/python/examples/arm_gaze/readme'><span class="doc">Arm Gaze (new)</span></a> Shows how to command multiple different types of gaze requests.</p> <p><a class='reference internal' href='/python/examples/arm_gcode/readme'><span class="doc">Arm GCode (new)</span></a> Uses the arm surface contact API to write GCode on the ground using sidewalk chalk.</p> <p><a class='reference internal' href='/python/examples/arm_grasp/readme'><span class="doc">Arm Grasp (new)</span></a> Shows how to use the manipulation API to autonomously grasp an object based on the object’s image coordinates in pixel space. It opens an image view and lets a user select an object by clicking on the image, similar to grasping with the tablet.</p> <p><a class='reference internal' href='/python/examples/arm_joint_move/readme'><span class="doc">Arm Joint Move (new)</span></a> Shows how to create and command a joint move trajectory.</p> <p><a class='reference internal' href='/python/examples/arm_simple/readme'><span class="doc">Arm Simple (new)</span></a> A starter example which shows how to issue the robot command RPC with a basic arm command which moves the end effector to a couple different positions.</p> <p><a class='reference internal' href='/python/examples/arm_stow_unstow/readme'><span class="doc">Arm Stow Unstow (new)</span></a> Shows how to issue API commands to stow and unstow the arm.</p> <p><a class='reference internal' href='/python/examples/arm_surface_contact/readme'><span class="doc">Arm Surface Contact (new)</span></a> Uses the arm surface contact API to request an end effector trajectory move which applies some force to the ground.</p> <p><a class='reference internal' href='/python/examples/arm_trajectory/readme'><span class="doc">Arm Trajectory (new)</span></a> Demonstrates how to create an arm command with a position-based trajectory.</p> <p><a class='reference internal' href='/python/examples/arm_walk_to_object/readme'><span class="doc">Arm Walk to Object (new)</span></a> This example shows how to use the manipulation api to command the robot to walk towards an object and prepare to grasp it. The example opens an image view and lets a user select an object by clicking in the image.</p> <p><a class='reference internal' href='/python/examples/arm_with_body_follow/readme'><span class="doc">Arm With Body Follow (new)</span></a> Shows how to issue arm commands that allow the body to move to a good position to achieve the desired arm command.</p> <p><a class='reference internal' href='/python/examples/comms_test/readme'><span class="doc">Comms Test (updated)</span></a> The comms test example can now successfully be run with Docker.</p> <p><a class='reference internal' href='/python/examples/data_acquisition_service/readme'><span class="doc">Data Acquisition Service Plugins (updated)</span></a> The directory structure has changed to create individual directories for each plugin (and the plugin’s Dockerfile and requirements files).</p> <p><a class='reference internal' href='/python/examples/data_service/readme'><span class="doc">Data Service (updated)</span></a> A new example script, delete_pages.py, has been added to remove log pages from robots.</p> <p><a class='reference internal' href='/python/examples/estop/readme'><span class="doc">Estop (updated)</span></a> The estop no-gui example’s logging statements have been improved.</p> <p><a class='reference internal' href='/python/examples/graph_nav_command_line/readme'><span class="doc">GraphNav Command Line (updated)</span></a> Has commands to clear the map on the robot, and to manually close the loop in a map. Updated to properly return the lease when exiting the script. Optimized to only upload snapshots to the robot that are not already present.</p> <p><a class='reference internal' href='/python/examples/mission_recorder/readme'><span class="doc">Mission Recorder (updated)</span></a> Fixed the localization node to use the nearest fiducial.</p> <p><a class='reference internal' href='/python/examples/network_compute_bridge/readme'><span class="doc">Network Compute Bridge (new)</span></a> The example has a network compute bridge work service example, which runs a tensorflow model and registers the service with the robot. Additionally, the example contains a client-side example that queries the network compute bridge service to identify objects in the robot camera images using the server’s tensorflow model.</p> <p><a class='reference internal' href='/python/examples/replay_mission/readme'><span class="doc">Replay Mission (updated)</span></a> Optimized to only upload snapshots to the robot that are not already present. Has an option to disable alternate route finding when running a mission.</p> <p><a class='reference internal' href='/python/examples/ricoh_theta/readme'><span class="doc">Ricoh Theta (updated)</span></a> Fixes a missing import required to run the continuous capture thread.</p> <p><a class='reference internal' href='/python/examples/self_registration/readme'><span class="doc">Self Registration (updated)</span></a> Updated to create a payload with more realistic sample values.</p> <p><a class='reference internal' href='/python/examples/spot_cam/readme'><span class="doc">Spot CAM (updated)</span></a> The WebRTC example now records audio. The compositor example now includes Spot CAM IR support.</p> <p><a class='reference internal' href='/python/examples/upload_choreographed_sequence/readme'><span class="doc">Upload Choreographed Sequence (updated)</span></a> Returns a clearer error message if being used with an incorrect license.</p> <p><a class='reference internal' href='/python/examples/service_customization/custom_parameter_image_server/readme'><span class="doc">Web Cam Image Service (updated)</span></a> The web cam example now has better support for Windows, and has a debug mode which will show a popup image window of the camera image.</p> </section> </section> <section id="id172"> <h2>2.2.0<a class="headerlink" href="#id172" title="Permalink to this heading"></a></h2> <section id="id173"> <h3>New Features<a class="headerlink" href="#id173" title="Permalink to this heading"></a></h3> <section id="docking-license-dependent"> <h4>Docking (license dependent)<a class="headerlink" href="#docking-license-dependent" title="Permalink to this heading"></a></h4> <p>Automated docking at charging stations is out of beta and available for enterprise customers. There have been a few updates to the protos regarding status reporting and handling “prep” poses.</p> </section> <section id="payload-authorization-faults"> <h4>Payload Authorization Faults<a class="headerlink" href="#payload-authorization-faults" title="Permalink to this heading"></a></h4> <p>Payloads that have been registered with the robot but have not yet been authorized will automatically have service faults raised on their behalf indicating their status. This will help prevent operators from forgetting to authorize payloads after attaching them to the robot.</p> </section> <section id="service-and-plugin-development"> <h4>Service and plugin development<a class="headerlink" href="#service-and-plugin-development" title="Permalink to this heading"></a></h4> <p><strong>Image Services</strong> Helper functions for creating image services that reduce the amount of boiler plate code required for creating an image service and ensure the necessary fields of the response RPCs will be populated by the service.</p> <p><strong>Data Acquisition Service</strong> Helper functions for communicating with the on robot data acquisition service to acquire data, monitor the status of the acquisition, cancel requests, and download the data using the REST endpoint. These functions originally were in the data_acquisition_service example, but are now part of the <code class="docutils literal notranslate"><span class="pre">bosdyn-client</span></code> wheel.</p> </section> <section id="se2trajectorycommand-feedback"> <h4><code class="docutils literal notranslate"><span class="pre">SE2TrajectoryCommand</span></code> Feedback<a class="headerlink" href="#se2trajectorycommand-feedback" title="Permalink to this heading"></a></h4> <p>Added new status <code class="docutils literal notranslate"><span class="pre">STATUS_NEAR_GOAL</span></code> as well as a new <code class="docutils literal notranslate"><span class="pre">BodyMovementStatus</span></code> to help differentiate between different kinds of states the robot can be in at the end of its trajectory.</p> </section> <section id="id174"> <h4>Missions<a class="headerlink" href="#id174" title="Permalink to this heading"></a></h4> <p>The <code class="docutils literal notranslate"><span class="pre">BosdynGraphNavLocalize</span></code> node can now specify a full <code class="docutils literal notranslate"><span class="pre">SetLocalizationRequest</span></code>, rather than only localizing to the nearest fiducial.</p> <p>When comparing blackboard values, there is a new <code class="docutils literal notranslate"><span class="pre">HandleStaleness</span></code> option to specify what the node should do if the blackboard value is stale.</p> </section> <section id="other-helper-functions"> <h4>Other Helper Functions**<a class="headerlink" href="#other-helper-functions" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">is_estopped()</span></code> helper for the estop client and robot.</p></li> <li><p>Helper functions to create time ranges in the robot’s time.</p></li> <li><p>Downloader script for bddf log files.</p></li> </ul> </section> </section> <section id="id175"> <h3>Bug fixes and improvements<a class="headerlink" href="#id175" title="Permalink to this heading"></a></h3> <p><strong>Data Acquisition</strong> Data Acquisition Service on robots is now robust to port number changes. The previous workaround to this problem was to always specify the same port when starting/restarting a service. Now, the port argument for external api services can use the default, which will choose an available ephemeral port.</p> <p><strong>Image Services</strong> Robot Cameras image service will respond to GetImage requests with incorrect format (e.g. requesting a depth image as format JPEG) using the <code class="docutils literal notranslate"><span class="pre">STATUS_UNSUPPORTED_IMAGE_FORMAT_REQUESTED</span></code>. Previously, this was returned as <code class="docutils literal notranslate"><span class="pre">STATUS_IMAGE_DATA_ERROR</span></code>.</p> <p><strong>The Ricoh Theta image service example improvements</strong></p> <ul class="simple"> <li><p>Automatically disables sleep mode when putting the ricoh theta into client mode (using <code class="docutils literal notranslate"><span class="pre">ricoh_client_mode.py</span></code>).</p></li> <li><p>By default, it now runs a background thread capturing images continuously to minimize the delays waiting for an image to appear when viewing from the camera.</p></li> <li><p>It will wait for the capture to be completely processed before returning an image. This fixes issues where a very old image would be displayed, since it would trigger a take picture, but just return the most recent processed image.</p></li> </ul> <p><strong>Command line client</strong> The “log” and “textmsg” commands now go through the DataBuffer service, and so can be read back by downloading bddf files from the robot.</p> <p><strong>EstopService timeout</strong> The maximum timeout on the EstopService (aka the motor cut authority) has been raised from 65 seconds to just over 18 hours and 10 minutes. The estop service also correctly reports an error if given an invalid timeout.</p> </section> <section id="id176"> <h3>Deprecations<a class="headerlink" href="#id176" title="Permalink to this heading"></a></h3> <p>BDDF code has moved to the <code class="docutils literal notranslate"><span class="pre">bosdyn-core</span></code> package, so that it can be used separately from the client code. The new import location is <code class="docutils literal notranslate"><span class="pre">bosdyn.bddf</span></code>. The old import path via <code class="docutils literal notranslate"><span class="pre">bosdyn.client.bddf</span></code> is deprecated.</p> </section> <section id="dependency-changes"> <h3>Dependency Changes<a class="headerlink" href="#dependency-changes" title="Permalink to this heading"></a></h3> <p><code class="docutils literal notranslate"><span class="pre">bosdyn-client</span></code> now depends on the <code class="docutils literal notranslate"><span class="pre">requests</span></code> library for making http requests to download data acquisition results and bddf logs.</p> </section> <section id="id177"> <h3>Known issues<a class="headerlink" href="#id177" title="Permalink to this heading"></a></h3> <p><strong>When a network transport failure occurs,</strong> depending on the particular operating system and version of gRPC installed, the error from the python SDK may not always be the most specific error possible, such as <code class="docutils literal notranslate"><span class="pre">UnknownDnsNameError</span></code>. It may instead be raised as either a generic <code class="docutils literal notranslate"><span class="pre">RpcError</span></code>, or another generic failure type such as <code class="docutils literal notranslate"><span class="pre">UnableToConnectToRobotError</span></code>.</p> <p><strong>Spot CAM LED illumination levels</strong> are not currently recorded or played back in Autowalk missions.</p> <p><strong>When capturing both a PTZ and Panoramic image</strong> in the same action, there may occasionally be two PTZ images captured along with the Panoramic image, rather than just one.</p> <p><strong>If you write a custom data acquisition plugin or image service,</strong> do not change its <code class="docutils literal notranslate"><span class="pre">DataAcquisitionCapability</span></code> or <code class="docutils literal notranslate"><span class="pre">ImageSource</span></code> set once it is running and registered. New capabilities may not be detected, and old capabilities may still be listed as available in the Data Acquisition service. To change the capabilities of a service: unregister it from the directory, wait until its capabilities are no longer listed in the Data Acquisition service, and then re-register it. This waiting also applies to restarting a service if its capabilities will be different upon restart.</p> <p><strong>If you write a custom data acquisition plugin without using our helper class,</strong> its <code class="docutils literal notranslate"><span class="pre">GetStatus()</span></code> RPC is expected to complete immediately. If it takes too long to complete it can cause timeouts when requesting <code class="docutils literal notranslate"><span class="pre">GetStatus()</span></code> of the data acquisition service.</p> <p><strong>If you register a new service with the robot</strong>, calling <code class="docutils literal notranslate"><span class="pre">robot.ensure_client()</span></code> to create a client for that service may result in a <code class="docutils literal notranslate"><span class="pre">UnregisteredServiceNameError</span></code>.</p> <ul class="simple"> <li><p>Workaround: call <code class="docutils literal notranslate"><span class="pre">robot.sync_with_directory()</span></code> before <code class="docutils literal notranslate"><span class="pre">robot.ensure_client()</span></code></p></li> </ul> <p><strong>SE2VelocityLimits require care</strong>. Correct usage of the <code class="docutils literal notranslate"><span class="pre">SE2VelocityLimit</span></code> message requires the user to fully fill out all the fields, setting unlimited values to a large number, say 1e6.</p> </section> <section id="id178"> <h3>Sample Code<a class="headerlink" href="#id178" title="Permalink to this heading"></a></h3> <p><a class='reference internal' href='/python/examples/tester_programs/readme'><span class="doc">Image service test program (new)</span></a> A new tester program for image services is available to help with the development and debugging of new image service implementations.</p> <p><a class='reference internal' href='/python/examples/docking/readme'><span class="doc">Docking (new)</span></a> Shows how to trigger the docking service to safely dock the robot on a charger.</p> <p><a class='reference internal' href='/python/examples/service_customization/custom_parameter_image_server/readme'><span class="doc">Web Cam Image Service (updated)</span></a> The web cam example now uses the new image service helpers.</p> <p><a class='reference internal' href='/python/examples/ricoh_theta/readme'><span class="doc">Ricoh Theta Image Service (updated)</span></a> Uses the new image service helpers. A few extra bug fixes as described above.</p> <p><a class='reference internal' href='/python/examples/data_service/readme'><span class="doc">Data Service (updated)</span></a> Added options to specify a time range, and automatically converts times to robot time.</p> <p><a class='reference internal' href='/python/examples/data_acquisition_service/readme'><span class="doc">Data acquisition (updated)</span></a> Uses the new data acquisition helpers. The data acquisition tester program has been moved to a common <a class='reference internal' href='/python/examples/tester_programs/readme'><span class="doc">tester_programs</span></a> directory.</p> </section> </section> <section id="id179"> <h2>2.1.0<a class="headerlink" href="#id179" title="Permalink to this heading"></a></h2> <section id="id180"> <h3>New Features<a class="headerlink" href="#id180" title="Permalink to this heading"></a></h3> <section id="spot-i-o-data-acquisition"> <h4>Spot I/O: <a class='reference internal' href='/docs/concepts/data_acquisition_overview'><span class="doc">Data Acquisition</span></a><a class="headerlink" href="#spot-i-o-data-acquisition" title="Permalink to this heading"></a></h4> <p>This release features a new system for acquiring, storing, and retrieving sensor data. It consists of several new services and their associated clients.</p> <p><strong>Data Acquisition Service</strong>: The coordinating service that will capture images, robot metadata, and delegate to plugins to capture custom sensor data.</p> <p><strong><a class='reference internal' href='/docs/concepts/writing_services_for_data_acquisition'><span class="doc">Data Acquisition Plugins</span></a></strong>: User-implemented services that can capture data from sensors and save it into the store.</p> <p><strong>Data Acquisition Store</strong>: Interface for saving data and metadata to disk for later retrieval.</p> <p><strong><a class='reference internal' href='/docs/concepts/writing_services_for_data_acquisition'><span class="doc">Image services</span></a></strong>: Existing interface used in a new way. User-implemented image services will now be displayed in the tablet for driving, and be automatically capturable by the Data Acquisition Service.</p> </section> <section id="new-mobility-commands"> <h4>New Mobility Commands<a class="headerlink" href="#new-mobility-commands" title="Permalink to this heading"></a></h4> <p><strong>Stance</strong>: Allows precise placement of the feet of the robot, beyond just positioning the body.</p> <p><strong>Battery change pose</strong>: Rolls Spot over so that the battery is accessible removal and replacement.</p> </section> <section id="arm-control-preparation"> <h4>Arm Control Preparation<a class="headerlink" href="#arm-control-preparation" title="Permalink to this heading"></a></h4> <p>Several changes have been made in preparation for the release of Spot’s arm. These represent new ways to accomplish the same control as before, but in a way that will be compatible with also controlling the robot’s arm in a future release.</p> <p><strong>Synchronized commands and feedback</strong>: A new synchronized_command for combining mobility control with arm and gripper control. This deprecates the <code class="docutils literal notranslate"><span class="pre">mobility_command</span></code> in the <code class="docutils literal notranslate"><span class="pre">RobotCommand</span></code> message. Additionally, the top-level command status has been moved into the individual full-body and mobility command feedback messages so that mobility and arm commands can individually report their state.</p> <p><strong>Stop</strong>: The existing full-body <code class="docutils literal notranslate"><span class="pre">Stop</span></code> command still exists, but there is an additional mobility-only <code class="docutils literal notranslate"><span class="pre">Stop</span></code> command that can be used to only stop the mobility without affecting any separate arm control.</p> </section> <section id="service-faults"> <h4><a class='reference internal' href='/docs/concepts/faults'><span class="doc">Service Faults</span></a><a class="headerlink" href="#service-faults" title="Permalink to this heading"></a></h4> <p>To simplify the development of reliable services and report when problems arise, a new set of reportable faults has been added, usable by all services.</p> <p><strong>Fault Service</strong>: Used to report or clear faults pertaining to a service or payload. The Python SDK includes a client library for triggering and clearing faults through this service.</p> <p><strong>ServiceFaultState in RobotState</strong>: All reported service faults will be included in the <code class="docutils literal notranslate"><span class="pre">RobotState</span></code> message. Clearing active faults will move them into historical faults. All service faults will automatically be displayed in the tablet interface to inform users.</p> <p><strong>Directory and Payload Liveness faults</strong>: New options for directory and payload registration enable liveness monitoring. When this feature is implemented, alongside directory or payload keep-alives, service faults will be automatically raised when a service crashes or a payload disconnects.</p> <p><strong>Integrations</strong>: Boston Dynamics supported payloads incorporate service faults and liveness monitoring out of the box.</p> <ul class="simple"> <li><p>Spot CORE will report service faults if it experiences issues during startup, fails to communicate with the robot, detects an invalid payload configuration, or fails to communicate to an expected LiDAR.</p></li> <li><p>Spot CAM will report service faults if it is disconnected from Spot or if any of its internal services crash.</p></li> <li><p>The <code class="docutils literal notranslate"><span class="pre">bosdyn.client</span></code> command line interface can show and monitor reported faults.</p></li> </ul> </section> <section id="data-logging"> <h4>Data Logging<a class="headerlink" href="#data-logging" title="Permalink to this heading"></a></h4> <p>The robot now dedicates some internal storage space to user data and logging. In addition to the data acquisition system, the user can store messages, events, time-series data, or arbitrary binary blobs.</p> <p><strong>Data Buffer</strong>: New service interface for storing various kinds of data on the robot.</p> <p><strong>Data Service</strong>: Retrieval service that can be used to return the data stored in the data buffer.</p> <p><strong>BDDF</strong>: File format for large downloads of stored data, and tools for reading the file.</p> <p><strong>Download endpoints</strong>: HTTPS download of a zip file of data acquisition mission datasets or bddf-encoded data.</p> </section> <section id="point-clouds"> <h4>Point Clouds<a class="headerlink" href="#point-clouds" title="Permalink to this heading"></a></h4> <p>Point cloud service definitions are provided for retrieving point cloud data from LiDAR sensors, such as from the EAP payload.</p> </section> <section id="id181"> <h4>Spot CAM<a class="headerlink" href="#id181" title="Permalink to this heading"></a></h4> <p>Congestion control is now available for WebRTC streaming. External microphones supported, with control for selecting microphones and setting gain levels individually. Note: External microphone support only available on Spot CAM + IR.</p> </section> <section id="id182"> <h4>Graph Nav<a class="headerlink" href="#id182" title="Permalink to this heading"></a></h4> <p>The localization data now includes a transform to a “seed” frame, providing a consistent global frame for use across multiple runs on the same map.</p> <p>Localization data can be requested relative to a particular waypoint, rather than only the waypoint that the robot is currently localized to.</p> <p>Additional control for determining whether the robot will navigate through areas with poor quality features.</p> </section> <section id="id183"> <h4>Missions<a class="headerlink" href="#id183" title="Permalink to this heading"></a></h4> <p>Additional mission nodes which support new functionality:</p> <ul class="simple"> <li><p>Point the Spot CAM PTZ to a specified orientation.</p></li> <li><p>Dock the robot at a charging station.</p></li> <li><p>Capture data through the data acquisition service.</p></li> <li><p>Manipulate strings in the blackboard.</p></li> </ul> </section> <section id="choreography-license-dependent"> <h4>Choreography (License-dependent)<a class="headerlink" href="#choreography-license-dependent" title="Permalink to this heading"></a></h4> <p>Play advanced choreographed routines for Spot. The choreography service requires a special license to use.</p> </section> <section id="docking-beta-license-dependent"> <h4>Docking (Beta, License-dependent)<a class="headerlink" href="#docking-beta-license-dependent" title="Permalink to this heading"></a></h4> <p>The new docking service provides a way to autonomously dock at a charging station. It is currently in beta, and requires a special license to use.</p> </section> </section> <section id="id184"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id184" title="Permalink to this heading"></a></h3> <p><strong>Graph Nav</strong></p> <ul class="simple"> <li><p>Added fiducial-related status errors in <code class="docutils literal notranslate"><span class="pre">SetLocalizationResponse</span></code>, such as a fiducial being too far away or having poor data.</p></li> <li><p>Edges now record mobility params that were set during record time, and use them when navigating those edges.</p></li> <li><p>“Stuck” detection has changed, and the robot will report much sooner when it has no way to make progress.</p></li> <li><p>Improved <code class="docutils literal notranslate"><span class="pre">StartRecordingResponse</span></code> and <code class="docutils literal notranslate"><span class="pre">CreateWaypointResponse</span></code> to report errors about bad fiducials or point cloud data.</p></li> </ul> <p><strong>Fiducial Detection</strong></p> <ul class="simple"> <li><p>Fiducials now report a filtered pose in addition to the raw detected pose, to avoid jitter in individual detections.</p></li> <li><p>Fiducial detections include extra information, such as the detection covariance, camera frame, and status regarding ambiguity or error.</p></li> </ul> <p><strong>Mission Nodes</strong></p> <ul class="simple"> <li><p>The <code class="docutils literal notranslate"><span class="pre">BosdynGraphNavState</span></code> node can specify the id of the waypoint to use for the reported localization.</p></li> </ul> <p><strong>Spot Check</strong></p> <ul class="simple"> <li><p>Added status field in <code class="docutils literal notranslate"><span class="pre">SpotCheckCommandResponse</span></code>.</p></li> <li><p>Improved the list of errors in <code class="docutils literal notranslate"><span class="pre">SpotCheckFeedbackResponse</span></code> message.</p></li> <li><p>Spot Check now checks and reports results on hip range of motion.</p></li> </ul> <p><strong>Python client</strong></p> <ul class="simple"> <li><p>Blocking “power on” and “power off” helpers report errors correctly, rather than always raising <code class="docutils literal notranslate"><span class="pre">CommandTimedOutError</span></code> if the robot could not power on or off.</p></li> <li><p>Added helper classes for registering and launching services.</p></li> <li><p>Added the ability to authenticate the robot instance from payload credentials.</p></li> <li><p>Printing the Spot SDK exceptions now provides more information.</p></li> <li><p>Increased default message size limit for receiving and sending messages to 100 MB</p></li> <li><p>Command line interface supports the new 2.1 functionality</p> <ul> <li><p>Payload commands.</p></li> <li><p>Payload registration commands.</p></li> <li><p>Fault commands.</p></li> <li><p>Data buffer commands.</p></li> <li><p>Data service commands.</p></li> <li><p>Data acquisition commands.</p></li> </ul> </li> </ul> <p><strong>Image capture parameters</strong></p> <ul class="simple"> <li><p>Added exposure and gain parameters associated with an image capture.</p></li> </ul> <p><strong>License interface</strong></p> <ul class="simple"> <li><p>Added <code class="docutils literal notranslate"><span class="pre">GetFeatureEnabled()</span></code> to the <code class="docutils literal notranslate"><span class="pre">LicenseService</span></code> to query for particular license features.</p></li> </ul> </section> <section id="id185"> <h3>Breaking changes<a class="headerlink" href="#id185" title="Permalink to this heading"></a></h3> <p><strong>Robot Control</strong></p> <p>A behavior fault (<code class="docutils literal notranslate"><span class="pre">CAUSE_LEASE_TIMEOUT</span></code>) is raised when the usage of a lease times out, and must be cleared before the robot can be commanded again. This should have minimal effect on current clients, as this happens near the same time that the robot powers off from comms loss (which clears behavior faults).</p> <p><strong>Graph Nav</strong></p> <p>When GraphNav reports <code class="docutils literal notranslate"><span class="pre">STATUS_STUCK</span></code> while navigating, the robot will stop walking. It will need to be re-commanded to navigate in order to continue. Previous behavior was that the robot would continue walking when stuck until commanded to stop by a client.</p> <p><strong>Missions</strong></p> <p>Autowalk mission callback nodes only wait 10 seconds for a response. When a mission calls <code class="docutils literal notranslate"><span class="pre">Tick()</span></code> on a mission callback service, it expects a quick response. In 2.0 it would wait up to 60 seconds for a response before retrying. This has been reduced to 10 seconds in version 2.1. Callbacks that do any significant work should be written to return with <code class="docutils literal notranslate"><span class="pre">STATUS_RUNNING</span></code> quickly, and then continue to do their work on another thread rather than trying to fit in all of their work before returning a response. The service can then base their response to subsequent <code class="docutils literal notranslate"><span class="pre">Tick()</span></code> requests on the status of that thread.</p> </section> <section id="id186"> <h3>Known Issues<a class="headerlink" href="#id186" title="Permalink to this heading"></a></h3> <p><strong>When a network transport failure occurs,</strong> depending on the particular operating system and version of gRPC installed, the error from the python SDK may not always be the most specific error possible, such as <code class="docutils literal notranslate"><span class="pre">UnknownDnsNameError</span></code>. It may instead be raised as either a generic <code class="docutils literal notranslate"><span class="pre">RpcError</span></code>, or another generic failure type such as <code class="docutils literal notranslate"><span class="pre">UnableToConnectToRobotError</span></code>.</p> <p><strong>Spot CAM LED illumination levels</strong> are not currently recorded or played back in Autowalk missions.</p> <p><strong>When capturing both a PTZ and Panoramic image</strong> in the same action, there may occasionally be two PTZ images captured along with the Panoramic image, rather than just one.</p> <p><strong>If you write a custom data acquisition plugin or image service,</strong> do not change its <code class="docutils literal notranslate"><span class="pre">DataAcquisitionCapability</span></code> or <code class="docutils literal notranslate"><span class="pre">ImageSource</span></code> set once it is running and registered. New capabilities may not be detected, and old capabilities may still be listed as available in the Data Acquisition service. To change the capabilities of a service: unregister it from the directory, wait until its capabilities are no longer listed in the Data Acquisition service, and then re-register it. This waiting also applies to restarting a service if its capabilities will be different upon restart.</p> <p>Furthermore, always specify the port that it should run on via the <code class="docutils literal notranslate"><span class="pre">--port</span></code> flag, and do not change it between restarts of your plugin or image service. If you must change the port, then you must reboot the robot.</p> <p><strong>If you write a custom data acquisition plugin without using our helper class,</strong> its <code class="docutils literal notranslate"><span class="pre">GetStatus()</span></code> RPC is expected to complete immediately. If it takes too long to complete it can cause timeouts when requesting <code class="docutils literal notranslate"><span class="pre">GetStatus()</span></code> of the data acquisition service.</p> <p><strong>If you configure the estop service with custom timeouts</strong> and set an invalid timeout, you will not receive an error, but the robot will set the timeout to something else. The maximum estop timeout is 60 seconds, and the maximum estop cut_power_timeout is 65 seconds.</p> <p><strong>If you register a new service with the robot</strong>, calling <code class="docutils literal notranslate"><span class="pre">robot.ensure_client()</span></code> to create a client for that service may result in a <code class="docutils literal notranslate"><span class="pre">UnregisteredServiceNameError</span></code>.</p> <ul class="simple"> <li><p>Workaround: call <code class="docutils literal notranslate"><span class="pre">robot.sync_with_directory()</span></code> before <code class="docutils literal notranslate"><span class="pre">robot.ensure_client()</span></code></p></li> </ul> <p><strong>SE2VelocityLimits require care</strong>. Correct usage of the <code class="docutils literal notranslate"><span class="pre">SE2VelocityLimit</span></code> message requires the user to fully fill out all the fields, setting unlimited values to a large number, say 1e6.</p> </section> <section id="id187"> <h3>Deprecations<a class="headerlink" href="#id187" title="Permalink to this heading"></a></h3> <p>The following services, fields, and functions will continue to work, but will be removed in a future version.</p> <section id="services"> <h4>Services<a class="headerlink" href="#services" title="Permalink to this heading"></a></h4> <p>The <code class="docutils literal notranslate"><span class="pre">LogAnnotationService</span></code> is replaced with the <code class="docutils literal notranslate"><span class="pre">DataBufferService</span></code>, which allows user access to the logged data.</p> </section> <section id="protobuf-changes"> <h4>Protobuf changes<a class="headerlink" href="#protobuf-changes" title="Permalink to this heading"></a></h4> <p>Mobility commands have been moved from <code class="docutils literal notranslate"><span class="pre">RobotCommand</span></code>, and into <code class="docutils literal notranslate"><span class="pre">SynchronizedCommand</span></code> within <code class="docutils literal notranslate"><span class="pre">RobotCommand</span></code>. When changing clients to use <code class="docutils literal notranslate"><span class="pre">SynchronizedCommand</span></code>, be aware that the feedback will be in the new <code class="docutils literal notranslate"><span class="pre">SynchronizedCommand</span></code> feedback. The top-level command status is also deprecated in favor of a status within individual feedback messages. Changing clients to use the new <code class="docutils literal notranslate"><span class="pre">SynchronizedCommand</span></code> will make them compatible with arm commands in a future release.</p> <p>The representation of <code class="docutils literal notranslate"><span class="pre">SE3Covariance</span></code> has changed to a matrix. The individual element representation is deprecated.</p> <p>In the map edge annotations, the <code class="docutils literal notranslate"><span class="pre">ground_mu_hint</span></code> and <code class="docutils literal notranslate"><span class="pre">grated_floor</span></code> fields have moved into the <code class="docutils literal notranslate"><span class="pre">mobility_params</span></code> message.</p> </section> <section id="client-changes"> <h4>Client changes<a class="headerlink" href="#client-changes" title="Permalink to this heading"></a></h4> <p>The helper functions in <code class="docutils literal notranslate"><span class="pre">RobotCommandBuilder</span></code> have new versions that use the new <code class="docutils literal notranslate"><span class="pre">SynchronizedCommand</span></code>.</p> <p><code class="docutils literal notranslate"><span class="pre">sit_command()</span></code> → <code class="docutils literal notranslate"><span class="pre">synchro_sit_command()</span></code></p> <p><code class="docutils literal notranslate"><span class="pre">stand_command()</span></code> → <code class="docutils literal notranslate"><span class="pre">synchro_stand_command()</span></code></p> <p><code class="docutils literal notranslate"><span class="pre">velocity_command()</span></code> → <code class="docutils literal notranslate"><span class="pre">synchro_velocity_command()</span></code></p> <p><code class="docutils literal notranslate"><span class="pre">trajectory_command()</span></code> → <code class="docutils literal notranslate"><span class="pre">synchro_se2_trajectory_point_command()</span></code></p> <p>The non-synchro versions are deprecated, and will be removed at the time that the mobility commands are removed from <code class="docutils literal notranslate"><span class="pre">RobotCommand</span></code>.</p> </section> </section> <section id="id188"> <h3>Sample Code<a class="headerlink" href="#id188" title="Permalink to this heading"></a></h3> <section id="id189"> <h4>New<a class="headerlink" href="#id189" title="Permalink to this heading"></a></h4> <p><a class='reference internal' href='/python/examples/data_acquisition_service/readme'><span class="doc">Data acquisition (new)</span></a></p> <ul class="simple"> <li><p>Example data acquisition plugin implementations.</p></li> <li><p>Examples for capturing and downloading data.</p></li> <li><p>Test program to validate a data acquisition plugin.</p></li> </ul> <p><a class='reference internal' href='/python/examples/comms_test/readme'><span class="doc">Comms Test (new)</span></a> Demonstrates how to use the SDK to perform comms testing.</p> <p><a class='reference internal' href='/python/examples/data_service/readme'><span class="doc">Data Service (new)</span></a> Get comments and data index information from the robot.</p> <p><a class='reference internal' href='/python/examples/ricoh_theta/readme'><span class="doc">Ricoh theta image service (new)</span></a> Create a standard Boston Dynamics API <code class="docutils literal notranslate"><span class="pre">ImageService</span></code> that communicates with the Ricoh Theta camera.</p> <p><a class='reference internal' href='/python/examples/service_faults/readme'><span class="doc">Service faults (new)</span></a> Demonstrates raising service faults, clearing service faults, and implementation of directory liveness checks.</p> <p><a class="reference external" href="https://github.com/boston-dynamics/spot-sdk/blob/577c45e26241ba1cbbbdf3d85013b2a5b2b52888/python/examples/spot_detect_and_follow/README"><strong>Spot detect and follow (new)</strong></a> Collects images from the two front Spot cameras and performs object detection on a specified class.</p> <p><a class='reference internal' href='/python/examples/stance/readme'><span class="doc">Stance (new)</span></a> Exercises the stance function to reposition the robots feet.</p> <p><a class='reference internal' href='/python/examples/stitch_front_images/readme'><span class="doc">Stitch front images</span></a> Demonstrate how to stitch the front camera images together into a single image in an OpenGL shader.</p> <p><a class='reference internal' href='/python/examples/upload_choreographed_sequence/readme'><span class="doc">Upload choreographed sequence (new)</span></a> Shows how to use the Choreography service to upload an existing choreographed sequence to the robot, and have the robot execute that uploaded routine.</p> <p><a class='reference internal' href='/python/examples/velodyne_client/readme'><span class="doc">Velodyne client (new)</span></a> Demonstrates how to use the Velodyne service to query for point clouds.</p> <p><a class='reference internal' href='/python/examples/service_customization/custom_parameter_image_server/readme'><span class="doc">Web cam image service (new)</span></a> Implements the standard Boston Dynamics API <code class="docutils literal notranslate"><span class="pre">ImageService</span></code> and communicates to common web cameras using OpenCV.</p> <p><a class='reference internal' href='/python/examples/world_object_with_image_coordinates/readme'><span class="doc">World object with image coords (new)</span></a> Demonstrates adding a world object that exists only in image coordinates, rather than having a full transform.</p> </section> <section id="id190"> <h4>Updated<a class="headerlink" href="#id190" title="Permalink to this heading"></a></h4> <p><a class='reference internal' href='/python/examples/fiducial_follow/readme'><span class="doc">Fiducial follow (updated)</span></a></p> <ul class="simple"> <li><p>Uses the new <code class="docutils literal notranslate"><span class="pre">SynchronizedCommand</span></code> for robot commands.</p></li> </ul> <p><a class='reference internal' href='/python/examples/frame_trajectory_command/readme'><span class="doc">Frame trajectory command (updated)</span></a></p> <ul class="simple"> <li><p>Uses the new <code class="docutils literal notranslate"><span class="pre">SynchronizedCommand</span></code> for robot commands.</p></li> </ul> <p><a class='reference internal' href='/python/examples/get_image/readme'><span class="doc">Get image (updated)</span></a></p> <ul class="simple"> <li><p>Added an option to auto-rotate images to be rightside-up.</p></li> <li><p>Added an option to retrieve images from user image services.</p></li> <li><p>Added support for more pixel formats.</p></li> </ul> <p><a class='reference internal' href='/python/examples/graph_nav_command_line/readme'><span class="doc">GraphNav command-line (updated)</span></a></p> <ul class="simple"> <li><p>Waypoints can be specified by either short codes or waypoint names.</p></li> <li><p>Waypoints sorted by creation time.</p></li> </ul> <p><a class='reference internal' href='/python/examples/hello_spot/readme'><span class="doc">Hello spot (updated)</span></a></p> <ul class="simple"> <li><p>Uses the new <code class="docutils literal notranslate"><span class="pre">SynchronizedCommand</span></code> for robot commands.</p></li> </ul> <p><a class='reference internal' href='/python/examples/logging/readme'><span class="doc">Logging (updated)</span></a></p> <ul class="simple"> <li><p>Switched to use Data Buffer for logging instead of the deprecated <code class="docutils literal notranslate"><span class="pre">LogAnnotationService</span></code>.</p></li> </ul> <p><a class='reference internal' href='/python/examples/mission_question_answerer/readme'><span class="doc">Mission question answerer (updated)</span></a></p> <ul class="simple"> <li><p>Updated to prompt the user on the command line for an answer.</p></li> </ul> <p><a class='reference internal' href='/python/examples/mission_recorder/readme'><span class="doc">Mission recorder (updated)</span></a></p> <ul class="simple"> <li><p>Added support for navigating through feature-poor areas.</p></li> </ul> <p><a class='reference internal' href='/python/examples/payloads/readme'><span class="doc">Payload (updated)</span></a></p> <ul class="simple"> <li><p>Uses the new payload keep-alive.</p></li> </ul> <p><a class='reference internal' href='/python/examples/remote_mission_service/readme'><span class="doc">Remote mission service (updated)</span></a></p> <ul class="simple"> <li><p>Separated example_servicers.py into separate hello_world_mission_service.py and power_off_mission_service.py files.</p></li> </ul> <p><a class='reference internal' href='/python/examples/replay_mission/readme'><span class="doc">Replay mission (updated)</span></a></p> <ul class="simple"> <li><p>Added an option to skip the initial localization.</p></li> </ul> <p><a class='reference internal' href='/python/examples/self_registration/readme'><span class="doc">Self Registration (updated)</span></a></p> <ul class="simple"> <li><p>Uses new helpers for registration.</p></li> </ul> <p><a class='reference internal' href='/python/examples/spot_cam/readme'><span class="doc">Spot CAM (updated)</span></a></p> <ul class="simple"> <li><p>New option to delete all images from the USB drive.</p></li> <li><p>Support for the IR camera.</p></li> </ul> <p><a class='reference internal' href='/python/examples/spot_light/readme'><span class="doc">Spot light (updated)</span></a></p> <ul class="simple"> <li><p>Uses the new <code class="docutils literal notranslate"><span class="pre">SynchronizedCommand</span></code> for robot commands.</p></li> </ul> <p><a class='reference internal' href='/python/examples/wasd/readme'><span class="doc">Wasd (updated)</span></a></p> <ul class="simple"> <li><p>Uses the new <code class="docutils literal notranslate"><span class="pre">SynchronizedCommand</span></code> for robot commands.</p></li> <li><p>Supports battery change pose command.</p></li> </ul> <p><a class='reference internal' href='/python/examples/xbox_controller/readme'><span class="doc">Xbox controller (updated)</span></a></p> <ul class="simple"> <li><p>Uses the new <code class="docutils literal notranslate"><span class="pre">SynchronizedCommand</span></code> for robot commands.</p></li> <li><p>Supports battery change pose command.</p></li> </ul> </section> <section id="removed"> <h4>Removed<a class="headerlink" href="#removed" title="Permalink to this heading"></a></h4> <p><strong>Ricoh Theta remote mission service (removed)</strong></p> <ul class="simple"> <li><p>This has been removed and replaced with the Ricoh Theta image service, which provides better integration for displaying and capturing data.</p></li> </ul> <p><strong>get_depth_plus_visual_image (removed)</strong></p> <ul class="simple"> <li><p>Example removed because all robot cameras include <code class="docutils literal notranslate"><span class="pre">depth_in_visual_frame</span></code> sources by default.</p></li> </ul> <p><strong>Spot check (removed)</strong></p> <ul class="simple"> <li><p>Users can run Spot Check from the tablet.</p></li> </ul> </section> </section> </section> <section id="id191"> <h2>2.0.2<a class="headerlink" href="#id191" title="Permalink to this heading"></a></h2> <section id="id192"> <h3>New Features<a class="headerlink" href="#id192" title="Permalink to this heading"></a></h3> </section> <section id="id193"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id193" title="Permalink to this heading"></a></h3> <section id="power-command-exceptions"> <h4>Power Command Exceptions<a class="headerlink" href="#power-command-exceptions" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Power Client detects errors during a power command right away and propagates them up to the application before the command timeout is reached.</p></li> </ul> </section> </section> <section id="id194"> <h3>Known Issues<a class="headerlink" href="#id194" title="Permalink to this heading"></a></h3> <p>Release 2.0.2 contains the same issues as release 2.0.1, listed below.</p> <p><strong>If you delete an object from the world object service</strong>, there is a chance that a ListWorldObjects call immediately afterward may still include that object.</p> <ul class="simple"> <li><p>Workaround: wait a short time before expecting the object to be gone.</p></li> </ul> <p><strong>If you register a new service with the robot</strong>, calling robot.ensure_client to create a client for that service may result in a UnregisteredServiceNameError.</p> <ul class="simple"> <li><p>Workaround: call robot.sync_with_directory() before robot.ensure_client()</p></li> </ul> <p><strong>SE2VelocityLimits require care</strong>. The proto comment states that “if set, limits the min/max velocity,” implying that one should not set values for any directions one does not want limited. However, if any of the numeric fields are not set in the message, they will be interpreted as 0. For example, if angular is not set but linear is, then the message will be incorrectly interpreted as having an angular limit of 0 and the robot will fail to rotate (obviously not the intent). Similarly, if the user only sets say the ‘x’ field of linear, then ‘y’ will be incorrectly limited to 0 as well.</p> <ul class="simple"> <li><p>Workaround: Correct usage of the SE2VelocityLimit message requires the user to fully fill out all the fields, setting unlimited values to a large number, say 1e6.</p></li> </ul> <p><strong>LogAnnotationClient does not include async versions</strong> of its RPCs.</p> <ul class="simple"> <li><p>Workaround: If you need to call these in an async manner, call them on a separate thread.</p></li> </ul> </section> </section> <section id="id195"> <h2>2.0.1<a class="headerlink" href="#id195" title="Permalink to this heading"></a></h2> <section id="id196"> <h3>New Features<a class="headerlink" href="#id196" title="Permalink to this heading"></a></h3> <section id="license-changes"> <h4>License Changes<a class="headerlink" href="#license-changes" title="Permalink to this heading"></a></h4> <p>App tokens are no longer required to authorize applications. Instead, each robot itself will be licensed itself. From a programming perspective, this means that it is no longer necessary to load app tokens into the sdk object, or to fill them out in GetAuthTokenRequest.</p> <p>If a client attempts to call a function for which the robot is not licensed, the robot will respond with an error related to the license issue. The PowerService and GraphNavService responses now include new error codes for license errors on certain actions.</p> <p>There is a new LicenseClient which can be used to query the license information for a robot. License information can also be queried from the bosdyn.client command line utility.</p> </section> </section> <section id="id197"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id197" title="Permalink to this heading"></a></h3> <section id="behavior-faults"> <h4>Behavior Faults<a class="headerlink" href="#behavior-faults" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>The robot previously accepted new commands when there were behavior faults, but did not execute them and would not provide feedback on them. The robot will now reject them with the new status <code class="docutils literal notranslate"><span class="pre">STATUS_BEHAVIOR_FAULT</span></code>.</p></li> <li><p>The python SDK will throw the exception <code class="docutils literal notranslate"><span class="pre">BehaviorFaultError</span></code>. 2.0.0 clients will throw a <code class="docutils literal notranslate"><span class="pre">ResponseError</span></code> in these cases.</p></li> </ul> </section> <section id="map-recording"> <h4>Map Recording<a class="headerlink" href="#map-recording" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>If the fiducials are not visible, the action will fail with <code class="docutils literal notranslate"><span class="pre">STATUS_MISSING_FIDUCIALS</span></code>. When starting recording or creating a manual waypoint in the GraphNavRecordingService, the client can require certain fiducials to be visible. If the fiducials are not visible, the action will fail with <code class="docutils literal notranslate"><span class="pre">STATUS_MISSING_FIDUCIALS</span></code>.</p></li> <li><p>When recording a map, grated floor mode and ground friction hints that are set in the recording environment are now correctly recorded into the map and used during playback.</p></li> </ul> </section> <section id="id198"> <h4>Spot CAM<a class="headerlink" href="#id198" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Added an option to the Spot CAM MediaLogService to retrieve the raw (unstitched) images for a log point.</p></li> </ul> </section> <section id="payload-integration"> <h4>Payload Integration<a class="headerlink" href="#payload-integration" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>When a payload is authorized, it is given full access to the services on the robot, rather than a limited set. For example, a payload could now operate Spot.</p></li> </ul> </section> <section id="additional-fixes"> <h4>Additional Fixes<a class="headerlink" href="#additional-fixes" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Removed some obsolete or internal protobuf messages and service RPCs which were not in use in the SDK.</p></li> <li><p>Fixed an issue where the SDK would continuously try to request new tokens if it lost connection to the robot at the time when it tried to renew its current user token.</p></li> </ul> </section> </section> <section id="id199"> <h3>Known Issues<a class="headerlink" href="#id199" title="Permalink to this heading"></a></h3> <p>Release 2.0.1 contains the same issues as release 2.0.0, listed below.</p> <p><strong>If you delete an object from the world object service</strong>, there is a chance that a ListWorldObjects call immediately afterward may still include that object.</p> <ul class="simple"> <li><p>Workaround: wait a short time before expecting the object to be gone.</p></li> </ul> <p><strong>If you register a new service with the robot</strong>, calling robot.ensure_client to create a client for that service may result in a UnregisteredServiceNameError.</p> <ul class="simple"> <li><p>Workaround: call robot.sync_with_directory() before robot.ensure_client()</p></li> </ul> <p><strong>SE2VelocityLimits require care</strong>. The proto comment states that “if set, limits the min/max velocity,” implying that one should not set values for any directions one does not want limited. However, if any of the numeric fields are not set in the message, they will be interpreted as 0. For example, if angular is not set but linear is, then the message will be incorrectly interpreted as having an angular limit of 0 and the robot will fail to rotate (obviously not the intent). Similarly, if the user only sets say the ‘x’ field of linear, then ‘y’ will be incorrectly limited to 0 as well.</p> <ul class="simple"> <li><p>Workaround: Correct usage of the SE2VelocityLimit message requires the user to fully fill out all the fields, setting unlimited values to a large number, say 1e6.</p></li> </ul> <p><strong>LogAnnotationClient does not include async versions</strong> of its RPCs.</p> <ul class="simple"> <li><p>Workaround: If you need to call these in an async manner, call them on a separate thread.</p></li> </ul> </section> <section id="id200"> <h3>Sample Code<a class="headerlink" href="#id200" title="Permalink to this heading"></a></h3> <p><a class='reference internal' href='/python/examples/ricoh_theta/readme'><span class="doc">Ricoh Theta (new)</span></a></p> <ul class="simple"> <li><p>Example that utilizes the 360-degree Ricoh Theta camera during an Autowalk mission.</p></li> </ul> <p><a class='reference internal' href='/python/examples/cloud_upload/readme'><span class="doc">Cloud Upload (new)</span></a></p> <ul class="simple"> <li><p>Example that shows how to upload a file to a Google Cloud Platform (GCP) bucket or an Amazon Web Services (AWS) S3 bucket.</p></li> </ul> <p><a class='reference internal' href='/python/examples/wasd/readme'><span class="doc">WASD</span></a></p> <ul class="simple"> <li><p>Updated to account for the additional state metrics that are reported. Older versions of this example may fail when connecting to updated robots.</p></li> </ul> <p><a class='reference internal' href='/python/examples/spot_cam/readme'><span class="doc">Spot CAM</span></a></p> <ul class="simple"> <li><p>Added support for viewing the WebRTC stream.</p></li> </ul> <p><a class='reference internal' href='/python/examples/replay_mission/readme'><span class="doc">Replay Mission</span></a></p> <ul class="simple"> <li><p>The example script does not localize itself to any map, but assumes the robot is already localized or that the mission has a localization node in it.</p></li> <li><p>It verifies that an estop is properly connected before trying to run the mission.</p></li> <li><p>It contains an additional –timeout parameter that can be used to set an overall time limit on mission execution.</p></li> </ul> <p><a class='reference internal' href='/python/examples/mission_recorder/readme'><span class="doc">Mission Recorder</span></a></p> <ul class="simple"> <li><p>Can add relocalization nodes to a mission.</p></li> </ul> <p><a class='reference internal' href='/python/examples/fiducial_follow/readme'><span class="doc">Fiducial Follow</span></a></p> <ul class="simple"> <li><p>Fixed a UI crash on MacOS X.</p></li> </ul> </section> </section> <section id="id201"> <h2>2.0.0<a class="headerlink" href="#id201" title="Permalink to this heading"></a></h2> <section id="id202"> <h3>New Features<a class="headerlink" href="#id202" title="Permalink to this heading"></a></h3> <section id="autonomous-navigation-apis"> <h4>Autonomous Navigation APIs<a class="headerlink" href="#autonomous-navigation-apis" title="Permalink to this heading"></a></h4> <p>The APIs used by Autowalk are now accessible to developers.</p> <ul class="simple"> <li><p><a class='reference internal' href='/docs/concepts/readme'><span class="doc">Overall conceptual documents</span></a></p></li> <li><p><strong>GraphNavService</strong>: Upload and download maps of the environment, update localizations to that map, and command the robot to autonomously navigate to a location in the map. Example usage can be found in <code class="docutils literal notranslate"><span class="pre">graph_nav_command_line.py</span></code>. Examples of interpreting the map data can be found in <code class="docutils literal notranslate"><span class="pre">graph_nav_view_map.py</span></code></p></li> <li><p><strong>GraphNavRecordingService</strong>: Record maps while the robot walks around. Example usage found in <code class="docutils literal notranslate"><span class="pre">recording_command_line.py</span></code></p></li> <li><p><strong>MissionService</strong>: Load and play autonomous missions. Example mission creation is shown in <code class="docutils literal notranslate"><span class="pre">mission_recorder.py</span></code> with upload and playback usage shown in <code class="docutils literal notranslate"><span class="pre">replay_mission.py</span></code></p></li> <li><p><strong>RemoteMissionService</strong>: A new method for handling mission callbacks, where the mission can trigger user code via an RPC. For building your own callbacks, see the examples in remote_mission_service.</p></li> </ul> </section> <section id="spot-cam-api"> <h4>Spot CAM API<a class="headerlink" href="#spot-cam-api" title="Permalink to this heading"></a></h4> <p>Control and query all hardware features of the Spot CAM. For examples of using each service, see the <a class='reference internal' href='/python/examples/spot_cam/readme'><span class="doc">Spot CAM command line example</span></a>.</p> <ul class="simple"> <li><p><strong>CompositorService</strong> and <strong>StreamQualityService</strong>: change the layout and quality of the webrtc stream.</p></li> <li><p><strong>PtzService</strong>: Direct PTZ cameras to desired poses.</p></li> <li><p><strong>LightingService</strong>: Control the individual brightness of the illuminator LEDs.</p></li> <li><p><strong>MediaLogService</strong>: Save and retrieve high-resolution images to and from the internal USB drive for later processing.</p></li> <li><p><strong>AudioService</strong>: Upload and play sounds over the Spot CAM speakers.</p></li> <li><p><strong>NetworkService</strong>: Adjust networking settings.</p></li> <li><p><strong>HealthService</strong>, <strong>VersionService</strong>, <strong>PowerService</strong>: Query the status of the hardware and software, and power components on and off.</p></li> </ul> </section> <section id="payload-api-integration"> <h4>Payload API integration<a class="headerlink" href="#payload-api-integration" title="Permalink to this heading"></a></h4> <p><a class='reference internal' href='/docs/payload/configuring_payload_software'><span class="doc">Payloads with a compute component can self-register with Spot and API services</span></a></p> <ul class="simple"> <li><p><strong>DirectoryRegistrationService</strong>: Allows end users to register new gRPC services running on a payload into the robots service directory. This allows for communicating through the robot’s proxy to the service from off-robot, and for registering mission callbacks for integrations with Autowalk missions. See <code class="docutils literal notranslate"><span class="pre">directory_modification.py</span></code> for example usage.</p></li> <li><p><strong>PayloadRegistrationService</strong>: Payloads can now register themselves with the robot, providing their properties and awaiting authorization from a robot administrator. See the self_registration and payloads examples for how to register your own payload.</p></li> </ul> </section> <section id="environmental-apis"> <h4>Environmental APIs<a class="headerlink" href="#environmental-apis" title="Permalink to this heading"></a></h4> <p>Learn more about how Spot is perceiving the world around it.</p> <ul class="simple"> <li><p><strong>WorldObjectService</strong>: Request details of any objects that has been detected in the world, and add your own detections. Example usage can be found in <code class="docutils literal notranslate"><span class="pre">mutate_world_objects.py</span></code>, <code class="docutils literal notranslate"><span class="pre">fiducial_follow.py</span></code>, and <code class="docutils literal notranslate"><span class="pre">add_image_coordinates.py</span></code>.</p></li> <li><p><strong>LocalGridService</strong>: Request maps of the area around the robot, including terrain height and obstacle classification. Example usage shown by the bosdyn.client command line utility and the <code class="docutils literal notranslate"><span class="pre">basic_streaming_visualizer.py</span></code> example.</p></li> <li><p><strong>depth_in_visual_frame</strong> image sources. These depth map images have the same dimension, extrinsics, and intrinsics as the grayscale image sources, which can help with pixel-depth correspondence issues.</p></li> </ul> </section> </section> <section id="id203"> <h3>Bug Fixes and Improvements<a class="headerlink" href="#id203" title="Permalink to this heading"></a></h3> <section id="expanded-and-improved-documentation"> <h4>Expanded and improved documentation<a class="headerlink" href="#expanded-and-improved-documentation" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Python QuickStart has been revamped to streamline getting up and running on the SDK.</p></li> <li><p>Conceptual documentation has been added to explain key ideas on how to develop for Spot.</p></li> <li><p>Payload developers guide has been added.</p></li> <li><p>Generated documents of the API protocol have also been added.</p></li> </ul> </section> <section id="improved-performance-over-poor-communication-links"> <h4>Improved performance over poor communication links<a class="headerlink" href="#improved-performance-over-poor-communication-links" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Reduced API request overhead by several hundred bytes/request.</p></li> <li><p>TimeSync estimator more resilient to outlier latencies and temporary network outages.</p></li> </ul> </section> <section id="additional-robot-state-is-exposed"> <h4>Additional robot state is exposed<a class="headerlink" href="#additional-robot-state-is-exposed" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>PowerState: Overall charge percentage and estimated runtime.</p></li> <li><p>KinematicState: Body velocities are now available in KinematicState.</p></li> <li><p>RobotState: Foot contact state (in contact vs. not in contact).</p></li> </ul> </section> <section id="clients-can-specify-additional-advanced-locomotion-options"> <h4>Clients can specify additional advanced locomotion options<a class="headerlink" href="#clients-can-specify-additional-advanced-locomotion-options" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Can now disable various low-level locomotion defaults for special situations and terrain (stair tracking, pitch limiting, cliff avoidance).</p></li> <li><p>Body rotation can be specified as an offset to nominal or to horizontal.</p></li> </ul> </section> <section id="consistent-frame-usage-across-api"> <h4>Consistent Frame usage across API<a class="headerlink" href="#consistent-frame-usage-across-api" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>See more details in the Breaking Changes section.</p></li> </ul> </section> <section id="bosdyn-client-command-line-tool-improvements"> <h4>bosdyn.client command line tool improvements<a class="headerlink" href="#bosdyn-client-command-line-tool-improvements" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Downloading of depth images supported. Depth maps will be written to PGM files.</p></li> <li><p>Directory listing has improved formatting.</p></li> </ul> </section> </section> <section id="id204"> <h3>Breaking changes<a class="headerlink" href="#id204" title="Permalink to this heading"></a></h3> <p>Version 2.0 contains several breaking changes. While some clients and programs written for the version 1.* SDK may still work, expect some updates to be necessary for most programs.</p> <section id="frame-handling"> <h4>Frame handling<a class="headerlink" href="#frame-handling" title="Permalink to this heading"></a></h4> <p><a class='reference internal' href='/docs/concepts/geometry_and_frames'><span class="doc">Documentation of frames on Spot</span></a>:</p> <ul class="simple"> <li><p>Documentation of frames on Spot (<a class='reference internal' href='/docs/concepts/geometry_and_frames'><span class="doc">link</span></a>):</p></li> <li><p>The Frame message (<code class="docutils literal notranslate"><span class="pre">geometry.proto</span></code>) and FrameType have been deprecated, and the frame is now described as a string throughout the API.</p></li> <li><p>When receiving data from the robot (robot state, images, grid maps, world objects, etc.), the data will come with a string describing the frame it is represented in, but also a FrameTreeSnapshot message which describes how to transform the data into other frames.</p></li> <li><p>Use the helpers in <code class="docutils literal notranslate"><span class="pre">frame_helpers.py</span></code> (in particular <code class="docutils literal notranslate"><span class="pre">get_a_tform_b</span></code>) to compute appropriate transforms for your use case. See <code class="docutils literal notranslate"><span class="pre">frame_trajectory_command.py</span></code> for an example of using transforms to command the robot.</p></li> <li><p>Code written for version 1 will need to update to the following new convention:</p></li> </ul> <table border="1" class="docutils"> <thead> <tr> <th>Version 1 frame enum</th> <th>Version 2 frame string</th> <th>frame_helpers.py constant</th> </tr> </thead> <tbody> <tr> <td>FRAME_KO</td> <td>“odom”</td> <td>ODOM_FRAME_NAME</td> </tr> <tr> <td>FRAME_VO</td> <td>“vision”</td> <td>VISION_FRAME_NAME</td> </tr> <tr> <td>FRAME_BODY</td> <td>“body”</td> <td>BODY_FRAME_NAME</td> </tr> </tbody> </table></section> <section id="new-exceptions"> <h4>New Exceptions<a class="headerlink" href="#new-exceptions" title="Permalink to this heading"></a></h4> <p>New RpcError exceptions can be raised during RPC calls. If you were already catching RpcErrors, you will catch these. If you were catching individual subclasses, be aware of these new ones.</p> <ul class="simple"> <li><p>PermissionDeniedError</p></li> <li><p>ResponseTooLargeError</p></li> <li><p>NotFoundError</p></li> <li><p>TransientFailureError</p></li> </ul> <p>There are some new exceptions that can be thrown due to errors with the request before any RPC is made. They generally indicate programmer error, so depending on your use case it may be acceptable to not catch them to find bugs in your program. If it is important to catch all exceptions, be aware that these exist, and all inherit from bosdyn.client.Error</p> <ul class="simple"> <li><p>TimeSyncRequired</p></li> <li><p>NoSuchLease</p></li> <li><p>LeaseNotOwnedByWallet</p></li> </ul> <p>When creating clients or channels from a Robot object, a new class of exceptions inheriting from RobotError may be raised. NonexistentAuthorityError is no longer thrown, but other RpcErrors may be raised.</p> <ul class="simple"> <li><p>UnregisteredServiceError</p></li> <li><p>UnregisteredServiceNameError</p></li> <li><p>UnregisteredServiceTypeError</p></li> </ul> <p>Robot command client will throw a new error if a frame is specified that the robot does not recognize.</p> <ul class="simple"> <li><p>UnknownFrameError</p></li> </ul> </section> <section id="moved-or-renamed"> <h4>Moved or Renamed<a class="headerlink" href="#moved-or-renamed" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>Trajectories must now specify the frame name in the parent message instead of the trajectory itself.</p></li> <li><p>Trajectory commands can no longer be specified in a body frame since the output behavior can be ambiguous.</p></li> <li><p>Robot command messages were split into different proto files (basic_command, full_body_command), which will change import/include paths.</p></li> <li><p>‘vel’ field in SE3TrajectoryPoint renamed to <strong>velocity</strong> (<code class="docutils literal notranslate"><span class="pre">trajectory.proto</span></code>)</p></li> <li><p>Updates in <code class="docutils literal notranslate"><span class="pre">Payload.proto</span></code></p> <ul> <li><p>LabelPrefix field was changed from String to Repeated String</p></li> <li><p>body_T_payload renamed to body_tform_payload</p></li> <li><p>mount_T_payload renamed to mount_tform_payload</p></li> </ul> </li> </ul> </section> <section id="id205"> <h4>Removed<a class="headerlink" href="#id205" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>All Frame messages have been replaced by frame strings where applicable.</p></li> <li><p>AddLogAnnotationResponse does not have a status field anymore, errors are encoded in the message header information</p></li> <li><p>ko_tform_body, vo_tform_body, and ground_plane_rt_ko in Kinematic state have been replaced with the transforms_snapshot.</p></li> <li><p>The SampleCommon message for image captures has been replaced by acquisition time and a FrameTreeSnapshot.</p></li> </ul> </section> <section id="miscellaneous"> <h4>Miscellaneous<a class="headerlink" href="#miscellaneous" title="Permalink to this heading"></a></h4> <ul class="simple"> <li><p>bosdyn-client has added a dependency on numpy</p></li> <li><p>Autowalk missions and maps recorded with version 1.1 are not compatible with version 2.0</p></li> </ul> </section> </section> <section id="id206"> <h3>Known issues<a class="headerlink" href="#id206" title="Permalink to this heading"></a></h3> <p><strong>If you delete an object from the world object service</strong>, there is a chance that a ListWorldObjects call immediately afterward may still include that object.</p> <ul class="simple"> <li><p>Workaround: wait a short time before expecting the object to be gone.</p></li> </ul> <p><strong>If you register a new service with the robot</strong>, calling robot.ensure_client to create a client for that service may result in a UnregisteredServiceNameError.</p> <ul class="simple"> <li><p>Workaround: call robot.sync_with_directory() before robot.ensure_client()</p></li> </ul> <p><strong>SE2VelocityLimits require care</strong>. The proto comment states that “if set, limits the min/max velocity,” implying that one should not set values for any directions one does not want limited. However, if any of the numeric fields are not set in the message, they will be interpreted as 0. For example, if angular is not set but linear is, then the message will be incorrectly interpreted as having an angular limit of 0 and the robot will fail to rotate (obviously not the intent). Similarly, if the user only sets say the ‘x’ field of linear, then ‘y’ will be incorrectly limited to 0 as well.</p> <ul class="simple"> <li><p>Workaround: Correct usage of the SE2VelocityLimit message requires the user to fully fill out all the fields, setting unlimited values to a large number, say 1e6.</p></li> </ul> <p><strong>LogAnnotationClient does not include async versions</strong> of its RPCs.</p> <ul class="simple"> <li><p>Workaround: If you need to call these in an async manner, call them on a separate thread.</p></li> </ul> </section> <section id="id207"> <h3>Sample Code<a class="headerlink" href="#id207" title="Permalink to this heading"></a></h3> <p><a class='reference internal' href='/python/examples/directory/readme'><span class="doc">directory</span></a></p> <ul class="simple"> <li><p>Register, update, and unregister a service.</p></li> </ul> <p><a class='reference internal' href='/python/examples/payloads/readme'><span class="doc">payloads</span></a></p> <ul class="simple"> <li><p>Renamed from <code class="docutils literal notranslate"><span class="pre">get_payload</span></code>.</p></li> <li><p>Expanded to show payload version handling.</p></li> </ul> <p><a class='reference internal' href='/python/examples/self_registration/readme'><span class="doc">self_registration</span></a></p> <ul class="simple"> <li><p>Example showing how to set up a payload that registers itself with the robot, hosts a service, and registers its service with the robot.</p></li> </ul> <p><strong>add_image_coordinates_to_scene</strong> (Renamed to <strong>world_object_with_image_coordinates</strong> in 2.1.0)</p> <ul class="simple"> <li><p>Example using the API demonstrating adding image coordinates to the world object service.</p></li> </ul> <p><a class='reference internal' href='/python/examples/estop/readme'><span class="doc">estop (updated)</span></a></p> <ul class="simple"> <li><p>New EstopNoGui as a command-line addition to the GUI version of the E-Stop example.</p></li> </ul> <p><strong>get_depth_plus_visual_image</strong> (Removed in 2.1.0)</p> <ul class="simple"> <li><p>Example demonstrates how to use the new depth_in_visual_frame image sources to visualize depth in a fisheye image.</p></li> </ul> <p><a class='reference internal' href='/python/examples/get_mission_state/readme'><span class="doc">get_mission_state</span></a></p> <ul class="simple"> <li><p>Example program demonstrates how to retrieve information about the state of the currently-running mission.</p></li> </ul> <p><a class='reference internal' href='/python/examples/frame_trajectory_command/readme'><span class="doc">frame_trajectory_command</span></a></p> <ul class="simple"> <li><p>Example program shows how to retrieve Spot’s location in both the visual and odometry frames. Using these frames, the program shows how to build and execute a command to move Spot to that location plus 1.0 in the x-axis.</p></li> </ul> <p><a class='reference internal' href='/python/examples/get_robot_state_async/readme'><span class="doc">get_robot_state_async</span></a></p> <ul class="simple"> <li><p>Example demonstrates 3 different methods for working with Spot asynchronous functions.</p></li> </ul> <p><a class='reference internal' href='/python/examples/get_world_objects/readme'><span class="doc">get_world_objects</span></a></p> <ul class="simple"> <li><p>Example demonstrate how to use the world object service to list the objects Spot can detect, and filter these lists for specific objects or objects after a certain time stamp.</p></li> </ul> <p><a class='reference internal' href='/python/examples/graph_nav_command_line/readme'><span class="doc">graph_nav_command_line</span></a></p> <ul class="simple"> <li><p>Command line interface for graph nav with options to download/upload a map and to navigate a map.</p></li> </ul> <p><a class='reference internal' href='/python/examples/graph_nav_view_map/readme'><span class="doc">graph_nav_view_map</span></a></p> <ul class="simple"> <li><p>Example shows how to load and view a graph nav map.</p></li> </ul> <p><a class='reference internal' href='/python/examples/mission_recorder/readme'><span class="doc">mission_recorder</span></a></p> <ul class="simple"> <li><p>Example with an interface for operating Spot with your keyboard, recording a mission, and saving it.</p></li> </ul> <p><a class='reference internal' href='/python/examples/remote_mission_service/readme'><span class="doc">remote_mission_service</span></a></p> <ul class="simple"> <li><p>Run a gRPC server that implements the RemoteMissionService service definition.</p></li> <li><p>Connect a RemoteClient directly to that server.</p></li> <li><p>Build a mission that talks to that server.</p></li> </ul> <p><a class='reference internal' href='/python/examples/replay_mission/readme'><span class="doc">replay_mission</span></a></p> <ul class="simple"> <li><p>Example on how to replay a mission via the API.</p></li> </ul> <p><a class='reference internal' href='/python/examples/spot_cam/readme'><span class="doc">spot_cam</span></a></p> <ul class="simple"> <li><p>Examples to demonstrate how to interact with the Spot CAM.</p></li> </ul> <p><a class='reference internal' href='/python/examples/visualizer/readme'><span class="doc">visualizer</span></a></p> <ul class="simple"> <li><p>Example to visualize Spot’s perception scene in a consistent coordinate frame.</p></li> </ul> <p><a class='reference internal' href='/python/examples/world_object_mutations/readme'><span class="doc">world_object_mutations</span></a></p> <ul class="simple"> <li><p>Examples to demonstrate how to use the world object service to add, change, and delete world objects.</p></li> </ul> <p><a class='reference internal' href='/python/examples/xbox_controller/readme'><span class="doc">xbox_controller (updated)</span></a></p> <ul class="simple"> <li><p>Added support for Windows driver.</p></li> </ul> </section> </section> <section id="id208"> <h2>1.1.2<a class="headerlink" href="#id208" title="Permalink to this heading"></a></h2> <section id="id209"> <h3>New features<a class="headerlink" href="#id209" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p><strong>Missions API Beta and Callbacks</strong> When an Autowalk Mission is created with a “Callback” event, a client can detect that change using a beta version of the Mission API, then tell the robot to continue or abort the Mission. Example uses include a sensor payload that detects Callback events and captures sensor information before advancing the mission, and a desktop UI which waits for the user to push a button before advancing the mission.</p></li> <li><p><strong>External Forces Beta</strong>. Mobility commands can specify how to handle external forces. Examples of external forces could include an object that Spot is towing, or an object Spot is pushing. The default behavior is to do nothing, but clients can specify whether Spot should estimate external forces and compensate for it, or explicitly specify what the external forces are.</p></li> </ul> </section> <section id="id210"> <h3>Bug fixes and improvements<a class="headerlink" href="#id210" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p><strong>Depth image</strong> extrinsics are fixed. In earlier 1.1.x releases, the extrinsics were incorrectly the same as the fisheye cameras.</p></li> <li><p><strong>App Token expiration logging</strong>. The Python SDK object logs if the app token will expire in the next 30 days.</p></li> </ul> </section> <section id="id211"> <h3>Sample Code<a class="headerlink" href="#id211" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p><strong>mission_question_answerer</strong> demonstrates how to build a client which responds to Mission Callbacks.</p></li> </ul> </section> </section> <section id="id212"> <h2>1.1.1<a class="headerlink" href="#id212" title="Permalink to this heading"></a></h2> <p>1.1.1 has no SDK-related changes.</p> </section> <section id="id213"> <h2>1.1.0<a class="headerlink" href="#id213" title="Permalink to this heading"></a></h2> <p>The 1.1.0 SDK software is published under a new software license which can be found in the LICENSE file at the top of the SDK directory.</p> <section id="id214"> <h3>New features<a class="headerlink" href="#id214" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p><strong>ImageService</strong> exposes depth maps from on-board stereo cameras as additional image sources. Image Sources specify an ImageType to differentiate depth maps from grayscale images.</p></li> <li><p><strong>PayloadService</strong> is a new service which lists all known payloads on the robot.</p></li> <li><p><strong>SpotCheckService</strong> is a new service which runs actuator and camera calibration.</p></li> <li><p><strong>E-Stop soft timeouts.</strong> In prior software release, E-Stop endpoints which stopped checking in would result in the power to the robot’s motors being cut immediately. Now the E-Stop endpoint can be configured so Spot will attempt to sit followed by cutting power. The timeout parameter for an E-Stop endpoint specifies when the sitting behavior starts, and the cut_power_timeout parameter specifies when the power will cut off.</p></li> <li><p><strong>TerrainParams</strong> can be added to MobilityParams to provide hints about the terrain that Spot will walk on. The coefficient of friction of the ground can be specified. Whether the terrain is grated metal can also be specified.</p></li> <li><p><strong>Log Annotations</strong> a new type of log: Blob for large binary data.</p></li> </ul> </section> <section id="id215"> <h3>Sample code<a class="headerlink" href="#id215" title="Permalink to this heading"></a></h3> <p>The sample code directory structure has changed to directory-per-example under python/examples. Each example includes a requirements.txt file for specifying dependencies.</p> <ul class="simple"> <li><p><strong>estop</strong> is a desktop GUI which creates an E-Stop endpoint for a robot. This example demonstrates how to use the E-Stop endpoint system, and is a useful utility on its own.</p></li> <li><p><strong>follow_fiducial</strong> is an example where Spot will follow an AprilTag fiducial that it can see in its on-board cameras. This demonstrates how to use camera extrinsics and intrinsics to convert pixels to world coordinates, and how to use the trajectory commands.</p></li> <li><p><strong>get-image</strong> is a simple example to retrieve images from Spot and save them to disk. It shows how to use the basics of the image service.</p></li> <li><p><strong>get-payload</strong> is a simple example which lists all of the payloads on the robot. It shows how to use the payload service.</p></li> <li><p><strong>get_robot_state</strong> is a simple example to retrieve robot state.</p></li> <li><p><strong>hello_spot</strong> is carried over from prior SDK releases. It is an introductory tutorial showing basic use of the Spot SDK.</p></li> <li><p><strong>logging</strong> demonstrates how to add custom annotations to Spot’s log files.</p></li> <li><p><strong>spot_check</strong> demonstrates how to use SpotCheck - Spot’s in-the-field calibration behavior.</p></li> <li><p><strong>spot_light</strong> is a demo where Spot rotates its body while standing to try to face a flashlight seen in its front cameras.</p></li> <li><p><strong>spot_tensorflow_detector</strong> demonstrates how to integrate the Spot SDK with Tensorflow for object classification from images.</p></li> <li><p><strong>time_sync</strong> is a simple example demonstrating how to use the TimeSync service.</p></li> <li><p><strong>wasd</strong> is carried over from prior SDK releases. It is an interactive program which uses keyboard control for the robot, and demonstrates how to use a variety of commands.</p></li> <li><p><strong>xbox_controller</strong> demonstrates how to specify more advanced options for mobility commands.</p></li> </ul> </section> <section id="id216"> <h3>Bug fixes and Improvements<a class="headerlink" href="#id216" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>Too many invalid login attempts will lock a user out from being able to authenticate for a temporary period to prevent brute-force attacks. GetAuthTokenResponse indicates this state with a STATUS_TEMPORARILY_LOCKED_OUT.</p></li> <li><p>Elliptic Curve (ECDSA) cryptography used for user tokens - reducing the size of RPC requests by several hundred bytes.</p></li> <li><p>gRPC exceptions are correctly handled in Python 3.</p></li> <li><p>Command-line tool handles unicode robot nicknames correctly.</p></li> <li><p>Command-line tool supports retrieving robot model information (URDF and object files)</p></li> <li><p>Command-line tool supports retrieving multiple images at once.</p></li> <li><p>“Strict Version” support for software version.</p></li> <li><p>App Token paths which include “~” will automatically expand, rather than fail.</p></li> <li><p>Mobility Commands which have MobilityParams.vel_limit with only a min or max velocity are correctly handled. In prior releases, these commands would result in no movement at all.</p></li> <li><p>Mobility Commands which have BodyControlParams.base_offset_rt_footprint.reference_time in the past result in a STATUS_EXPIRED response rather than a STATUS_INVALID_REQUEST.</p></li> <li><p>SE2VelocityCommands with unset slew_rate_limit are correctly handled. In prior releases, an unset slew_rate_limit would result in the robot walking in place.</p></li> </ul> </section> <section id="deprecations-and-breaking-changes"> <h3>Deprecations and breaking changes<a class="headerlink" href="#deprecations-and-breaking-changes" title="Permalink to this heading"></a></h3> <ul class="simple"> <li><p>Removed support for Python 2.7. Only Python 3.6+ is supported due to upcoming Python 2 End-of-Life. Windows 10, MacOS, and Ubuntu LTS are still supported.</p></li> <li><p>The HINT_PACE LocomotionHint is no longer supported due to physical stability issues. Any commands which specify a HINT_PACE LocomotionHint will be treated like a HINT_JOG LocomotionHint is specified.</p></li> <li><p>HINT_AUTO_TROT and HINT_AUTO_AMBLE are deprecated as names - use HINT_SPEED_SELECT_TROT and HINT_SPEED_SELECT_AMBLE respectively going forward.</p></li> <li><p>Protocol Buffer locations changed to split services from messages. Any direct imports of protocol buffers by client applications will need to change to support the 1.1.0 version changes.</p></li> </ul> </section> </section> <section id="id217"> <h2>1.0.1<a class="headerlink" href="#id217" title="Permalink to this heading"></a></h2> <ul class="simple"> <li><p>Improved documentation on SDK installation.</p></li> <li><p>Clearer Python dependency requirements.</p></li> <li><p>RobotId service exposes computer serial number in addition to robot serial number.</p></li> <li><p>wasd image capture works in Python 3.</p></li> <li><p>Fixed timing bugs in power service.</p></li> </ul> </section> <section id="id218"> <h2>1.0.0<a class="headerlink" href="#id218" title="Permalink to this heading"></a></h2> <p>Initial release of the SDK.</p> </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