diff --git a/README.md b/README.md index 62c461be1..d24864585 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.3 of the SDK. Please review the [Release Notes](docs/release_notes.md) to see what has changed. +This is version 4.1.0 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 c4e41f945..ee74734aa 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.0.3 +4.1.0 diff --git a/choreography_protos/setup.py b/choreography_protos/setup.py index 1819d9e09..b5ed94da0 100644 --- a/choreography_protos/setup.py +++ b/choreography_protos/setup.py @@ -4,12 +4,13 @@ # is subject to the terms and conditions of the Boston Dynamics Software # Development Kit License (20191101-BDSDK-SL). -import setuptools.command.build_py import distutils.cmd import os +import sys + import pkg_resources import setuptools -import sys +import setuptools.command.build_py try: SDK_VERSION = os.environ['BOSDYN_SDK_VERSION'] @@ -17,6 +18,7 @@ print('Do not run setup.py directly - use wheels.py to build API wheels') raise + class BuildPy(setuptools.command.build_py.build_py, object): """Grabs and overwrites the package directory.""" @@ -56,9 +58,10 @@ def run(self): except ImportError: # Try to grab pathlib2, which should have been grabbed as part of install dependencies. import pathlib2 as pathlib - from grpc_tools import protoc import os + from grpc_tools import protoc + def make_init(directory, do_pkg_extension=False): pkg = pathlib.Path(directory) init_file = pkg.joinpath('__init__.py') @@ -74,11 +77,12 @@ def make_init(directory, do_pkg_extension=False): output_dir = self.build_base make_init(os.path.join(root, output_dir, 'bosdyn'), do_pkg_extension=True) protos_root = os.path.join(root, 'bosdyn') - api_protos_dir =os.path.join(os.path.dirname(root), 'protos') + api_protos_dir = os.path.join(os.path.dirname(root), 'protos') for cwd, dirs, files in os.walk(protos_root): cwd_relative_to_root = cwd[len(root) + 1:] for d in dirs: - make_init(os.path.join(root, output_dir, cwd_relative_to_root, d), do_pkg_extension=True) + make_init(os.path.join(root, output_dir, cwd_relative_to_root, d), + do_pkg_extension=True) for f in files: if not f.endswith('.proto'): @@ -88,7 +92,7 @@ def make_init(directory, do_pkg_extension=False): args = ('garbage', file_relative_to_root, "--python_out=" + output_dir, "--grpc_python_out=" + output_dir, "-I.", "-I" + pkg_resources.resource_filename('grpc_tools', '_proto'), - "-I"+api_protos_dir) + "-I" + api_protos_dir) if self.verbose: print('Building {}'.format(f)) protoc.main(args) @@ -105,6 +109,7 @@ def add_pathlib_version(requirements_list): return requirements_list + ['pathlib2'] return requirements_list + setuptools.setup( name="bosdyn-choreography-protos", version=SDK_VERSION, @@ -125,7 +130,7 @@ def add_pathlib_version(requirements_list): package_dir={}, setup_requires=add_pathlib_version(['grpcio-tools', 'wheel']), classifiers=[ - "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", diff --git a/docs/concepts/README.md b/docs/concepts/README.md index 17d3605e9..103d5cf73 100644 --- a/docs/concepts/README.md +++ b/docs/concepts/README.md @@ -26,14 +26,15 @@ Finally, payloads allow for expansion of services beyond those provided by Spot ## Orbit API -Orbit collects, organizes, and stores data from every mission and teleoperation session executed by a Spot fleet - this information is open to Orbit customers through a programmatic web API called the [Orbit API](about_orbit.md). +Orbit collects, organizes, and stores data from every mission and teleoperation session executed by a Spot fleet - this information is open to Orbit customers through a programmatic web API called the [Orbit API](orbit/orbit_api.md). Similar to the Spot API, client applications can be written in many languages and run on most devices that can establish a network connection to Orbit. ## Contents - [About Spot](about_spot.md) -- [About Orbit (formerly Scout)](about_orbit.md) +- [About Orbit (formerly Scout)](orbit/about_orbit.md) +- [Orbit API](orbit/orbit_api.md) - [Networking](networking.md) - [Base services](base_services.md) - [Geometry and Frames](geometry_and_frames.md) diff --git a/docs/concepts/about_spot.md b/docs/concepts/about_spot.md index 2da23dbfe..242d0ccf2 100644 --- a/docs/concepts/about_spot.md +++ b/docs/concepts/about_spot.md @@ -8,48 +8,35 @@ Development Kit License (20191101-BDSDK-SL). # About Spot - ![Spot anatomy](spotanatomy.png) - - ## Cameras Spot has 5 pairs of stereo cameras that provide black and white images and video. - ## Hips and joints -Spot has 2 actuators in each hip, and one actuator in each knee. The hip joints are referred to as HX and HY for each plane of rotation. This creates the following degrees of freedom and limits on each axis: - - - -* 12 DOFs, 3 per leg -* Hip Joint X-axis (HX): +/- 45 degrees from vertical (45 degrees of internal and external rotation from vertical) -* Hip Joint Y-axis (HY): +/- 91 degrees with 50 degree bias from vertical (flexion/extension) -* Knee: +/- 14-160 degrees from straight (flexion/extension range from 14 to 160 degrees) +Spot has 2 actuators in each hip, and one actuator in each knee. The hip joints are referred to as HX and HY for each plane of rotation. This creates the following degrees of freedom and limits on each axis: +- 12 DOFs, 3 per leg +- Hip Joint X-axis (HX): +/- 45 degrees from vertical (45 degrees of internal and external rotation from vertical) +- Hip Joint Y-axis (HY): +/- 91 degrees with 50 degree bias from vertical (flexion/extension) +- Knee: +/- 14-160 degrees from straight (flexion/extension range from 14 to 160 degrees) ![Spot side view](sideview.png) - ![Spot front view](frontview.png) - Legs are referred to as front or hind and left or right. For example, the front left leg is FL, or the hind left leg is HL. A complete joint reference for one leg looks like this: - - -* fl.hx refers to the front left hip X -* fl.hy refers to the front left hip Y -* fl.kn refers to the front left knee - +- fl.hx refers to the front left hip X +- fl.hy refers to the front left hip Y +- fl.kn refers to the front left knee ![Spot geometry](spotframes.png) The [robot state protobuf message](../../protos/bosdyn/api/robot_state.proto) in the Spot SDK describes data about the robot, including information about joints and legs. The following snippet shows the data returned about the robot state using the [`get_robot_state` example](../../python/examples/get_robot_state/README.md) for hip X joint on the front left leg: - ... joint_states { name: "fl.hx" @@ -68,65 +55,63 @@ The [robot state protobuf message](../../protos/bosdyn/api/robot_state.proto) in } ... - ## Robot specifications ### Dimensions -| Specification | Value | -| ------------- | ------ | -| Robot type | Spot Gamma | -| Length | 1100 mm (43.3 in) | -| Width | 500 mm (19.7 in) | -| Height (standing) | 840 mm (33.1 in) | -| Height | (sitting) 191 mm (7.5 in) | -Net weight | 32.5 kg (71.7 lbs) | -Degrees of freedom | 12 | -Maximum speed | 1.6 m/s | +| Specification | Value | +| ------------------ | ------------------------- | +| Robot type | Spot Gamma | +| Length | 1100 mm (43.3 in) | +| Width | 500 mm (19.7 in) | +| Height (standing) | 840 mm (33.1 in) | +| Height | (sitting) 191 mm (7.5 in) | +| Net weight | 32.5 kg (71.7 lbs) | +| Degrees of freedom | 12 | +| Maximum speed | 1.6 m/s | ### Environment -| Specification | Value | -| ------------- | ------ | -| Ingress protection | IP54 | -| Operating temperature | -20C to 45C | -| Slopes | +/- 30 degrees | -| Stairways | Stair dimensions that meet US building code standards, typically with 7 in. rise for 10-11 in. run | -| Max step height | 300 mm (11.8 in) | -| Lighting | Above 2 lux | +| Specification | Value | +| --------------------- | -------------------------------------------------------------------------------------------------- | +| Ingress protection | IP54 | +| Operating temperature | -20C to 45C | +| Slopes | +/- 30 degrees | +| Stairways | Stair dimensions that meet US building code standards, typically with 7 in. rise for 10-11 in. run | +| Max step height | 300 mm (11.8 in) | +| Lighting | Above 2 lux | ## Power -| Specification | Value | -| ------------- | ------ | -| Battery capacity | 605 Wh | -| Max battery voltage | 58.8V | -| Typical runtime | 90 minutes | -| Standby time | 180 minutes | -| Charger power | 400W | -| Max charge current | 7A | -| Time to charge | 120 minutes | - +| Specification | Value | +| ------------------- | ----------- | +| Battery capacity | 605 Wh | +| Max battery voltage | 58.8V | +| Typical runtime | 90 minutes | +| Standby time | 180 minutes | +| Charger power | 400W | +| Max charge current | 7A | +| Time to charge | 120 minutes | ## Payload -| Specification | Value | -| ------------- | ------ | -| Max weight | 14 kg (30.9 lbs) | -| Max power per port | 150W | -| Payload ports | 2 | +| Specification | Value | +| ------------------ | ---------------- | +| Max weight | 14 kg (30.9 lbs) | +| Max power per port | 150W | +| Payload ports | 2 | ## Sensing -| Specification | Value | -| ------------- | ------ | -| Camera type | Projected stereo | -| Field of view | 360 degrees | -| Operating range | 4 m (13 ft) | +| Specification | Value | +| --------------- | ---------------- | +| Camera type | Projected stereo | +| Field of view | 360 degrees | +| Operating range | 4 m (13 ft) | ## Connectivity -| Specification | Value | -| ------------- | ------ | -| Wifi | 802.11 | -| Ethernet | 1000Base-T | +| Specification | Value | +| ------------- | ---------- | +| Wifi | 802.11 | +| Ethernet | 1000Base-T | diff --git a/docs/concepts/arm/README.md b/docs/concepts/arm/README.md index a1f9fb70d..846b6d18d 100644 --- a/docs/concepts/arm/README.md +++ b/docs/concepts/arm/README.md @@ -8,10 +8,10 @@ Development Kit License (20191101-BDSDK-SL). # Spot Arm and Gripper -Arm and gripper commands are included as of the 2.3.0 release of the SDK. Direct control of the arm and gripper have been added to the synchronized command message, allowing operators to request any combination of mobility, arm, and gripper commands. We have also added new services to support manipulation, door opening, and surface contact. See the below sections for more details. +Arm and gripper commands are included as of the 2.3.0 release of the SDK. Direct control of the arm and gripper have been added to the synchronized command message, allowing operators to request any combination of mobility, arm, and gripper commands. We have also added new services to support manipulation, door opening, and surface contact. See the below sections for more details. ## Contents -* [Arm and Gripper Specification](arm_specification.md) -* [Concepts](arm_concepts.md) -* [Services](arm_services.md) \ No newline at end of file +- [Arm and Gripper Specification](arm_specification.md) +- [Concepts](arm_concepts.md) +- [Services](arm_services.md) diff --git a/docs/concepts/arm/arm_concepts.md b/docs/concepts/arm/arm_concepts.md index ef2d66fb4..c265cc315 100644 --- a/docs/concepts/arm/arm_concepts.md +++ b/docs/concepts/arm/arm_concepts.md @@ -9,7 +9,9 @@ Development Kit License (20191101-BDSDK-SL). # Arm Concepts ## SynchronizedCommand -Arm and gripper commands have been incorporated into the SynchronizedCommand message. This top level request allows you to specify any combination of mobility, arm, and gripper command. By packing the individual commands into a single message, we guarantee that all commands arrive to the robot at the same time. For robots without arms, any arm_command or gripper_command will be ignored. + +Arm and gripper commands have been incorporated into the SynchronizedCommand message. This top level request allows you to specify any combination of mobility, arm, and gripper command. By packing the individual commands into a single message, we guarantee that all commands arrive to the robot at the same time. For robots without arms, any arm_command or gripper_command will be ignored. + ```protobuf message SynchronizedCommand { message Request { @@ -19,19 +21,22 @@ message SynchronizedCommand { } } ``` + The ArmCommand message supports the following commands: -* [Cartesian Moves](#cartesian-moves) Control the end-effector in Cartesian space. - * Specify mixed position and wrench trajectories for the end effector -* [Joint Moves](#joint-moves) Control the joint angles of the arm. -* [Predefined Poses](#predefined-poses) Move the arm to some predefined configurations -* [Arm Velocity](#arm-velocity) Velocity control of the end-effector. -* [Gaze](#gaze) Point the end-effector at a point in the world -* [Drag](#drag) Drag an object held in the gripper -* [Stop](#stop) Stop and hold the arm in place + +- [Cartesian Moves](#cartesian-moves) Control the end-effector in Cartesian space. + - Specify mixed position and wrench trajectories for the end effector +- [Joint Moves](#joint-moves) Control the joint angles of the arm. +- [Predefined Poses](#predefined-poses) Move the arm to some predefined configurations +- [Arm Velocity](#arm-velocity) Velocity control of the end-effector. +- [Gaze](#gaze) Point the end-effector at a point in the world +- [Drag](#drag) Drag an object held in the gripper +- [Stop](#stop) Stop and hold the arm in place ### Requests -If you send a `SynchronizedCommand` with only a subset of the messages filled out, only those commands will be overwritten. For example, consider the following pseudo-code: +If you send a `SynchronizedCommand` with only a subset of the messages filled out, only those commands will be overwritten. For example, consider the following pseudo-code: + ```protobuf Time t = 0 message SynchronizedCommand { @@ -55,14 +60,15 @@ After the robot receives the second request at time `t = 2`, it will continue ex Similarly, if you sent a partially filled out `SynchronizedCommand` after sending a `FullBodyCommand`, the empty `SynchronizedCommand` requests will be auto filled with `safe_stop` requests. ### Feedback -With the introduction of `ArmCommand` and `GripperCommand` requests inside of the `SynchronizedCommand`, we have also modified feedback to return three messages, one feedback message for each request respectively. - +With the introduction of `ArmCommand` and `GripperCommand` requests inside of the `SynchronizedCommand`, we have also modified feedback to return three messages, one feedback message for each request respectively. ## ArmCommand Requests + There are 7 different commands listed below that fall under the ArmCommand banner. The arm has 6 joints (+ a gripper), and can be controlled by specifying the joint angles directly, or by specifying a desired position and orientation (called a pose) where the hand should be. Joint angles are specified in radians, and Cartesian poses are specified with a 3D position in meters, and orientation is expressed with unit quaternions. ### Cartesian Moves + When specifying a pose for the hand to move to, the user is able to specify 2 frames, and then a transform between those 2 frames. This fully defines the position and orientation the robot will move its hand to. The first frame is the "root" frame, which is the frame that the hand moves with respect to. Common choices for this frame are the "odom", "vision" and "flat_body" frames. The second frame is a "tool" frame. If trying to grasp something or just move the arm around, this can often be left unset, and this will default to the [hand frame](#hand-frame). However, if a pointing device or sensor is attached to the end effector of the arm, setting the tool frame to be a transform to the point of interest can allow the user to directly move the sensor to a desired pose. @@ -77,67 +83,88 @@ root_tform_task: {position: {x: 0 y: 0 z: 0} rotation: {w: 1 x: 0 y: 0 z: 0}} Note that users can also send sequences of poses with times, specify max velocity and acceleration, and add other options as well. See arm_command.proto for more details -The Cartesian move request also allows you to specify a force/torque trajectory for the tool. For each axis in the task frame, you select if an axis is set to position mode (input read desired from SE3Trajectory) or to force (input read from WrenchTrajectory). This supports hybrid control of the arm where users can specify, for example, Z to be in force control with X and Y in position control. +The Cartesian move request also allows you to specify a force/torque trajectory for the tool. For each axis in the task frame, you select if an axis is set to position mode (input read desired from SE3Trajectory) or to force (input read from WrenchTrajectory). This supports hybrid control of the arm where users can specify, for example, Z to be in force control with X and Y in position control. See the following examples for requesting ArmCartesianCommands: [**Arm and Mobility Command**](../../../python/examples/arm_and_mobility_command/README.md) [**Arm Force Control**](../../../python/examples/arm_force_control/README.md) [**Simple**](../../../python/examples/arm_simple/README.md) [**Trajectory**](../../../python/examples/arm_trajectory/README.md) + ### Joint Moves + Users can specify a set of joint angles they want the arm to move to. Users can optionally set a maximum velocity and acceleration that each joint is allowed to travel at, and/or specify full trajectories with times that they want the robot to reach those joint angles. Joint moves can be especially useful when moving the arm to hard-to-reach places, or trying to make the arm wave through a set of predefined poses. -See the [**Joint Move**](../../../python/examples/arm_joint_move/README.md) example for requesting ArmJointMoveCommands. +See the [**Joint Move**](../../../python/examples/arm_joint_move/README.md) example for requesting ArmJointMoveCommands. + ### Predefined Poses + Users can command the arm to move to the following poses: Stow (arm tucked away, ready to walk) Carry (useful for carrying an object somewhere) Ready (arm out in front, ready to manipulate) -The predefined stow pose will refuse to stow if the arm is holding something. You can still issue joint move commands to a stow configuration if desired, but be aware that no collision avoidance system exists. Contact between the item and the world or the item and the robot may occur during arm motion. +The predefined stow pose will refuse to stow if the arm is holding something. You can still issue joint move commands to a stow configuration if desired, but be aware that no collision avoidance system exists. Contact between the item and the world or the item and the robot may occur during arm motion. -See the [**Stow/Unstow**](../../../python/examples/arm_stow_unstow/README.md) example for requesting NamedArmPositions. +See the [**Stow/Unstow**](../../../python/examples/arm_stow_unstow/README.md) example for requesting NamedArmPositions. + +### Arm Velocity -### Arm Velocity When controlling the arm with a joystick, because of latency, it can often be better to send velocity commands rather than position commands. Users can specify the velocity in a cylindrical frame around the body, or with their own specified frame. Both linear and angular velocity can be specified. + ### Gaze -Sometimes it is useful to have the arm continuously look at something while moving between positions. The user can specify both a position / trajectory of the target and a desired trajectory of the camera. If a different camera is attached to the end effector, `wrist_tform_tool` can be used to specify the x-axis of the camera, which is the direction we look at. Note that some of the desired trajectory's orientation will be ignored, since we will constrain the x-axis of the camera to look at the target at all times. -See the [**Gaze**](../../../python/examples/arm_gaze/README.md) example for requesting GazeCommands: +Sometimes it is useful to have the arm continuously look at something while moving between positions. The user can specify both a position / trajectory of the target and a desired trajectory of the camera. If a different camera is attached to the end effector, `wrist_tform_tool` can be used to specify the x-axis of the camera, which is the direction we look at. Note that some of the desired trajectory's orientation will be ignored, since we will constrain the x-axis of the camera to look at the target at all times. + +See the [**Gaze**](../../../python/examples/arm_gaze/README.md) example for requesting GazeCommands: + ### Stop + When something is going wrong, sending this command will bring the arm to a stop. It will also apply minimal forces to the world. For example, if the arm is in the middle of opening a heavy door and a stop command is sent, the arm will comply and let the door close. + ### Drag + Once the gripper is holding something, calling this command will put the arm into a compliant state that will let the robot pull a heavy object around. Drag will generally try to keep the object in front of the body for maximum pulling force. By sending the appropriate locomotion commands to move the body in a backwards direction, the robot can move heavy things around in the world. + ## Mobility Request + ### FollowArmCommand -The robot's base will move in response to the hand's position, allowing the arm to reach beyond its current workspace. If the hand is requested to move forward, then the base will begin walking forward. Our chalk drawing example takes advantage of this capability, where the task is the execution of a drawing with the hand, but the entire robot is recruited to accomplish the task. + +The robot's base will move in response to the hand's position, allowing the arm to reach beyond its current workspace. If the hand is requested to move forward, then the base will begin walking forward. Our chalk drawing example takes advantage of this capability, where the task is the execution of a drawing with the hand, but the entire robot is recruited to accomplish the task. See the following examples for requesting FollowArmCommands: [**GCode**](../../../python/examples/arm_gcode/README.md) [**Arm With Body Follow**](../../../python/examples/arm_with_body_follow/README.md) + ## Hand frame + The hand frame is used by many of the ArmCommand requests available in the API. The hand frame has its origin slightly in front of the gripper's palm plate and is aligned with the parent link's (wrist) orientation. The position of the hand frame's origin relative to the parent wrist frame is: x = 0.19557 m y = 0 m -z = 0 m +z = 0 m The rotation between the hand frame and the wrist is the identity matrix. When specifying trajectories using default values, the target position of the trajectory is the origin of this hand frame. -## Collision avoidance -The Arm has no proximity awareness of its own, so maintaining safe distance is essential. If obstacles or people are in the path of operation, the Arm has no collision avoidance capability to prevent contact. Safe Arm operation depends on the Operator and/or safety observers maintaining situational awareness and halting operations if the Arm is at risk of contacting objects or people. +## Collision avoidance + +The Arm has no proximity awareness of its own, so maintaining safe distance is essential. If obstacles or people are in the path of operation, the Arm has no collision avoidance capability to prevent contact. Safe Arm operation depends on the Operator and/or safety observers maintaining situational awareness and halting operations if the Arm is at risk of contacting objects or people. **WARNING**: The robot Arm does not have any obstacle avoidance capability. -Even if the robot's onboard cameras can see an obstacle, the Arm cannot avoid it without the Operator's intervention. In tight spaces, it is possible for the gripper head to inadvertently collide with something in the world. When operating around sensitive, fragile, or other objects that should not be contacted, extra care should be taken to avoid collisions with the Arm. +Even if the robot's onboard cameras can see an obstacle, the Arm cannot avoid it without the Operator's intervention. In tight spaces, it is possible for the gripper head to inadvertently collide with something in the world. When operating around sensitive, fragile, or other objects that should not be contacted, extra care should be taken to avoid collisions with the Arm. + +Note: The Arm does have the ability to avoid colliding with itself, the robot's body, and any properly configured payloads attached to the body. -Note: The Arm does have the ability to avoid colliding with itself, the robot's body, and any properly configured payloads attached to the body. ## Body force limiter + In order to prevent large forces from being applied to the body when the Arm collides with something in the world, Arm torques are automatically limited to protect the body from being disturbed. + ## Safety notes -* Arm torque limitations will not prevent damage to the environment and should NOT be used as a safety feature. These limitations are designed to reduce the likelihood that the robot will fall over if the Arm collides with some obstacle. -* If the robot walks into an object with the Arm outstretched that object can be damaged. -* If attempting to lift and carry an object, the force limiter may prevent the arm from lifting the object if it is too heavy. The force limiter can be disabled in the Arm menu. - * Care should be taken when disabling the force limiter. If the Arm contacts something in the world, it may apply high forces to the world and the robot body. This can potentially cause damage to the environment and/or the robot or the Arm, and make the robot inoperable. \ No newline at end of file + +- Arm torque limitations will not prevent damage to the environment and should NOT be used as a safety feature. These limitations are designed to reduce the likelihood that the robot will fall over if the Arm collides with some obstacle. +- If the robot walks into an object with the Arm outstretched that object can be damaged. +- If attempting to lift and carry an object, the force limiter may prevent the arm from lifting the object if it is too heavy. The force limiter can be disabled in the Arm menu. + - Care should be taken when disabling the force limiter. If the Arm contacts something in the world, it may apply high forces to the world and the robot body. This can potentially cause damage to the environment and/or the robot or the Arm, and make the robot inoperable. diff --git a/docs/concepts/arm/arm_services.md b/docs/concepts/arm/arm_services.md index d0f0cd708..060bce531 100644 --- a/docs/concepts/arm/arm_services.md +++ b/docs/concepts/arm/arm_services.md @@ -9,13 +9,15 @@ Development Kit License (20191101-BDSDK-SL). # Arm Services ## Manipulation Service -This API provides high-level control for walking to and picking up items in the world. The service walks the robot up to the object, not on top of it. The idea being that you want to interact or manipulate the object. For specifying grasps, there are parameters available for -* Specifying the depth of the grasp - * Item pressed tightly against the palm of the gripper or squeezed with just the tip of the finger. -* Constraints about the orientation of the grasp - * "Only grasp from this direction" or "only do top down grasp" -* How much the robot is allowed to move the grasp -* Which camera source produced the image (for correcting calibration errors) + +This API provides high-level control for walking to and picking up items in the world. The service walks the robot up to the object, not on top of it. The idea being that you want to interact or manipulate the object. For specifying grasps, there are parameters available for + +- Specifying the depth of the grasp + - Item pressed tightly against the palm of the gripper or squeezed with just the tip of the finger. +- Constraints about the orientation of the grasp + - "Only grasp from this direction" or "only do top down grasp" +- How much the robot is allowed to move the grasp +- Which camera source produced the image (for correcting calibration errors) See the following examples for using this service: @@ -26,7 +28,8 @@ Commands the robot to walk towards an object in preparation to grasp it. The exa Shows how 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. ## ArmSurfaceContact Service -Control the end-effector while pushing on a surface. This mode is useful for drawing, wiping, and other similar behaviors where high accuracy position moves are required while pushing down with some force. This service is similar to the `ArmCartesianCommand` message available in the `RobotCommand` service, but is specialized for this type of task and has higher position accuracy. + +Control the end-effector while pushing on a surface. This mode is useful for drawing, wiping, and other similar behaviors where high accuracy position moves are required while pushing down with some force. This service is similar to the `ArmCartesianCommand` message available in the `RobotCommand` service, but is specialized for this type of task and has higher position accuracy. See the following examples for using this service: @@ -37,10 +40,12 @@ Requests an end effector trajectory move while applying some force to the ground A [GCODE](https://en.wikipedia.org/wiki/G-code) interpreter that can be used to draw with sidewalk chalk. ## Door Service -The door service is a framework for opening doors. We support three command types: -* **AutoGrasp**: This message requires users to specify a location to search for a door handle along with and some door parameters. Spot autonomously grabs the handle, opens the door, and walks through. -* **Warmstart**: In Warmstart, the assumption is the robot is already grasping the door handle. The robot will skip the grasp stage of auto, and immediately begin opening the door and then traverses through the doorway. -* **AutoPush**: Used for doors that can be opened via a push without requiring a grasp. This includes pushbars, crashbars, and doors without a latching mechanism. The robot will point the hand down and push the door open with its wrist based on a push point supplied over the API. + +The door service is a framework for opening doors. We support three command types: + +- **AutoGrasp**: This message requires users to specify a location to search for a door handle along with and some door parameters. Spot autonomously grabs the handle, opens the door, and walks through. +- **Warmstart**: In Warmstart, the assumption is the robot is already grasping the door handle. The robot will skip the grasp stage of auto, and immediately begin opening the door and then traverses through the doorway. +- **AutoPush**: Used for doors that can be opened via a push without requiring a grasp. This includes pushbars, crashbars, and doors without a latching mechanism. The robot will point the hand down and push the door open with its wrist based on a push point supplied over the API. See the following example for using this service: @@ -49,10 +54,10 @@ This examples uses both the `ManipulationAPIService` and the `DoorService` to ha ## Inverse Kinematics Service -The inverse kinmatics (IK) service allows users to request robot configurations that satisfy a given set of stance, tool, and task specifications: +The inverse kinematics (IK) service allows users to request robot configurations that satisfy a given set of stance, tool, and task specifications: - **Stance Specifications** - - **Fixed Stance**: A valid solution must place the feet at the specfied positions, or at their current positions if unspecified. + - **Fixed Stance**: A valid solution must place the feet at the specified positions, or at their current positions if unspecified. - **On Ground Plane Stance**: A valid solution must place the feet on the specified ground plane, or on the robots current estimated ground plane if unspecified. - **Tool Specifications** - **Wrist-Mounted Tool**: The tool frame is fixed at a specified pose relative to the final arm link. If that pose is unspecified, the tool frame defaults to the [hand frame](./arm_concepts.md#hand-frame). @@ -66,9 +71,10 @@ The service responds with a robot configuration that meets those specifications The IK service does not cause the robot to take any actions, but the information it returns can be used to populate [robot commands](../robot_services.md#robot-command). See the following [examples](../../../python/examples/inverse_kinematics/README.md) for more on how to use the service. ### Frames + Along with the [usual frames](../geometry_and_frames.md#frames-in-the-spot-robot-world), the IK service API refers to several additional frames: + - **root frame**: The frame relative to which the problem is defined. Must be either "odom" or "vision". - **scene frame**: An optional frame at a user-specified pose relative to the root frame. Body and foot related quantities, as well as the task frame are expressed relative to this frame. Identity by default. - **task frame**: An optional frame at a user-specified pose relative to the scene fame. Task specifications are expressed relative to this frame. Identity by default. - **ground frame**: An optional frame at a user-specified pose relative to the scene frame. For an on-ground-plane stance, the feet must lie on the XY-plane of this frame. Defaults to the robot's current estimated ground plane. - diff --git a/docs/concepts/arm/arm_specification.md b/docs/concepts/arm/arm_specification.md index 2f9aa7942..5a8aa3016 100644 --- a/docs/concepts/arm/arm_specification.md +++ b/docs/concepts/arm/arm_specification.md @@ -9,6 +9,7 @@ Development Kit License (20191101-BDSDK-SL). # Arm and gripper specifications ## Joint ranges of motion and link lengths + ![](images/arm-diagrams-03.png) ![](images/arm-diagrams-02.png) @@ -16,34 +17,39 @@ Development Kit License (20191101-BDSDK-SL). Link lengths are in mm. ## Arm specifications -- **Degrees of freedom**: 6 + gripper -- **Length at full extension**: 984 mm -- **Max. reach height on robot**: 1800 mm -- **Mass/weight, including gripper**: 8 kg -- **Max. endpoint speed**: 10 m/s -- **Lift capacity\***: Up to 11 kg -- **Continuous lift capacity at 0.5 m extension\***: 5 kg -- **Drag capacity\* (on carpet)**: Up to 25 kg -- **Operating temp**: -20 C to 45 C -- **Ingress protection**: Water and dust resistant - -\* At 22 C. + +- **Degrees of freedom**: 6 + gripper +- **Length at full extension**: 984 mm +- **Max. reach height on robot**: 1800 mm +- **Mass/weight, including gripper**: 8 kg +- **Max. endpoint speed**: 10 m/s +- **Lift capacity\***: Up to 11 kg +- **Continuous lift capacity at 0.5 m extension\***: 5 kg +- **Drag capacity\* (on carpet)**: Up to 25 kg +- **Operating temp**: -20 C to 45 C +- **Ingress protection**: Water and dust resistant + +\* At 22 C. ## Gripper specifications -- **Depth**: 90 mm -- **Peak clamp force (at tip of opening)**: 130 N -- **Integrated sensors**: ToF, IMU, 4K RGB -- **Accessory port**: Gigabit Ethernet, 50W power, camera sync (PPS) -- **Max Camera FOV**: RGB: 60.2° x 46.4°; Depth: 55.9° x 44° + +- **Depth**: 90 mm +- **Peak clamp force (at tip of opening)**: 130 N +- **Integrated sensors**: ToF, IMU, 4K RGB +- **Accessory port**: Gigabit Ethernet, 50W power, camera sync (PPS) +- **Max Camera FOV**: RGB: 60.2° x 46.4°; Depth: 55.9° x 44° ## How big an object can the gripper grasp -The robot Arm is capable of holding any object it can fit the gripper jaws around. In general, this means that objects a person can pick up are also manageable by the robot. - + +The robot Arm is capable of holding any object it can fit the gripper jaws around. In general, this means that objects a person can pick up are also manageable by the robot. + ## Gripper safety -Continue to observe the recommended safety distance of 3 meters from the robot. Do not touch the Arm or gripper (or the robot) while the robot is active. - + +Continue to observe the recommended safety distance of 3 meters from the robot. Do not touch the Arm or gripper (or the robot) while the robot is active. + ## Pinch points -The gripper has a small clearance that offers some possibility to avoid complete pinching. However, pinching is always possible when grasping/holding objects. Limit human interaction with the gripper when in use. - -* Never introduce hands or fingers between an object to be grasped or being grasped and the gripper jaws. Keep hands away. -* Never attempt to open the gripper while the robot is powered on. Never try to interfere with grasping and carrying. Stay away from an active robot. + +The gripper has a small clearance that offers some possibility to avoid complete pinching. However, pinching is always possible when grasping/holding objects. Limit human interaction with the gripper when in use. + +- Never introduce hands or fingers between an object to be grasped or being grasped and the gripper jaws. Keep hands away. +- Never attempt to open the gripper while the robot is powered on. Never try to interfere with grasping and carrying. Stay away from an active robot. diff --git a/docs/concepts/autonomy/README.md b/docs/concepts/autonomy/README.md index c4c7360a1..ed953b640 100644 --- a/docs/concepts/autonomy/README.md +++ b/docs/concepts/autonomy/README.md @@ -16,21 +16,21 @@ The Autowalk feature is an implementation of the autonomous navigation API. Howe ## Contents -* [Autonomy Technical Summary](graphnav_tech_summary.md) -* [Autonomous navigation code examples](autonomous_navigation_code_examples.md) -* [Components of autonomous navigation](components_of_autonomous_navigation.md) -* [Docking](docking.md) -* [Typical autonomous navigation use case](typical_autonomous_navigation_use_case.md) -* [Autonomous navigation services](autonomous_navigation_services.md) -* [GraphNav service](graphnav_service.md) -* [GraphNav map structure](graphnav_map_structure.md) -* [GraphNav area callbacks](graphnav_area_callbacks.md) -* [Initialization](initialization.md) -* [Localization](localization.md) -* [GraphNav and robot locomotion](graphnav_and_robot_locomotion.md) -* [Missions service](missions_service.md) -* [Autowalk service](autowalk_service.md) -* [Network compute bridge](../network_compute_bridge.md) -* [AutoReturn service](auto_return.md) -* [Directed Exploration](directed_exploration.md) -* [GPS](gps.md) \ No newline at end of file +- [Autonomy Technical Summary](graphnav_tech_summary.md) +- [Autonomous navigation code examples](autonomous_navigation_code_examples.md) +- [Components of autonomous navigation](components_of_autonomous_navigation.md) +- [Docking](docking.md) +- [Typical autonomous navigation use case](typical_autonomous_navigation_use_case.md) +- [Autonomous navigation services](autonomous_navigation_services.md) +- [GraphNav service](graphnav_service.md) +- [GraphNav map structure](graphnav_map_structure.md) +- [GraphNav area callbacks](graphnav_area_callbacks.md) +- [Initialization](initialization.md) +- [Localization](localization.md) +- [GraphNav and robot locomotion](graphnav_and_robot_locomotion.md) +- [Missions service](missions_service.md) +- [Autowalk service](autowalk_service.md) +- [Network compute bridge](../network_compute_bridge.md) +- [AutoReturn service](auto_return.md) +- [Directed Exploration](directed_exploration.md) +- [GPS](gps.md) diff --git a/docs/concepts/autonomy/auto_return.md b/docs/concepts/autonomy/auto_return.md index 93493c286..7e53203d9 100644 --- a/docs/concepts/autonomy/auto_return.md +++ b/docs/concepts/autonomy/auto_return.md @@ -9,12 +9,15 @@ Development Kit License (20191101-BDSDK-SL). # AutoReturn Service ## What is AutoReturn? + AutoReturn is a service that will walk Spot back along a recently traversed path. It can be configured to happen automatically when Spot stops receiving commands from a user. ## Why would I want to use AutoReturn? + If you are piloting Spot through an area inaccessible to people and suddenly lose the communication link to Spot, the standard behavior is for Spot to sit down and power off. It may be valuable to instead tell Spot to automatically come back along the path it walked, hopefully putting Spot back into communication range. ## Why would I NOT want to use AutoReturn? + Depending on the environment Spot is in when AutoReturn activates, Spot may make things worse by trying to autonomously navigate. It’s very likely that AutoReturn will activate when there is poor or no communication to Spot, leaving it walking around unsupervised. It's also important to note the following: @@ -23,6 +26,7 @@ It's also important to note the following: - **AutoReturn will behave better in certain environments than others.** For example, if Spot becomes trapped while executing AutoReturn, Spot will continue to try and return, possibly until the battery drops below the operation threshold, at which point Spot will sit down and power off. If the environment around Spot changes and blocks Spot's previous path, Spot may end up in a worse location than before. ## How do I use AutoReturn? + AutoReturn must be explicitly enabled, and will only work for the user that is driving Spot when AutoReturn is enabled. For example, if user A enables AutoReturn and then user B takes control of Spot, AutoReturn will not automatically run. If user B wants to enable AutoReturn, they must do it themselves. ### Configuring AutoReturn @@ -50,12 +54,15 @@ but will only walk Spot up to or before the boundary in this example, omitting t Tablet users will find AutoReturn settings under the “Comms” section of the main menu. ## What happens when AutoReturn finishes? + It depends on whether communication to a user has been restored. If Spot does not hear from a user by the time AutoReturn finishes, Spot’s normal comms loss behavior will begin. ## Using AutoReturn Safely + **AutoReturn can potentially cause the robot to operate autonomously for unexpected distances. This can be dangerous for anyone nearby.** Tips for safe use of AutoReturn: + - Set the max displacement as low as possible to minimize the potential for the robot to venture any further than necessary. - Keep the E-stop Service timeout as low as possible to limit the amount of time the robot is moving without Operator control. This setting can be found under "Autowalk Replay Supervision" in the tablet, alongside the AutoReturn settings. diff --git a/docs/concepts/autonomy/autonomous_navigation_code_examples.md b/docs/concepts/autonomy/autonomous_navigation_code_examples.md index 609715047..4c63ba842 100644 --- a/docs/concepts/autonomy/autonomous_navigation_code_examples.md +++ b/docs/concepts/autonomy/autonomous_navigation_code_examples.md @@ -12,16 +12,16 @@ GraphNav provides place-based localization and locomotion services. Developers c The Spot SDK includes [python code examples](../../../python/examples/README.md) to help you get started with autonomous navigation. Refer to the following examples to learn about exercising the GraphNav API. -| Code example | Description | -| ------------ | --------------------------------------------- | -| [recording_command_line](../../../python/examples/graph_nav_command_line/README.md) | Demonstrates graphnav recording service requests to record, create, and download a map from the robot. | -| [graph_nav_command_line](../../../python/examples/graph_nav_command_line/README.md) | Demonstrates how to use GraphNav requests to: