From 8f781a87b8816168ec59415db853934f41568620 Mon Sep 17 00:00:00 2001 From: Boston Dynamics SDK Publisher <53276189+bd-sdk-publisher@users.noreply.github.com> Date: Sun, 2 Jun 2024 23:13:52 -0400 Subject: [PATCH] Release v4.0.2 of Boston Dynamics Spot SDK --- README.md | 2 +- VERSION | 2 +- docs/concepts/README.md | 1 + docs/concepts/joint_control/README.md | 84 ++ .../joint_control/knee_torque_limits.md | 113 ++ docs/concepts/joint_control/spot_with_arm.png | Bin 0 -> 80739 bytes .../joint_control/supplemental_data.md | 61 + docs/html/.buildinfo | 2 +- docs/html/README.html | 15 +- docs/html/_images/icon.png | Bin 5214 -> 25426 bytes docs/html/_images/spot_with_arm.png | Bin 0 -> 80739 bytes .../bosdyn/bddf/base_data_reader.html | 13 +- .../_modules/bosdyn/bddf/block_writer.html | 13 +- docs/html/_modules/bosdyn/bddf/bosdyn.html | 13 +- docs/html/_modules/bosdyn/bddf/common.html | 13 +- .../_modules/bosdyn/bddf/data_reader.html | 13 +- .../_modules/bosdyn/bddf/data_writer.html | 13 +- .../_modules/bosdyn/bddf/file_indexer.html | 13 +- .../bosdyn/bddf/grpc_proto_reader.html | 13 +- .../_modules/bosdyn/bddf/grpc_reader.html | 13 +- .../bosdyn/bddf/grpc_service_reader.html | 13 +- .../bosdyn/bddf/grpc_service_writer.html | 13 +- .../_modules/bosdyn/bddf/message_reader.html | 13 +- .../bosdyn/bddf/pod_series_reader.html | 13 +- .../bosdyn/bddf/pod_series_writer.html | 13 +- .../bosdyn/bddf/protobuf_channel_reader.html | 13 +- .../_modules/bosdyn/bddf/protobuf_reader.html | 13 +- .../bosdyn/bddf/protobuf_series_writer.html | 13 +- .../bosdyn/bddf/stream_data_reader.html | 13 +- .../animation_file_conversion_helpers.html | 13 +- .../client/animation_file_to_proto.html | 13 +- .../choreography/client/choreography.html | 58 +- .../_modules/bosdyn/client/area_callback.html | 13 +- .../area_callback_region_handler_base.html | 13 +- .../client/area_callback_service_runner.html | 13 +- .../area_callback_service_servicer.html | 13 +- .../client/area_callback_service_utils.html | 13 +- .../bosdyn/client/arm_surface_contact.html | 13 +- .../_modules/bosdyn/client/async_tasks.html | 13 +- docs/html/_modules/bosdyn/client/auth.html | 13 +- .../_modules/bosdyn/client/auto_return.html | 13 +- .../html/_modules/bosdyn/client/autowalk.html | 13 +- .../_modules/bosdyn/client/bddf_download.html | 13 +- docs/html/_modules/bosdyn/client/channel.html | 13 +- .../_modules/bosdyn/client/command_line.html | 13 +- docs/html/_modules/bosdyn/client/common.html | 13 +- .../bosdyn/client/data_acquisition.html | 13 +- .../client/data_acquisition_helpers.html | 13 +- .../client/data_acquisition_plugin.html | 13 +- .../data_acquisition_plugin_service.html | 13 +- .../bosdyn/client/data_acquisition_store.html | 13 +- .../_modules/bosdyn/client/data_buffer.html | 13 +- .../_modules/bosdyn/client/data_chunk.html | 13 +- .../_modules/bosdyn/client/data_service.html | 13 +- .../_modules/bosdyn/client/directory.html | 13 +- .../bosdyn/client/directory_registration.html | 13 +- docs/html/_modules/bosdyn/client/docking.html | 13 +- docs/html/_modules/bosdyn/client/door.html | 13 +- docs/html/_modules/bosdyn/client/estop.html | 13 +- .../_modules/bosdyn/client/exceptions.html | 13 +- docs/html/_modules/bosdyn/client/fault.html | 13 +- .../_modules/bosdyn/client/frame_helpers.html | 13 +- .../bosdyn/client/gps/NMEAParser.html | 18 +- .../bosdyn/client/gps/aggregator_client.html | 13 +- .../bosdyn/client/gps/gps_listener.html | 30 +- .../client/gps/registration_client.html | 13 +- .../_modules/bosdyn/client/graph_nav.html | 13 +- .../bosdyn/client/gripper_camera_param.html | 13 +- docs/html/_modules/bosdyn/client/image.html | 13 +- .../bosdyn/client/image_service_helpers.html | 13 +- .../bosdyn/client/inverse_kinematics.html | 13 +- .../bosdyn/client/ir_enable_disable.html | 13 +- .../_modules/bosdyn/client/keepalive.html | 13 +- docs/html/_modules/bosdyn/client/lease.html | 13 +- .../client/lease_resource_hierarchy.html | 13 +- .../bosdyn/client/lease_validator.html | 13 +- docs/html/_modules/bosdyn/client/license.html | 13 +- .../_modules/bosdyn/client/local_grid.html | 13 +- .../_modules/bosdyn/client/log_status.html | 13 +- .../client/manipulation_api_client.html | 13 +- .../bosdyn/client/map_processing.html | 13 +- .../_modules/bosdyn/client/math_helpers.html | 13 +- .../bosdyn/client/metrics_logging.html | 13 +- .../client/network_compute_bridge_client.html | 13 +- docs/html/_modules/bosdyn/client/payload.html | 13 +- .../bosdyn/client/payload_registration.html | 13 +- .../_modules/bosdyn/client/point_cloud.html | 13 +- docs/html/_modules/bosdyn/client/power.html | 13 +- .../_modules/bosdyn/client/processors.html | 13 +- .../html/_modules/bosdyn/client/ray_cast.html | 13 +- .../_modules/bosdyn/client/recording.html | 13 +- docs/html/_modules/bosdyn/client/robot.html | 13 +- .../_modules/bosdyn/client/robot_command.html | 28 +- .../html/_modules/bosdyn/client/robot_id.html | 13 +- .../_modules/bosdyn/client/robot_state.html | 33 +- docs/html/_modules/bosdyn/client/sdk.html | 13 +- .../_modules/bosdyn/client/server_util.html | 13 +- .../client/service_customization_helpers.html | 13 +- .../bosdyn/client/signals_helpers.html | 13 +- .../bosdyn/client/spot_cam/audio.html | 13 +- .../bosdyn/client/spot_cam/compositor.html | 13 +- .../bosdyn/client/spot_cam/health.html | 13 +- .../bosdyn/client/spot_cam/lighting.html | 13 +- .../bosdyn/client/spot_cam/lights_helper.html | 13 +- .../bosdyn/client/spot_cam/media_log.html | 13 +- .../bosdyn/client/spot_cam/network.html | 13 +- .../bosdyn/client/spot_cam/power.html | 13 +- .../_modules/bosdyn/client/spot_cam/ptz.html | 13 +- .../bosdyn/client/spot_cam/streamquality.html | 13 +- .../bosdyn/client/spot_cam/version.html | 13 +- .../_modules/bosdyn/client/spot_check.html | 13 +- .../_modules/bosdyn/client/time_sync.html | 13 +- .../_modules/bosdyn/client/token_cache.html | 13 +- .../_modules/bosdyn/client/token_manager.html | 13 +- .../_modules/bosdyn/client/units_helpers.html | 13 +- docs/html/_modules/bosdyn/client/util.html | 13 +- .../_modules/bosdyn/client/world_object.html | 13 +- docs/html/_modules/bosdyn/deprecated.html | 13 +- docs/html/_modules/bosdyn/geometry.html | 13 +- docs/html/_modules/bosdyn/mission/client.html | 13 +- .../_modules/bosdyn/mission/constants.html | 13 +- .../_modules/bosdyn/mission/exceptions.html | 13 +- .../bosdyn/mission/remote_client.html | 13 +- .../_modules/bosdyn/mission/server_util.html | 13 +- docs/html/_modules/bosdyn/mission/util.html | 13 +- docs/html/_modules/bosdyn/orbit/client.html | 16 +- .../_modules/bosdyn/orbit/exceptions.html | 13 +- docs/html/_modules/bosdyn/orbit/utils.html | 13 +- docs/html/_modules/bosdyn/scout/client.html | 16 +- docs/html/_modules/bosdyn/scout/utils.html | 13 +- docs/html/_modules/bosdyn/util.html | 13 +- docs/html/_modules/index.html | 13 +- docs/html/_static/documentation_options.js | 2 +- docs/html/docs/concepts/README.html | 14 +- docs/html/docs/concepts/about_orbit.html | 13 +- docs/html/docs/concepts/about_spot.html | 13 +- docs/html/docs/concepts/arm/README.html | 15 +- docs/html/docs/concepts/arm/arm_concepts.html | 13 +- docs/html/docs/concepts/arm/arm_services.html | 13 +- .../docs/concepts/arm/arm_specification.html | 13 +- docs/html/docs/concepts/autonomy/README.html | 13 +- .../docs/concepts/autonomy/auto_return.html | 13 +- .../autonomous_navigation_code_examples.html | 13 +- .../autonomous_navigation_services.html | 13 +- .../concepts/autonomy/autowalk_service.html | 13 +- .../components_of_autonomous_navigation.html | 13 +- .../autonomy/directed_exploration.html | 13 +- docs/html/docs/concepts/autonomy/docking.html | 13 +- docs/html/docs/concepts/autonomy/gps.html | 13 +- .../graphnav_and_robot_locomotion.html | 13 +- .../autonomy/graphnav_area_callbacks.html | 13 +- .../autonomy/graphnav_map_structure.html | 13 +- .../concepts/autonomy/graphnav_service.html | 13 +- .../autonomy/graphnav_tech_summary.html | 13 +- .../concepts/autonomy/initialization.html | 13 +- .../docs/concepts/autonomy/localization.html | 13 +- .../concepts/autonomy/missions_service.html | 13 +- ...ypical_autonomous_navigation_use_case.html | 13 +- docs/html/docs/concepts/base_services.html | 13 +- docs/html/docs/concepts/bddf.html | 13 +- .../docs/concepts/choreography/README.html | 13 +- .../animation_file_specification.html | 13 +- .../animations_in_choreographer.html | 13 +- .../concepts/choreography/choreographer.html | 13 +- .../choreography/choreographer_setup.html | 13 +- .../choreography_in_autowalk.html | 15 +- .../choreography/choreography_in_tablet.html | 13 +- .../choreography/choreography_service.html | 13 +- .../concepts/choreography/custom_gait.html | 13 +- .../concepts/choreography/move_reference.html | 13 +- .../robot_controls_in_choreographer.html | 13 +- docs/html/docs/concepts/data.html | 13 +- .../concepts/data_acquisition_output.html | 13 +- .../concepts/data_acquisition_overview.html | 13 +- .../data_acquisition_thermal_raw.html | 13 +- .../docs/concepts/data_buffer_overview.html | 13 +- .../concepts/developing_api_services.html | 13 +- docs/html/docs/concepts/estop_service.html | 13 +- docs/html/docs/concepts/faults.html | 13 +- .../docs/concepts/geometry_and_frames.html | 13 +- .../docs/concepts/joint_control/README.html | 634 ++++++++++ .../joint_control/knee_torque_limits.html | 1070 +++++++++++++++++ .../joint_control/supplemental_data.html | 654 ++++++++++ .../html/docs/concepts/keepalive_service.html | 13 +- docs/html/docs/concepts/lease_service.html | 13 +- .../docs/concepts/network_compute_bridge.html | 13 +- docs/html/docs/concepts/networking.html | 13 +- docs/html/docs/concepts/robot_services.html | 13 +- .../docs/concepts/service_customization.html | 13 +- ...writing_services_for_data_acquisition.html | 13 +- docs/html/docs/payload/README.html | 13 +- .../payload/configuring_payload_software.html | 13 +- .../docs/payload/coreio_documentation.html | 13 +- .../payload/coreio_openvpn_extension.html | 13 +- docs/html/docs/payload/docker_containers.html | 13 +- .../guidelines_for_robust_payload_design.html | 13 +- .../docs/payload/mechanical_interfaces.html | 13 +- .../payload_configuration_requirements.html | 13 +- .../payload/robot_electrical_interface.html | 13 +- .../docs/payload/robot_mounting_rails.html | 13 +- docs/html/docs/payload/spot_core_cockpit.html | 13 +- .../docs/payload/spot_core_documentation.html | 13 +- .../docs/payload/spot_core_portainer.html | 13 +- docs/html/docs/payload/spot_core_vnc.html | 13 +- docs/html/docs/protos/README.html | 13 +- docs/html/docs/protos/style_guide.html | 13 +- docs/html/docs/python/README.html | 13 +- docs/html/docs/python/daq_tutorial/daq1.html | 13 +- docs/html/docs/python/daq_tutorial/daq2.html | 13 +- docs/html/docs/python/daq_tutorial/daq3.html | 13 +- docs/html/docs/python/daq_tutorial/daq4.html | 13 +- docs/html/docs/python/daq_tutorial/daq5.html | 13 +- docs/html/docs/python/daq_tutorial/daq6.html | 13 +- .../docs/python/fetch_tutorial/fetch1.html | 13 +- .../docs/python/fetch_tutorial/fetch2.html | 13 +- .../docs/python/fetch_tutorial/fetch3.html | 13 +- .../docs/python/fetch_tutorial/fetch4.html | 13 +- .../docs/python/fetch_tutorial/fetch5.html | 13 +- .../docs/python/fetch_tutorial/fetch6.html | 13 +- docs/html/docs/python/quickstart.html | 33 +- .../understanding_spot_programming.html | 13 +- docs/html/docs/release_notes.html | 843 +++++++------ docs/html/files/spot_with_arm_urdf.zip | Bin 0 -> 993887 bytes docs/html/genindex.html | 45 +- docs/html/objects.inv | Bin 25906 -> 26078 bytes docs/html/protos/bosdyn/api/README.html | 13 +- .../protos/bosdyn/api/proto_reference.html | 449 ++++++- docs/html/py-modindex.html | 13 +- docs/html/python/README.html | 13 +- .../bosdyn/choreography/client/README.html | 13 +- .../animation_file_conversion_helpers.html | 13 +- .../client/animation_file_to_proto.html | 13 +- .../choreography/client/choreography.html | 51 +- .../src/bosdyn/client/README.html | 13 +- .../src/bosdyn/client/area_callback.html | 13 +- .../area_callback_region_handler_base.html | 17 +- .../client/area_callback_service_runner.html | 13 +- .../area_callback_service_servicer.html | 13 +- .../client/area_callback_service_utils.html | 13 +- .../bosdyn/client/arm_surface_contact.html | 13 +- .../src/bosdyn/client/async_tasks.html | 13 +- .../bosdyn-client/src/bosdyn/client/auth.html | 13 +- .../src/bosdyn/client/auto_return.html | 13 +- .../src/bosdyn/client/autowalk.html | 13 +- .../bosdyn-client/src/bosdyn/client/bddf.html | 13 +- .../src/bosdyn/client/bddf_download.html | 13 +- .../src/bosdyn/client/channel.html | 13 +- .../src/bosdyn/client/command_line.html | 13 +- .../src/bosdyn/client/common.html | 13 +- .../src/bosdyn/client/data_acquisition.html | 13 +- .../client/data_acquisition_helpers.html | 13 +- .../client/data_acquisition_plugin.html | 13 +- .../data_acquisition_plugin_service.html | 13 +- .../bosdyn/client/data_acquisition_store.html | 13 +- .../src/bosdyn/client/data_buffer.html | 13 +- .../src/bosdyn/client/data_chunk.html | 13 +- .../src/bosdyn/client/data_service.html | 13 +- .../src/bosdyn/client/directory.html | 13 +- .../bosdyn/client/directory_registration.html | 13 +- .../src/bosdyn/client/docking.html | 13 +- .../bosdyn-client/src/bosdyn/client/door.html | 13 +- .../src/bosdyn/client/estop.html | 15 +- .../src/bosdyn/client/exceptions.html | 13 +- .../src/bosdyn/client/fault.html | 13 +- .../src/bosdyn/client/frame_helpers.html | 13 +- .../src/bosdyn/client/gps/NMEAParser.html | 13 +- .../src/bosdyn/client/gps/README.html | 13 +- .../bosdyn/client/gps/aggregator_client.html | 13 +- .../src/bosdyn/client/gps/gps_listener.html | 17 +- .../client/gps/registration_client.html | 13 +- .../src/bosdyn/client/graph_nav.html | 13 +- .../bosdyn/client/gripper_camera_param.html | 13 +- .../src/bosdyn/client/image.html | 13 +- .../bosdyn/client/image_service_helpers.html | 13 +- .../src/bosdyn/client/inverse_kinematics.html | 13 +- .../src/bosdyn/client/ir_enable_disable.html | 13 +- .../src/bosdyn/client/keepalive.html | 13 +- .../src/bosdyn/client/lease.html | 13 +- .../client/lease_resource_hierarchy.html | 13 +- .../src/bosdyn/client/lease_validator.html | 13 +- .../src/bosdyn/client/license.html | 13 +- .../src/bosdyn/client/local_grid.html | 13 +- .../src/bosdyn/client/log_status.html | 13 +- .../client/manipulation_api_client.html | 13 +- .../src/bosdyn/client/map_processing.html | 13 +- .../src/bosdyn/client/math_helpers.html | 13 +- .../src/bosdyn/client/metrics_logging.html | 13 +- .../client/network_compute_bridge_client.html | 13 +- .../src/bosdyn/client/payload.html | 13 +- .../bosdyn/client/payload_registration.html | 13 +- .../src/bosdyn/client/point_cloud.html | 13 +- .../src/bosdyn/client/power.html | 13 +- .../src/bosdyn/client/processors.html | 13 +- .../src/bosdyn/client/ray_cast.html | 13 +- .../src/bosdyn/client/recording.html | 13 +- .../src/bosdyn/client/robot.html | 13 +- .../src/bosdyn/client/robot_command.html | 36 +- .../src/bosdyn/client/robot_id.html | 13 +- .../src/bosdyn/client/robot_state.html | 37 +- .../bosdyn-client/src/bosdyn/client/sdk.html | 13 +- .../src/bosdyn/client/server_util.html | 13 +- .../client/service_customization_helpers.html | 13 +- .../src/bosdyn/client/signals_helpers.html | 15 +- .../src/bosdyn/client/spot_cam/README.html | 13 +- .../src/bosdyn/client/spot_cam/audio.html | 13 +- .../bosdyn/client/spot_cam/compositor.html | 13 +- .../src/bosdyn/client/spot_cam/health.html | 13 +- .../src/bosdyn/client/spot_cam/lighting.html | 13 +- .../bosdyn/client/spot_cam/lights_helper.html | 13 +- .../src/bosdyn/client/spot_cam/media_log.html | 13 +- .../src/bosdyn/client/spot_cam/network.html | 13 +- .../src/bosdyn/client/spot_cam/power.html | 13 +- .../src/bosdyn/client/spot_cam/ptz.html | 13 +- .../bosdyn/client/spot_cam/streamquality.html | 13 +- .../src/bosdyn/client/spot_cam/version.html | 13 +- .../src/bosdyn/client/spot_check.html | 13 +- .../src/bosdyn/client/time_sync.html | 13 +- .../src/bosdyn/client/token_cache.html | 13 +- .../src/bosdyn/client/token_manager.html | 13 +- .../src/bosdyn/client/units_helpers.html | 13 +- .../bosdyn-client/src/bosdyn/client/util.html | 13 +- .../src/bosdyn/client/world_object.html | 13 +- .../python/bosdyn-core/src/bosdyn/README.html | 13 +- .../bosdyn-core/src/bosdyn/bddf/README.html | 13 +- .../src/bosdyn/bddf/base_data_reader.html | 13 +- .../src/bosdyn/bddf/block_writer.html | 13 +- .../bosdyn-core/src/bosdyn/bddf/bosdyn.html | 13 +- .../bosdyn-core/src/bosdyn/bddf/common.html | 13 +- .../src/bosdyn/bddf/data_reader.html | 13 +- .../src/bosdyn/bddf/data_writer.html | 13 +- .../src/bosdyn/bddf/file_indexer.html | 13 +- .../src/bosdyn/bddf/grpc_proto_reader.html | 13 +- .../src/bosdyn/bddf/grpc_reader.html | 13 +- .../src/bosdyn/bddf/grpc_service_reader.html | 13 +- .../src/bosdyn/bddf/grpc_service_writer.html | 13 +- .../src/bosdyn/bddf/message_reader.html | 13 +- .../src/bosdyn/bddf/pod_series_reader.html | 13 +- .../src/bosdyn/bddf/pod_series_writer.html | 13 +- .../bosdyn/bddf/protobuf_channel_reader.html | 13 +- .../src/bosdyn/bddf/protobuf_reader.html | 13 +- .../bosdyn/bddf/protobuf_series_writer.html | 13 +- .../src/bosdyn/bddf/stream_data_reader.html | 13 +- .../bosdyn-core/src/bosdyn/deprecated.html | 13 +- .../bosdyn-core/src/bosdyn/geometry.html | 13 +- .../python/bosdyn-core/src/bosdyn/util.html | 13 +- .../src/bosdyn/mission/README.html | 13 +- .../src/bosdyn/mission/client.html | 13 +- .../src/bosdyn/mission/constants.html | 13 +- .../src/bosdyn/mission/exceptions.html | 13 +- .../src/bosdyn/mission/remote_client.html | 13 +- .../src/bosdyn/mission/server_util.html | 13 +- .../src/bosdyn/mission/util.html | 13 +- .../bosdyn-orbit/src/bosdyn/orbit/README.html | 13 +- .../bosdyn-orbit/src/bosdyn/orbit/client.html | 13 +- .../src/bosdyn/orbit/exceptions.html | 13 +- .../bosdyn-orbit/src/bosdyn/orbit/utils.html | 13 +- .../bosdyn-scout/src/bosdyn/scout/README.html | 13 +- .../bosdyn-scout/src/bosdyn/scout/client.html | 13 +- .../src/bosdyn/scout/exceptions.html | 13 +- .../bosdyn-scout/src/bosdyn/scout/utils.html | 13 +- docs/html/python/examples/README.html | 14 +- .../examples/animation_recorder/README.html | 13 +- .../python/examples/area_callback/README.html | 13 +- .../arm_and_mobility_command/README.html | 13 +- .../arm_constrained_manipulation/README.html | 13 +- .../html/python/examples/arm_door/README.html | 13 +- .../examples/arm_force_control/README.html | 13 +- .../python/examples/arm_freeze/README.html | 13 +- .../html/python/examples/arm_gaze/README.html | 13 +- .../python/examples/arm_gcode/README.html | 13 +- .../python/examples/arm_grasp/README.html | 13 +- .../arm_grasp_carry_overrides/README.html | 13 +- .../arm_impedance_control/README.html | 13 +- .../examples/arm_joint_move/README.html | 13 +- .../python/examples/arm_simple/README.html | 13 +- .../examples/arm_stow_unstow/README.html | 13 +- .../examples/arm_surface_contact/README.html | 13 +- .../examples/arm_trajectory/README.html | 13 +- .../examples/arm_walk_to_object/README.html | 13 +- .../html/python/examples/arm_wasd/README.html | 13 +- .../examples/arm_with_body_follow/README.html | 13 +- .../python/examples/auto_return/README.html | 13 +- .../python/examples/bddf_download/README.html | 13 +- .../python/examples/cloud_upload/README.html | 13 +- .../python/examples/comms_mapping/README.html | 13 +- .../python/examples/comms_test/README.html | 13 +- .../python/examples/core_io_gpio/README.html | 13 +- .../data_acquisition_service/README.html | 13 +- .../signals_coreio_modem_plugin/README.html | 13 +- .../python/examples/data_buffer/README.html | 13 +- .../python/examples/data_service/README.html | 13 +- .../python/examples/directory/README.html | 13 +- .../examples/disable_ir_emission/README.html | 13 +- docs/html/python/examples/docking/README.html | 13 +- .../python/examples/docs/arm_examples.html | 14 +- .../docs/autonomy_and_missions_examples.html | 13 +- .../examples/docs/basic_service_examples.html | 13 +- .../docs/data_acquisition_examples.html | 13 +- .../examples/docs/joint_control_examples.html | 562 +++++++++ .../examples/docs/logging_examples.html | 13 +- docs/html/python/examples/docs/orbit.html | 15 +- .../examples/docs/payloads_examples.html | 15 +- .../perception_world_objects_examples.html | 13 +- .../docs/robot_behavior_examples.html | 13 +- .../python/examples/edit_autowalk/README.html | 13 +- docs/html/python/examples/estop/README.html | 13 +- .../python/examples/extensions/README.html | 13 +- .../extract_images_from_walk/README.html | 13 +- .../python/examples/fan_command/README.html | 13 +- .../examples/fiducial_follow/README.html | 13 +- .../frame_trajectory_command/README.html | 13 +- .../get_depth_plus_visual_image/README.html | 13 +- .../python/examples/get_image/README.html | 13 +- .../examples/get_mission_state/README.html | 13 +- .../examples/get_robot_state/README.html | 13 +- .../get_robot_state_async/README.html | 13 +- .../examples/get_world_objects/README.html | 13 +- .../python/examples/gps_service/README.html | 13 +- .../README.html | 13 +- .../graph_nav_command_line/README.html | 13 +- .../graph_nav_extract_point_cloud/README.html | 13 +- .../examples/graph_nav_view_gps/README.html | 13 +- .../examples/graph_nav_view_map/README.html | 13 +- .../gripper_camera_params/README.html | 13 +- .../python/examples/hello_spot/README.html | 13 +- .../examples/inverse_kinematics/README.html | 15 +- .../python/examples/joint_control/README.html | 609 ++++++++++ .../python/examples/log_status/README.html | 13 +- docs/html/python/examples/logging/README.html | 13 +- .../examples/metrics_over_coreio/README.html | 13 +- .../mission_question_answerer/README.html | 13 +- .../examples/mission_recorder/README.html | 13 +- .../network_compute_bridge/README.html | 13 +- .../fire_extinguisher_server/README.html | 13 +- .../network_request_callback/README.html | 15 +- .../orbit/export_run_archives/README.html | 13 +- .../examples/orbit/hello_orbit/README.html | 13 +- .../examples/orbit/runs_response/README.html | 13 +- .../orbit/schedule_mission/README.html | 13 +- .../orbit/send_robot_back_to_dock/README.html | 13 +- .../README.html | 13 +- .../python/examples/orbit/webhook/README.html | 13 +- .../html/python/examples/payloads/README.html | 13 +- .../post_docking_callbacks/README.html | 13 +- .../html/python/examples/ray_cast/README.html | 13 +- .../examples/record_autowalk/README.html | 13 +- .../remote_mission_service/README.html | 13 +- .../examples/replay_mission/README.html | 13 +- .../examples/reset_safety_stop/README.html | 13 +- .../python/examples/ricoh_theta/README.html | 13 +- .../examples/self_registration/README.html | 13 +- .../custom_parameter_image_server/README.html | 13 +- .../custom_parameter_ncb_worker/README.html | 13 +- .../README.html | 13 +- .../examples/service_faults/README.html | 13 +- .../html/python/examples/spot_cam/README.html | 13 +- .../spot_detect_and_follow/README.html | 13 +- .../python/examples/spot_light/README.html | 13 +- .../spot_tensorflow_detector/README.html | 13 +- docs/html/python/examples/stance/README.html | 13 +- .../examples/stitch_front_images/README.html | 13 +- .../examples/tester_programs/README.html | 13 +- .../python/examples/time_sync/README.html | 13 +- .../upload_choreographed_sequence/README.html | 13 +- .../examples/user_nogo_regions/README.html | 13 +- .../examples/velodyne_client/README.html | 13 +- .../python/examples/visualizer/README.html | 13 +- docs/html/python/examples/wasd/README.html | 13 +- .../world_object_mutations/README.html | 13 +- .../README.html | 13 +- .../examples/xbox_controller/README.html | 13 +- docs/html/search.html | 13 +- docs/html/searchindex.js | 2 +- docs/python/quickstart.md | 20 +- docs/release_notes.md | 51 + files/spot_with_arm_urdf.zip | Bin 0 -> 993887 bytes ....whl => bosdyn_api-4.0.2-py3-none-any.whl} | Bin 381262 -> 383244 bytes ...choreography_client-4.0.1-py3-none-any.whl | Bin 22199 -> 0 bytes ...choreography_client-4.0.2-py3-none-any.whl | Bin 0 -> 22443 bytes ...choreography_protos-4.0.1-py3-none-any.whl | Bin 1736 -> 0 bytes ...choreography_protos-4.0.2-py3-none-any.whl | Bin 0 -> 1737 bytes ...l => bosdyn_client-4.0.2-py3-none-any.whl} | Bin 279089 -> 279550 bytes ...whl => bosdyn_core-4.0.2-py3-none-any.whl} | Bin 32208 -> 32208 bytes ... => bosdyn_mission-4.0.2-py3-none-any.whl} | Bin 16379 -> 16379 bytes prebuilt/bosdyn_orbit-4.0.1-py3-none-any.whl | Bin 11228 -> 0 bytes prebuilt/bosdyn_orbit-4.0.2-py3-none-any.whl | Bin 0 -> 11218 bytes prebuilt/bosdyn_scout-4.0.1-py3-none-any.whl | Bin 10802 -> 0 bytes prebuilt/bosdyn_scout-4.0.2-py3-none-any.whl | Bin 0 -> 10791 bytes protos/bosdyn/api/basic_command.proto | 36 +- protos/bosdyn/api/proto_reference.md | 197 ++- protos/bosdyn/api/robot_command.proto | 3 + protos/bosdyn/api/robot_state.proto | 24 + .../api/spot/choreography_sequence.proto | 32 + .../api/spot/choreography_service.proto | 5 +- protos/bosdyn/api/spot/spot_constants.proto | 47 + .../choreography/client/choreography.py | 45 +- .../src/bosdyn/client/gps/NMEAParser.py | 5 + .../src/bosdyn/client/gps/gps_listener.py | 17 +- .../src/bosdyn/client/robot_command.py | 15 + .../src/bosdyn/client/robot_state.py | 20 + .../bosdyn-orbit/src/bosdyn/orbit/client.py | 3 +- .../bosdyn-scout/src/bosdyn/scout/client.py | 3 +- python/examples/README.md | 1 + python/examples/docs/arm_examples.md | 1 + .../examples/docs/joint_control_examples.md | 16 + .../gps_service/docker-requirements.txt | 1 + python/examples/gps_service/gps_listener.py | 26 +- python/examples/joint_control/README.md | 66 + python/examples/joint_control/constants.py | 128 ++ .../joint_control/joint_api_helper.py | 184 +++ python/examples/joint_control/noarm_squat.py | 152 +++ .../examples/joint_control/requirements.txt | 3 + python/examples/joint_control/wiggle_arm.py | 161 +++ .../examples/orbit/webhook/hello_webhook.py | 15 +- 514 files changed, 11140 insertions(+), 1377 deletions(-) create mode 100644 docs/concepts/joint_control/README.md create mode 100644 docs/concepts/joint_control/knee_torque_limits.md create mode 100644 docs/concepts/joint_control/spot_with_arm.png create mode 100644 docs/concepts/joint_control/supplemental_data.md create mode 100644 docs/html/_images/spot_with_arm.png create mode 100644 docs/html/docs/concepts/joint_control/README.html create mode 100644 docs/html/docs/concepts/joint_control/knee_torque_limits.html create mode 100644 docs/html/docs/concepts/joint_control/supplemental_data.html create mode 100644 docs/html/files/spot_with_arm_urdf.zip create mode 100644 docs/html/python/examples/docs/joint_control_examples.html create mode 100644 docs/html/python/examples/joint_control/README.html create mode 100644 files/spot_with_arm_urdf.zip rename prebuilt/{bosdyn_api-4.0.1-py3-none-any.whl => bosdyn_api-4.0.2-py3-none-any.whl} (78%) delete mode 100644 prebuilt/bosdyn_choreography_client-4.0.1-py3-none-any.whl create mode 100644 prebuilt/bosdyn_choreography_client-4.0.2-py3-none-any.whl delete mode 100644 prebuilt/bosdyn_choreography_protos-4.0.1-py3-none-any.whl create mode 100644 prebuilt/bosdyn_choreography_protos-4.0.2-py3-none-any.whl rename prebuilt/{bosdyn_client-4.0.1-py3-none-any.whl => bosdyn_client-4.0.2-py3-none-any.whl} (84%) rename prebuilt/{bosdyn_core-4.0.1-py3-none-any.whl => bosdyn_core-4.0.2-py3-none-any.whl} (82%) rename prebuilt/{bosdyn_mission-4.0.1-py3-none-any.whl => bosdyn_mission-4.0.2-py3-none-any.whl} (80%) delete mode 100644 prebuilt/bosdyn_orbit-4.0.1-py3-none-any.whl create mode 100644 prebuilt/bosdyn_orbit-4.0.2-py3-none-any.whl delete mode 100644 prebuilt/bosdyn_scout-4.0.1-py3-none-any.whl create mode 100644 prebuilt/bosdyn_scout-4.0.2-py3-none-any.whl create mode 100644 protos/bosdyn/api/spot/spot_constants.proto create mode 100644 python/examples/docs/joint_control_examples.md create mode 100644 python/examples/joint_control/README.md create mode 100644 python/examples/joint_control/constants.py create mode 100644 python/examples/joint_control/joint_api_helper.py create mode 100644 python/examples/joint_control/noarm_squat.py create mode 100644 python/examples/joint_control/requirements.txt create mode 100644 python/examples/joint_control/wiggle_arm.py diff --git a/README.md b/README.md index f2620f3fe..a7dca83da 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ The SDK consists of: - [Spot API protocol definition](protos/bosdyn/api/README.md). This reference guide covers the details of the protocol applications used to communicate to Spot. Application developers who wish to use a language other than Python can implement clients that speak the protocol. - [Spot SDK Repository](https://github.com/boston-dynamics/spot-sdk). The GitHub repo where all of the Spot SDK code is hosted. -This is version 4.0.1 of the SDK. Please review the [Release Notes](docs/release_notes.md) to see what has changed. +This is version 4.0.2 of the SDK. Please review the [Release Notes](docs/release_notes.md) to see what has changed. ## Contents diff --git a/VERSION b/VERSION index 1454f6ed4..4d54daddb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.0.1 +4.0.2 diff --git a/docs/concepts/README.md b/docs/concepts/README.md index 6ddf4a219..17d3605e9 100644 --- a/docs/concepts/README.md +++ b/docs/concepts/README.md @@ -46,5 +46,6 @@ Similar to the Spot API, client applications can be written in many languages an - [Faults](faults.md) - [Autonomy services](autonomy/README.md) - [Choreography](choreography/README.md) +- [Joint Control API](joint_control/README.md) - [Spot Arm](arm/README.md) - [Spot Data](data.md) diff --git a/docs/concepts/joint_control/README.md b/docs/concepts/joint_control/README.md new file mode 100644 index 000000000..9504f4349 --- /dev/null +++ b/docs/concepts/joint_control/README.md @@ -0,0 +1,84 @@ + + +# Joint Control API (Beta) + +The Joint Control API provides developers with low-level control of the robot through high-rate, low-latency RPC streams. This controlled-access API requires a special-permissions license and is compatible with the Boston Dynamics SDK, available in either C++ or Python. + +## Contents + +Information regarding joint ordering, maximum torques, and robot morphology. + +- [Supplemental Robot Information](supplemental_data.md) + +## Components + +- [Streaming Robot State Messages](../../../protos/bosdyn/api/robot_state.proto#robotstatestreamresponse): Structure for receiving lightweight robot state messages. +- [Streaming Robot Command Messages](../../../protos/bosdyn/api/basic_command.proto#jointcommand-updaterequest): Structure for sending joint commands, gains, and leg contact advice. +- [Streaming State Client](../../../python/bosdyn-client/src/bosdyn/client/robot_state.py#bosdyn.client.robot_state.RobotStateStreamingClient): Python client for receiving lightweight robot state. +- [Streaming Command Client](../../../python/bosdyn-client/src/bosdyn/client/robot_command.py#bosdyn.client.robot_command.RobotCommandStreamingClient) Python client for streaming robot commands. + +## Usage + +To utilize the Joint Control API: + +- Install the Boston Dynamics SDK. +- Connect to a licensed robot supporting joint control. +- Enable joint control initially via [JointCommand.Request](../../../protos/bosdyn/api/basic_command.proto#jointcommand-request) RPC with the [Command Client](../../../python/bosdyn-client/src/bosdyn/client/robot_command.py#bosdyn.client.robot_command.RobotCommandClient) +- Start streaming [JointCommand.UpdateRequest](../../../protos/bosdyn/api/basic_command.proto#jointcommand-updaterequest) with the [Streaming Command Client](../../../python/bosdyn-client/src/bosdyn/client/robot_command.py#bosdyn.client.robot_command.RobotCommandStreamingClient) + +## Robot Command Stream + +The robot command streaming service allows a user to move the robot with simple commands for each of the robot's joints. The interface provided is very similar to the one that Boston Dynamics' internal developers use to compose complex walking and manipulation behaviors. + +We expose for each joint proportional-derivative + feed-forward (PDFF) control parameters outlined below. + +- **position**: Repeated desired position in radians for each of the robot's joints. +- **velocity**: Repeated desired angular velocity in radians/s for each of the robot's joints. +- **load**: Repeated desired load in Newton-meters for each of the robot's joints. +- **gains**: Repeated gains for each joint. Gains are required to be sent to initialize control, but may be omitted on subsequent commands to save bandwidth if they are unchanged. Each gain contains two parameters: **k_q_p** proportional position error gain in Newton-meters / radian and **k_qd_p** proportional velocity error gain in Newton-meter-second / radian. + +Furthermore, there are shared message fields outlined below. + +- **end_time**: The timestamp (in robot time) when the command will stop executing. This is a required field and used to prevent runaway commands. +- **reference_time**: (Optional) joint trajectory reference time. See **extrapolation_duration** for detailed explanation. If unspecified, this will default to the time the command is received. If the time is in the future, no extrapolation will be performed until that time (extrapolation never goes backwards in time.) +- **extrapolation_duration**: (Optional) joint trajectory extrapolation time. If specified, the robot will extrapolate desired position based on desired **velocity**, starting at **reference_time** for at most **extrapolation_duration** (or until **end_time**, whichever is sooner.) +- **user_command_key**: (Optional) Key that can be used for tracking when commands take effect on the robot and calculating loop latencies. Avoid using 0. +- **velocity_safety_limit**: (Optional) Joint velocity safety limit in radians/s. Possibly useful during initial development or gain tuning. If the magnitude of any joint velocity passes the threshold the robot will trigger a behavior fault and go into a safety state. Client must power down the robot or clear the behavior fault via the Robot Command Service. Values less than or equal to 0 will be considered invalid and must be sent in every **UpdateRequest** for use. + +Clients are encouraged to stream new commands at a suitably high frequency (100-333 Hz) to achieve more complex behaviors such as following higher fidelity trajectories or deploying trained machine learning policies. + +#### Note on Closed-Loop Joint Behavior + +- As outlined above, the Joint Control API provides the means to specify PDFF control parameters for each of the joints. At the servo level we utilize the desired positions/velocities/loads to calculate a total desired torque which is tracked in firmware as follows: + +**
load_servo = k_q_p \* (position_desired - position_measured) + k_qd_p \* (velocity_desired - velocity_measured) + load_desired
** + +- A pure proportional-derivative control may be achieved by setting the load commands to zero. Likewise, pure torque control may be achieved by setting the **k_q_p** and **k_qd_p** gains to zero and commanding zero **position** and **velocity**. +- Desired positions and loads are saturated with respect to the robot's kinematic and load limits. See notes below on limits. + +## Robot State Stream + +The robot state streaming service provides a minimal version of robot state suitable for high-rate communications with the robot. Usage note: a user may still find it necessary to request full robot state at a lower rate from the [RobotStateService](../../../docs/concepts/robot_services.md#robot-state), e.g. to gain access to fault information or battery state of charge. + +The morphology of the robot, represented by links and joints, is described through a URDF which can be requested through the [RobotStateService](../../../docs/concepts/robot_services.md#robot-state). This configuration representation is fully expressive of the robot's joint states relative to each other and can be used for visualization, dynamics, or forward kinematics of the robot model. A URDF model with some additional information regarding max joint torques and collision geometries of the robot with an arm can also be found [here](../../../files/spot_with_arm_urdf.zip). + +The streaming robot state includes information about joints, Inertial Measurement Unit (IMU) information, foot contact states, and the kinematic state of the robot. The `GetRobotStateStream` RPC can provide a stream that will pipe data at 333 Hz from the robot. + +- **joint_states**: Measured joint position, velocity, and load of each of the robot's joints. Positions are expressed in radians, velocities in radians/s, and load in Newton-meters. See [here](supplemental_data.md#joint-order) for supplemental information regarding joint order. +- **inertial_state**: Full-rate IMU information including accelerations and angular velocities. For IMU rotation see **kinematic_state.** +- **kinematic_state**: [Provides](../../../protos/bosdyn/api/robot_state.proto#robotstatestreamresponse-kinematicstate) the robot's estimated SE3Pose in both the "odom" and "vision" frames, along with base robot SE3Velocities. For a primer on "odom" and "vision" frames, refer to this [document](../../../docs/concepts/geometry_and_frames.md). These estimates result from the fusion of joint state, IMU data, and perception data on the robot. While every effort has been made to ensure the general accuracy of these estimates, their precision may vary depending on specific robot usage scenarios. Instances where the robot's contact forces are not through its foot, such as sliding on the ground or resting on the knees, may particularly affect the accuracy. +- **contact_states**: Repeated for each foot indicating if the robot thinks that foot is in contact with the ground. +- **last_command**: For loop-timing calculations, the robot echoes back the last user_command_key received from the streaming robot command service. + +## Example Code + +A few simple [examples](../../../python/examples/docs/joint_control_examples.md) illustrating use are shown in: + +- [Robot Squat](../../../python/examples/joint_control/README.md#armless-robot-squat) +- [Wiggle Arm](../../../python/examples/joint_control/README.md#arm-wiggle) diff --git a/docs/concepts/joint_control/knee_torque_limits.md b/docs/concepts/joint_control/knee_torque_limits.md new file mode 100644 index 000000000..e4de06fc6 --- /dev/null +++ b/docs/concepts/joint_control/knee_torque_limits.md @@ -0,0 +1,113 @@ + + +# Knee Torque Limits + +| Knee Angle (rad) | Transmission Ratio (In/Out) | Max Output Torque (N\*m) | +| ---------------- | --------------------------- | ------------------------ | +| -2.792900 | -24.776718 | 37.165077 | +| -2.767442 | -26.290108 | 39.435162 | +| -2.741984 | -27.793369 | 41.690054 | +| -2.716526 | -29.285997 | 43.928996 | +| -2.691068 | -30.767536 | 46.151304 | +| -2.665610 | -32.237423 | 48.356134 | +| -2.640152 | -33.695168 | 50.542751 | +| -2.614694 | -35.140221 | 52.710331 | +| -2.589236 | -36.572052 | 54.858078 | +| -2.563778 | -37.990086 | 56.985128 | +| -2.538320 | -39.393730 | 59.090595 | +| -2.512862 | -40.782406 | 61.173609 | +| -2.487404 | -42.155487 | 63.233231 | +| -2.461946 | -43.512371 | 65.268557 | +| -2.436488 | -44.852371 | 67.278557 | +| -2.411030 | -46.174873 | 69.262310 | +| -2.385572 | -47.479156 | 71.218735 | +| -2.360114 | -48.764549 | 73.146824 | +| -2.334656 | -50.030334 | 75.045502 | +| -2.309198 | -51.275761 | 76.913641 | +| -2.283740 | -52.500103 | 78.750154 | +| -2.258282 | -53.702587 | 80.553881 | +| -2.232824 | -54.882442 | 82.323664 | +| -2.207366 | -56.038860 | 84.058290 | +| -2.181908 | -57.171028 | 85.756542 | +| -2.156450 | -58.278133 | 87.417200 | +| -2.130992 | -59.359314 | 89.038971 | +| -2.105534 | -60.413738 | 90.620607 | +| -2.080076 | -61.440529 | 92.160793 | +| -2.054618 | -62.438812 | 93.658218 | +| -2.029160 | -63.407692 | 95.111538 | +| -2.003702 | -64.346268 | 96.519402 | +| -1.978244 | -65.253670 | 97.880505 | +| -1.952786 | -66.128944 | 99.193417 | +| -1.927328 | -66.971176 | 100.456764 | +| -1.901870 | -67.779457 | 101.669186 | +| -1.876412 | -68.552864 | 102.829296 | +| -1.850954 | -69.290451 | 103.935677 | +| -1.825496 | -69.991325 | 104.986988 | +| -1.800038 | -70.654541 | 105.981812 | +| -1.774580 | -71.279190 | 106.918785 | +| -1.749122 | -71.864319 | 107.796478 | +| -1.723664 | -72.409088 | 108.613632 | +| -1.698206 | -72.912567 | 109.368851 | +| -1.672748 | -73.373871 | 110.060806 | +| -1.647290 | -73.792130 | 110.688194 | +| -1.621832 | -74.166512 | 111.249767 | +| -1.596374 | -74.496147 | 111.744221 | +| -1.570916 | -74.780251 | 112.170376 | +| -1.545458 | -75.017998 | 112.526997 | +| -1.520000 | -75.208656 | 112.812984 | +| -1.494542 | -75.351448 | 113.027172 | +| -1.469084 | -75.445686 | 113.168530 | +| -1.443626 | -75.490677 | 113.236015 | +| -1.418168 | -75.485771 | 113.228657 | +| -1.392710 | -75.430344 | 113.145515 | +| -1.367252 | -75.323830 | 112.985744 | +| -1.341794 | -75.165688 | 112.748531 | +| -1.316336 | -74.955406 | 112.433109 | +| -1.290878 | -74.692551 | 112.038826 | +| -1.265420 | -74.376694 | 111.565041 | +| -1.239962 | -74.007477 | 111.011215 | +| -1.214504 | -73.584579 | 110.376869 | +| -1.189046 | -73.107742 | 109.661613 | +| -1.163588 | -72.576752 | 108.865128 | +| -1.138130 | -71.991455 | 107.987183 | +| -1.112672 | -71.351707 | 107.027561 | +| -1.087214 | -70.657486 | 105.986229 | +| -1.061756 | -69.908813 | 104.863220 | +| -1.036298 | -69.105721 | 103.658581 | +| -1.010840 | -68.248337 | 102.372505 | +| -0.985382 | -67.336861 | 101.005291 | +| -0.959924 | -66.371513 | 99.557270 | +| -0.934466 | -65.352615 | 98.028923 | +| -0.909008 | -64.280533 | 96.420799 | +| -0.883550 | -63.155693 | 94.733540 | +| -0.858092 | -61.978588 | 92.967882 | +| -0.832634 | -60.749775 | 91.124662 | +| -0.807176 | -59.469845 | 89.204767 | +| -0.781718 | -58.139503 | 87.209255 | +| -0.756260 | -56.759487 | 85.139231 | +| -0.730802 | -55.330616 | 82.995924 | +| -0.705344 | -53.853729 | 80.780594 | +| -0.679886 | -52.329796 | 78.494694 | +| -0.654428 | -50.759762 | 76.139643 | +| -0.628970 | -49.144699 | 73.717049 | +| -0.603512 | -47.485737 | 71.228605 | +| -0.578054 | -45.784004 | 68.676006 | +| -0.552596 | -44.040764 | 66.061146 | +| -0.527138 | -42.257267 | 63.385900 | +| -0.501680 | -40.434883 | 60.652325 | +| -0.476222 | -38.574947 | 57.862421 | +| -0.450764 | -36.678982 | 55.018473 | +| -0.425306 | -34.748432 | 52.122648 | +| -0.399848 | -32.784836 | 49.177254 | +| -0.374390 | -30.789810 | 46.184715 | +| -0.348932 | -28.764952 | 43.147428 | +| -0.323474 | -26.711969 | 40.067954 | +| -0.298016 | -24.632576 | 36.948864 | +| -0.272558 | -22.528547 | 33.792821 | +| -0.247100 | -20.401667 | 30.602500 | diff --git a/docs/concepts/joint_control/spot_with_arm.png b/docs/concepts/joint_control/spot_with_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..50b3abbf95cc78e30c160b96d276242b2a4a4a18 GIT binary patch literal 80739 zcmeGEXFptT*ftDHB889;EoyY4_c8|25~4-4=ut-RW(ZNzL?^nzAfxv(x**ZJ=$+`D zAfj_0lmB&{=kt7n`^CN9u>8zgN7;|PY}>X^&J%H PVLwX;hpRIG#$6TWO2bo6^z3)KtqHwUdT@y!*R#I
zIaIo&BdO4}ZMpg8y#OQ%x(x_OlHpfS5~~B!D~tC^@Jwy)te}psDI#YT4okOXo`^cl
zW<>a%FUps59(M@N*3eiH;R>PDY{Y2#K8?~b1A&v69@p!{SC#aZ%E)EIm^ZI7-(;By
zARiV76+jQ*qX+ozMUEmx@mkTu9aE%;To<1vQxAw$d`QRgf|Q_Sk_xGjiIC5P=kJFZ
zwG&bfQ}}0*94!?fO=uiG$8J&yP+yHCfYheedA=!GBCMlm;2U6Bo`utB6p<*TJ673A
z76s+!04GUty6$SYZ*jv+sw|E5vh$22!cWf(3+~=7i$6LUc=jlA)e{a#Z`reP5aT6w
zsy~8Y3TPh)s;_5*<4Q-bT%Q|@tkd6lsS%9|hunL !$rD !N!1jWA5atYrHXP!j(QdLIvxoj(I*M;IOgghZB(yHH(_$TMeVcqvd6
zZEqA&D!{t01drM%zp5Qy{_pn)r0>=ObUdDv4y!JrkE%{O`H+=hx#
z%qW$nn5Ty(Efq{$tEQ7F#jzaydMV%#JeDxw|MUXNoAtIc=8=>1LxSXFn}y1dr$r%{
z-%wt%ZrHP^joRqco0Tw)ude-x`+cs(6I@kBPDxpcr+NF%@2#3wR?+8%t5@ge9eE*3
zLI|(-jN$1Vv(&85%tnRnm7|!kf?2VDj4~Gm@G_sQ4z*MzoTk2*wo{7bi#md_f_BN(17ym
zS>4TWDbE6-ByUyO1XTzSSi{T`V56m4VbzbOI`Iq-M3)(M+eac#9$<|~&KO)dM)16UNWtTkccWI`yzrw@j&cspT
z2j2J}nzGMl+DRU3jB*83CAhs@$|}u6cey9n%Z?tmEEeclmJB9vC`OESH+p{j)p_9b
zzxorGcXy4{V`C|tUK;^T
z2
+OOkNMT8D|mK>Qw}ACSN;b5IlzNq)P2vrEuZlDH!?}
z4lcqTG&%w~q=b3_QDpx`{W9hNi!tp%Ka(+ZZ?@FL34Y-$Y=A2qvBTfR)9}v!t6ujE
z{?F3)I8;=;#&xS2lj$+4Qk>T$siM&syy=0hGxR{yQjg81@7xwoE?IQ1+pz9_XzS?VED%L
z4f6fnPS5(QJ-4);Eh@$Eil(lqzfLc2Hjoh-(LPDDd||s@3gxC?c$W!O;>1N>x&HoM
z_8!dwm@q&?_Bq3~Kn`jrmmXX4Tnx2YVznE2IZJwfuIp-M3m!DbbsPTls!17E#cOXw
zfon5(hiJY@B!I7GT_7ukEz&I7-c&QOB79f
vGQhf6etpGdzPAYYk-6)}M;pc&_NXv47WOpqW#C`^
zJ*PB~f=RKc?&(ozYlFBCb^SM}n*OFloznxW;*n3TTp4u#t8PYMR~unwVp{{t30ecT
zg>^#whBTfRQ^;;V$EBiXbsfha`3&r%-xOums@AV)zPttxUvVF|s1kiNRDAPXeJ<%3
zM~x5TkMx2CRmL=kk1#3Flu>S&pf%GQu5PsC*vGC}oMB>h
zr{&jDTY@+sC|@CN#*44{`e!OFXIu)u>$bOP&w_hE{Ip>Z7qX@MBMr)Mfl2k;1gwFL
zjmBe#O7^wuP9Xx^nU>pkX_|N;uzuzc