Skip to content

tesseract_robotics.tesseract_motion_planners_simple

Simple joint-space interpolation planner.

Overview

The Simple planner performs linear interpolation in joint space. No collision checking - use only when path is known to be safe.

Python
from tesseract_robotics.tesseract_motion_planners_simple import (
    SimpleMotionPlanner,
    generateInterpolatedProgram,
)

SimpleMotionPlanner

Python
from tesseract_robotics.tesseract_motion_planners_simple import SimpleMotionPlanner
from tesseract_robotics.tesseract_motion_planners import PlannerRequest

planner = SimpleMotionPlanner()

request = PlannerRequest()
request.env = env
request.instructions = program
request.profiles = profiles

response = planner.solve(request)

Utility Functions

generateInterpolatedProgram

Interpolate a program to add intermediate waypoints.

Python
from tesseract_robotics.tesseract_motion_planners_simple import generateInterpolatedProgram

# Add waypoints between existing ones
interpolated = generateInterpolatedProgram(
    program,
    env,
    profiles,
    max_step=0.1  # max joint step between waypoints
)

Interpolation

The planner's interpolation functions need no planner state:

Python
import numpy as np
from tesseract_robotics.tesseract_common import Isometry3d
from tesseract_robotics.tesseract_motion_planners_simple import interpolate

poses = interpolate(Isometry3d.Identity(), target_pose, 10)   # VectorIsometry3d, 11 poses
states = interpolate(np.zeros(6), q_goal, 10)                  # 6 x 11 array, one state per column

interpolate_waypoint(start, stop, steps) does the same for two WaypointPolys. getInterpolatedInstructions(joint_names, states, base_instruction) (and the overload that also takes poses) turns the columns after the first into child move instructions of base_instruction, ending with base_instruction itself.

Profiles

The seven move profiles (SimplePlannerFixedSize*MoveProfile, SimplePlannerLVS*MoveProfile) compare by value (==) and are unhashable. All of them register under the key of their base, SimplePlannerMoveProfile.createKey().

generate runs a profile on one segment without a planner: it returns the move instructions SimpleMotionPlanner.solve would emit for base_instruction.

Python
from tesseract_robotics.tesseract_command_language import InstructionPoly
from tesseract_robotics.tesseract_motion_planners_simple import SimplePlannerLVSMoveProfile

profile = SimplePlannerLVSMoveProfile()
moves = profile.generate(start, start, goal, InstructionPoly(), env, manip_info)

from_yaml builds a profile from the same YAML keys the C++ profile reads:

Python
profile = SimplePlannerLVSMoveProfile.from_yaml("min_steps: 4\nmax_steps: 20")

Malformed YAML raises ValueError; a value of the wrong type raises the profile's RuntimeError.

Use Cases

  • Initial seeding: Generate dense trajectory for TrajOpt
  • Safe paths: When you know the path is collision-free
  • Testing: Quick trajectory generation for debugging
  • Time parameterization input: Dense trajectory for velocity planning

Example

Python
from tesseract_robotics.tesseract_motion_planners_simple import SimpleMotionPlanner
from tesseract_robotics.tesseract_motion_planners import PlannerRequest
from tesseract_robotics.tesseract_command_language import ProfileDictionary

# Simple planner needs minimal setup
profiles = ProfileDictionary()

request = PlannerRequest()
request.env = env
request.instructions = program
request.profiles = profiles

planner = SimpleMotionPlanner()
response = planner.solve(request)

if response.successful:
    # Result is linearly interpolated joint trajectory
    trajectory = response.results

Limitations

  • No collision checking: Path may collide with obstacles
  • Joint-space only: Cartesian interpolation not supported
  • No optimization: Just linear interpolation

Tips

  1. Use as preprocessing for optimization-based planners
  2. Verify collision after planning with simple planner
  3. Good for short motions where collision is unlikely

Auto-generated API Reference

tesseract_motion_planners_simple Python bindings

SimplePlannerEmptyGenerateError

Bases: ValueError

A Python SimplePlannerMoveProfile.generate returned an empty list.

SimplePlannerNullInstructionError

Bases: ValueError

A Python SimplePlannerMoveProfile.generate returned a null MoveInstructionPoly.

SimplePlannerGenerateMismatchError

Bases: ValueError

A Python generate's last instruction differs from base_instruction in a field upstream requires unchanged.

SimplePlannerProfileReturnTypeError

Bases: TypeError

A Python SimplePlannerMoveProfile.generate returned the wrong type.

SimplePlannerPureVirtualCallError

Bases: NotImplementedError

generate is pure virtual: super().generate(...), or a Python profile without it.

SimpleMotionPlanner

Bases: MotionPlanner

__init__

Python
__init__(name: str = 'SIMPLE') -> None

solve

Python
solve(request: PlannerRequest) -> tesseract_robotics.tesseract_motion_planners._tesseract_motion_planners.PlannerResponse

Plan request. An exception a Python profile's generate raises propagates from here.

JointGroupInstructionInfo

A move instruction resolved against a joint group (no inverse kinematics)

instruction property

Python
instruction: MoveInstructionPoly

The move instruction this info describes (not a copy)

manip property

Python
manip: JointGroup

working_frame property writable

Python
working_frame: str

working_frame_transform property writable

Python
working_frame_transform: Isometry3d

tcp_frame property writable

Python
tcp_frame: str

tcp_offset property writable

Python
tcp_offset: Isometry3d

has_cartesian_waypoint property writable

Python
has_cartesian_waypoint: bool

__init__

Python
__init__(plan_instruction: MoveInstructionPoly, env: Environment, manip_info: ManipulatorInfo) -> None

calcCartesianPose

Python
calcCartesianPose(jp: Annotated[NDArray[float64], dict(shape=(None,), order=C)] | Sequence[float], in_world: bool = True) -> tesseract_robotics.tesseract_common._tesseract_common.Isometry3d

The tool pose at joint state jp, in world or in the working frame.

extractCartesianPose

Python
extractCartesianPose(in_world: bool = True) -> tesseract_robotics.tesseract_common._tesseract_common.Isometry3d

The Cartesian waypoint's pose, in world or in the working frame.

extractJointPosition

Python
extractJointPosition() -> Annotated[NDArray[numpy.float64], dict(shape=(None,), order=C)]

The joint or state waypoint's position.

KinematicGroupInstructionInfo

A move instruction resolved against a kinematic group (with inverse kinematics)

instruction property

Python
instruction: MoveInstructionPoly

The move instruction this info describes (not a copy)

manip property

Python
manip: KinematicGroup

working_frame property writable

Python
working_frame: str

working_frame_transform property writable

Python
working_frame_transform: Isometry3d

tcp_frame property writable

Python
tcp_frame: str

tcp_offset property writable

Python
tcp_offset: Isometry3d

has_cartesian_waypoint property writable

Python
has_cartesian_waypoint: bool

__init__

Python
__init__(plan_instruction: MoveInstructionPoly, env: Environment, manip_info: ManipulatorInfo) -> None

calcCartesianPose

Python
calcCartesianPose(jp: Annotated[NDArray[float64], dict(shape=(None,), order=C)] | Sequence[float], in_world: bool = True) -> tesseract_robotics.tesseract_common._tesseract_common.Isometry3d

The tool pose at joint state jp, in world or in the working frame.

extractCartesianPose

Python
extractCartesianPose(in_world: bool = True) -> tesseract_robotics.tesseract_common._tesseract_common.Isometry3d

The Cartesian waypoint's pose, in world or in the working frame.

extractJointPosition

Python
extractJointPosition() -> Annotated[NDArray[numpy.float64], dict(shape=(None,), order=C)]

The joint or state waypoint's position.

SimplePlannerMoveProfile

Bases: Profile

__init__

Python
__init__() -> None

createKey staticmethod

Python
createKey() -> int

The key every simple-planner move profile registers under.

generate

Python
generate(prev_instruction: MoveInstructionPoly, prev_seed: MoveInstructionPoly, base_instruction: MoveInstructionPoly, next_instruction: InstructionPoly, env: Environment, global_manip_info: ManipulatorInfo) -> list[tesseract_robotics.tesseract_command_language._tesseract_command_language.MoveInstructionPoly]

The move instructions the simple planner emits for base_instruction, ending with it. next_instruction is a null InstructionPoly for the last move.

SimplePlannerCompositeProfile

Bases: Profile

__init__

Python
__init__() -> None

createKey staticmethod

Python
createKey() -> int

The key this profile type registers under in a ProfileDictionary.

SimplePlannerFixedSizeMoveProfile

Bases: SimplePlannerMoveProfile

freespace_steps property writable

Python
freespace_steps: int

linear_steps property writable

Python
linear_steps: int

__hash__ class-attribute instance-attribute

Python
__hash__: None = None

__init__

Python
__init__(freespace_steps: int = 10, linear_steps: int = 10) -> None

__eq__

Python
__eq__(arg: SimplePlannerFixedSizeMoveProfile) -> bool

__ne__

Python
__ne__(arg: SimplePlannerFixedSizeMoveProfile) -> bool

from_yaml staticmethod

Python
from_yaml(config: str) -> SimplePlannerFixedSizeMoveProfile

Construct the profile from its YAML config text; malformed YAML raises ValueError.

__init_subclass__ classmethod

Python
__init_subclass__(**kwargs: object) -> None

SimplePlannerFixedSizeAssignMoveProfile

Bases: SimplePlannerMoveProfile

freespace_steps property writable

Python
freespace_steps: int

linear_steps property writable

Python
linear_steps: int

__hash__ class-attribute instance-attribute

Python
__hash__: None = None

__init__

Python
__init__(freespace_steps: int = 10, linear_steps: int = 10) -> None

__eq__

Python
__eq__(arg: SimplePlannerFixedSizeAssignMoveProfile) -> bool

__ne__

Python
__ne__(arg: SimplePlannerFixedSizeAssignMoveProfile) -> bool

from_yaml staticmethod

Python
from_yaml(config: str) -> SimplePlannerFixedSizeAssignMoveProfile

Construct the profile from its YAML config text; malformed YAML raises ValueError.

__init_subclass__ classmethod

Python
__init_subclass__(**kwargs: object) -> None

SimplePlannerFixedSizeAssignNoIKMoveProfile

Bases: SimplePlannerMoveProfile

freespace_steps property writable

Python
freespace_steps: int

linear_steps property writable

Python
linear_steps: int

__hash__ class-attribute instance-attribute

Python
__hash__: None = None

__init__

Python
__init__(freespace_steps: int = 10, linear_steps: int = 10) -> None

__eq__

Python
__eq__(arg: SimplePlannerFixedSizeAssignNoIKMoveProfile) -> bool

__ne__

Python
__ne__(arg: SimplePlannerFixedSizeAssignNoIKMoveProfile) -> bool

from_yaml staticmethod

Python
from_yaml(config: str) -> SimplePlannerFixedSizeAssignNoIKMoveProfile

Construct the profile from its YAML config text; malformed YAML raises ValueError.

__init_subclass__ classmethod

Python
__init_subclass__(**kwargs: object) -> None

SimplePlannerLVSMoveProfile

Bases: SimplePlannerMoveProfile

state_longest_valid_segment_length property writable

Python
state_longest_valid_segment_length: float

translation_longest_valid_segment_length property writable

Python
translation_longest_valid_segment_length: float

rotation_longest_valid_segment_length property writable

Python
rotation_longest_valid_segment_length: float

min_steps property writable

Python
min_steps: int

max_steps property writable

Python
max_steps: int

__hash__ class-attribute instance-attribute

Python
__hash__: None = None

__init__

Python
__init__(state_longest_valid_segment_length: float = 0.08726646259971647, translation_longest_valid_segment_length: float = 0.1, rotation_longest_valid_segment_length: float = 0.08726646259971647, min_steps: int = 1, max_steps: int = 2147483647) -> None

__eq__

Python
__eq__(arg: SimplePlannerLVSMoveProfile) -> bool

__ne__

Python
__ne__(arg: SimplePlannerLVSMoveProfile) -> bool

from_yaml staticmethod

Python
from_yaml(config: str) -> SimplePlannerLVSMoveProfile

Construct the profile from its YAML config text; malformed YAML raises ValueError.

__init_subclass__ classmethod

Python
__init_subclass__(**kwargs: object) -> None

SimplePlannerLVSNoIKMoveProfile

Bases: SimplePlannerMoveProfile

state_longest_valid_segment_length property writable

Python
state_longest_valid_segment_length: float

translation_longest_valid_segment_length property writable

Python
translation_longest_valid_segment_length: float

rotation_longest_valid_segment_length property writable

Python
rotation_longest_valid_segment_length: float

min_steps property writable

Python
min_steps: int

max_steps property writable

Python
max_steps: int

__hash__ class-attribute instance-attribute

Python
__hash__: None = None

__init__

Python
__init__(state_longest_valid_segment_length: float = 0.08726646259971647, translation_longest_valid_segment_length: float = 0.1, rotation_longest_valid_segment_length: float = 0.08726646259971647, min_steps: int = 1, max_steps: int = 2147483647) -> None

__eq__

Python
__eq__(arg: SimplePlannerLVSNoIKMoveProfile) -> bool

__ne__

Python
__ne__(arg: SimplePlannerLVSNoIKMoveProfile) -> bool

from_yaml staticmethod

Python
from_yaml(config: str) -> SimplePlannerLVSNoIKMoveProfile

Construct the profile from its YAML config text; malformed YAML raises ValueError.

__init_subclass__ classmethod

Python
__init_subclass__(**kwargs: object) -> None

SimplePlannerLVSAssignMoveProfile

Bases: SimplePlannerMoveProfile

state_longest_valid_segment_length property writable

Python
state_longest_valid_segment_length: float

translation_longest_valid_segment_length property writable

Python
translation_longest_valid_segment_length: float

rotation_longest_valid_segment_length property writable

Python
rotation_longest_valid_segment_length: float

min_steps property writable

Python
min_steps: int

max_steps property writable

Python
max_steps: int

__hash__ class-attribute instance-attribute

Python
__hash__: None = None

__init__

Python
__init__(state_longest_valid_segment_length: float = 0.08726646259971647, translation_longest_valid_segment_length: float = 0.1, rotation_longest_valid_segment_length: float = 0.08726646259971647, min_steps: int = 1, max_steps: int = 2147483647) -> None

__eq__

Python
__eq__(arg: SimplePlannerLVSAssignMoveProfile) -> bool

__ne__

Python
__ne__(arg: SimplePlannerLVSAssignMoveProfile) -> bool

from_yaml staticmethod

Python
from_yaml(config: str) -> SimplePlannerLVSAssignMoveProfile

Construct the profile from its YAML config text; malformed YAML raises ValueError.

__init_subclass__ classmethod

Python
__init_subclass__(**kwargs: object) -> None

SimplePlannerLVSAssignNoIKMoveProfile

Bases: SimplePlannerMoveProfile

state_longest_valid_segment_length property writable

Python
state_longest_valid_segment_length: float

translation_longest_valid_segment_length property writable

Python
translation_longest_valid_segment_length: float

rotation_longest_valid_segment_length property writable

Python
rotation_longest_valid_segment_length: float

min_steps property writable

Python
min_steps: int

max_steps property writable

Python
max_steps: int

__hash__ class-attribute instance-attribute

Python
__hash__: None = None

__init__

Python
__init__(state_longest_valid_segment_length: float = 0.08726646259971647, translation_longest_valid_segment_length: float = 0.1, rotation_longest_valid_segment_length: float = 0.08726646259971647, min_steps: int = 1, max_steps: int = 2147483647) -> None

__eq__

Python
__eq__(arg: SimplePlannerLVSAssignNoIKMoveProfile) -> bool

__ne__

Python
__ne__(arg: SimplePlannerLVSAssignNoIKMoveProfile) -> bool

from_yaml staticmethod

Python
from_yaml(config: str) -> SimplePlannerLVSAssignNoIKMoveProfile

Construct the profile from its YAML config text; malformed YAML raises ValueError.

__init_subclass__ classmethod

Python
__init_subclass__(**kwargs: object) -> None

generateInterpolatedProgram

Python
generateInterpolatedProgram(instructions: CompositeInstruction, env: Environment, state_longest_valid_segment_length: float = 0.08726646259971647, translation_longest_valid_segment_length: float = 0.15, rotation_longest_valid_segment_length: float = 0.08726646259971647, min_steps: int = 1) -> tesseract_robotics.tesseract_command_language._tesseract_command_language.CompositeInstruction

Generate an interpolated program from a composite instruction

interpolate_waypoint

Python
interpolate_waypoint(start: WaypointPoly, stop: WaypointPoly, steps: int) -> list[tesseract_robotics.tesseract_command_language._tesseract_command_language.WaypointPoly]

Waypoints from start to stop: steps + 1 of them, of the start's type.