Configure Motion Constraints

You can constrain the motion of your machine using the motion service’s built-in constraint options. Constraints are passed as arguments to the Move method.

The following constraints are available:

Linear constraint

The linear constraint ({"motion_profile": "linear"}) forces the path taken by component_name to follow an exact linear path from the start to the goal. If the start and goal orientations are different, the orientation along the path will follow the quaternion Slerp (Spherical Linear Interpolation) of the orientation from start to goal. This has the following sub-options:

Parameter NameTypeDefaultDescription
line_tolerance_mmfloat0.1Max linear deviation from straight-line between start and goal, in mm.
orientation_tolerance_degsfloat2.0Allowable deviation from Slerp between start/goal orientations, in degrees.

Example usage:

# Move a gripper with a linear constraint
moved = await motion.move(
    component_name=my_gripper,
    destination=PoseInFrame(
        reference_frame="my_frame",
        pose=goal_pose),
    world_state=worldState,
    constraints={
        Constraints(
            linear_constraint=[LinearConstraint(line_tolerance_mm=0.2)])
    },
    extra={})

You can find more information in the Python SDK Docs.

// Move a gripper with a linear constraint
myConstraints := &servicepb.Constraints{LinearConstraint: []*servicepb.LinearConstraint{&servicepb.LinearConstraint{}}}

moved := motionService.Move(
    context.Background(),
    myGripperResourceName,
    NewPoseInFrame("myFrame", myGoalPose),
    worldState,
    myConstraints,
    nil
    )

You can find more information in the Go SDK Docs.

Orientation constraint

The orientation constraint ({"motion_profile": "orientation"}) places a restriction on the orientation change during a motion, such that the orientation during the motion does not deviate from the Slerp between start and goal by more than a set amount. This is similar to the “orient_tolerance” option in the linear profile, but without any path restrictions. If set to zero, a movement with identical starting and ending orientations will hold that orientation throughout the movement.

Parameter NameTypeDefaultDescription
orientation_tolerance_degsfloat2.0Allowable deviation from Slerp between start/goal orientations, in degrees.

Example usage:

# Move a gripper with an orientation constraint
moved = await motion.move(
    component_name=my_gripper,
    destination=PoseInFrame(
        reference_frame="my_frame",
        pose=goal_pose),
    world_state=worldState,
    constraints=Constraints(orientation_constraint=[OrientationConstraint()]),
    extra={})

You can find more information in the Python SDK Docs.

// Move a gripper with an orientation constraint
myConstraints := &servicepb.Constraints{OrientationConstraint: []*servicepb.OrientationConstraint{&servicepb.OrientationConstraint{}}}

moved := motionService.Move(
    context.Background(),
    myGripperResourceName,
    NewPoseInFrame("myFrame", myGoalPose),
    worldState,
    myConstraints,
    nil
    )

You can find more information in the Go SDK Docs.

Next steps

Constraints are used in the following tutorials:

Have questions, or want to meet other people working on robots? Join our Community Discord.

If you notice any issues with the documentation, feel free to file an issue or edit this file.