pub struct URDFChain<const N: usize> { /* private fields */ }Expand description
FK chain using exact URDF joint transforms.
Accumulation works directly on columns:
- Translation:
t += fx·c0 + fy·c1 + fz·c2 - Fixed rotation:
(c0,c1,c2) = (c0,c1,c2) * fixed_rot - Joint rotation: 2D rotation on the appropriate column pair
When fixed_rot is identity (RPY = 0, the common case), step 2 is
skipped entirely, making per-joint cost a single 2D column rotation
plus translation — cheaper than DH.
Implementations§
Source§impl<const N: usize> URDFChain<N>
impl<const N: usize> URDFChain<N>
Sourcepub const fn new(joints: [URDFJoint; N]) -> Result<Self, URDFBuildError>
pub const fn new(joints: [URDFJoint; N]) -> Result<Self, URDFBuildError>
Build a chain from exactly N actuated (revolute) joints. Returns
URDFBuildError::JointTypeMismatch if any entry is Fixed or
Prismatic. For a slice that mixes fixed joints in, use
URDFChain::from_urdf instead.
Sourcepub const fn from_urdf(joints: &[URDFJoint]) -> Result<Self, URDFBuildError>
pub const fn from_urdf(joints: &[URDFJoint]) -> Result<Self, URDFBuildError>
Build a chain from a flat URDF joint list (any mix of Fixed,
Revolute, and/or Prismatic). The list must describe a single
branch in parent→child order.
- Leading
Fixedjoints become the prefix (applied before joint 0). - Trailing
Fixedjoints become the suffix (applied after the last actuated joint). Fixedjoints sandwiched between actuated joints are folded into the origin of the next actuated joint so the kinematics are preserved exactly.- The number of
Revolutejoints must equalN.
Returns URDFBuildError::JointTypeMismatch if a Prismatic joint
appears (not handled by URDFChain itself — wrap the result in
PrismaticFK for a prismatic joint at the start or end), or
URDFBuildError::RevoluteCountMismatch if the revolute count
doesn’t match N.
Sourcepub const fn with_fixed_prefix(
self,
joints: &[URDFJoint],
) -> Result<Self, URDFBuildError>
pub const fn with_fixed_prefix( self, joints: &[URDFJoint], ) -> Result<Self, URDFBuildError>
Bake a sequence of URDF fixed-joint origins (parent→child order) into
the base side of the chain. The composed transform is applied before
joint 0, so every joint frame returned by FKChain::fk and every
position returned by FKChain::joint_axes_positions reflects the
fixed prefix.
Each joint in joints must be URDFJointType::Fixed. An empty slice
clears any previously set prefix. Returns
DekeError::URDFJointTypeMismatch if any joint is non-Fixed.
Sourcepub const fn with_fixed_suffix(
self,
joints: &[URDFJoint],
) -> Result<Self, URDFBuildError>
pub const fn with_fixed_suffix( self, joints: &[URDFJoint], ) -> Result<Self, URDFBuildError>
Bake a sequence of URDF fixed-joint origins (parent→child order) into
the tool side of the chain. The composed transform is applied after
the last actuated joint, so the final frame of FKChain::fk, the
result of FKChain::fk_end, and the p_ee returned by
FKChain::joint_axes_positions all include the fixed suffix.
Joint pivot positions and axes (positions[0..N], axes[0..N])
remain at the actuated joint origins — they are not shifted by the
suffix.
Each joint in joints must be URDFJointType::Fixed. An empty slice
clears any previously set suffix. Returns
DekeError::URDFJointTypeMismatch if any joint is non-Fixed.
Sourcepub const fn with_fixed_joints(
self,
prefix: &[URDFJoint],
suffix: &[URDFJoint],
) -> Result<Self, URDFBuildError>
pub const fn with_fixed_joints( self, prefix: &[URDFJoint], suffix: &[URDFJoint], ) -> Result<Self, URDFBuildError>
Convenience: set both a fixed-joint prefix and suffix in one call.
Trait Implementations§
Source§impl<const N: usize> FKChain<N> for URDFChain<N>
impl<const N: usize> FKChain<N> for URDFChain<N>
type Error = DekeError
fn fk(&self, q: &SRobotQ<N>) -> Result<[Affine3A; N], Self::Error>
fn fk_end(&self, q: &SRobotQ<N>) -> Result<Affine3A, Self::Error>
Source§fn joint_axes_positions(
&self,
q: &SRobotQ<N>,
) -> Result<([Vec3A; N], [Vec3A; N], Vec3A), Self::Error>
fn joint_axes_positions( &self, q: &SRobotQ<N>, ) -> Result<([Vec3A; N], [Vec3A; N], Vec3A), Self::Error>
q, plus the end-effector position.fn dof(&self) -> usize
Source§fn max_reach(&self) -> Result<f32, Self::Error>
fn max_reach(&self) -> Result<f32, Self::Error>
Source§fn jacobian(&self, q: &SRobotQ<N>) -> Result<[[f32; N]; 6], Self::Error>
fn jacobian(&self, q: &SRobotQ<N>) -> Result<[[f32; N]; 6], Self::Error>
q.
Rows 0–2: linear velocity, rows 3–5: angular velocity.