Skip to content
⚙ Development Guide > SDK > API > Data Structures

Motion Control Parameters (ArmControlOptions)#

ArmControlOptions is the section name used to correspond to the P6 navigation; the P7 SDK does not have a class with this name. P7 divides motion options among five mutable dataclasses: JointMoveOptions, CartesianMoveOptions, EEFMoveOptions, JointWaypointsMoveOptions, and CartesianWaypointsMoveOptions. The models validate some types and value ranges, but the current control mode and specific method determine whether a field is actually sent. Successfully creating an object does not mean that its parameter combination is suitable for the current robot arm.

Option Models#

Type Used By Main Field Groups
JointMoveOptions move_joint() Joint planning, Servo, MIT, and blocking fields
CartesianMoveOptions Single Cartesian PTP/LIN/CIRCLE and pose Servo Pose planning, OMPL, seed, collision, and blocking fields
EEFMoveOptions move_eef() EEF CSP/MIT effort, torque, gain, and blocking fields
JointWaypointsMoveOptions move_joint_waypoints() Per-segment joint planning, blending, seed, and sequence-completion fields
CartesianWaypointsMoveOptions move_end_pose_waypoints() Per-segment Cartesian planning, blending, seed, and sequence-completion fields

JointMoveOptions reads different fields in planning, Servo, and MIT modes. For example, planning uses the planning type, scaling, and sampling parameters; Servo ignores these planning fields; and MIT uses torque, kp, and kd. See API Reference and the individual motion-planning pages for the detailed matrix.

Checks Before Use#

  • Check floating-point scalars and vector elements with math.isfinite(); current range comparisons cannot reliably reject NaN.
  • Check the lengths of eff, seed, MIT, and EEF vectors before sending; model construction does not consistently check them.
  • A Literal type annotation is not complete runtime enum validation. Pass only the documented motion_type and planner names.
  • The number of nonempty waypoint segments must equal len(waypoints) - 1, and every segment must use the same sampling_time.
  • timeout_ms belongs to the motion method, not to the options, and does not equal actual trajectory execution time.
import math


def require_finite(values: list[float], name: str) -> None:
    if not all(math.isfinite(float(value)) for value in values):
        raise ValueError(f"{name} contains a non-finite value")

P7 Planning Names#

Single-joint planning uses "ptp" or "ompl". Single Cartesian PTP uses move_end_pose(); linear and circular motion use the dedicated LIN and CIRCLE methods respectively. Cartesian waypoint segments use "ptp", "lin", or "ompl". Select a specific OMPL planner through ompl_planner_type; do not put "rrt_connect" in motion_type.

Continue with PTP Point-to-Point Planning, LIN Linear Trajectory Planning, CIRC Circular Trajectory Planning, or Multi-Segment Trajectory Blending, as appropriate for the task.