pub struct HPChain<const N: usize, F: FKScalar = f32> { /* private fields */ }Expand description
Precomputed Hayati-Paul chain with SoA layout.
Convention: T_i = Rz(θ) · Rx(α) · Ry(β) · Tx(a) · Tz(d)
HP adds a β rotation about Y, which makes it numerically stable for
nearly-parallel consecutive joint axes where standard DH is singular.
Implementations§
Source§impl<const N: usize> HPChain<N, f32>
impl<const N: usize> HPChain<N, f32>
pub const fn new(joints: [HPJoint<f32>; N]) -> Self
Sourcepub const fn from_hp(h: &[[f32; N]; 3], p: &[[f32; N]; 3]) -> Self
pub const fn from_hp(h: &[[f32; N]; 3], p: &[[f32; N]; 3]) -> Self
Construct from the row-major HP_H and HP_P const arrays emitted by
the workcell macro.
h: [[f32; N]; 3] — rows are (x, y, z) components across joints.
p: [[f32; N]; 3] — rows are (x, y, z) components across points.
Each h[_][i] is joint i’s axis in the base frame at zero config.
p[_][0] is the base-to-joint-0 offset; p[_][i] for 1..N is the
offset from joint i-1’s origin to joint i’s origin. The tool
offset from joint N-1 to the flange is not part of this input
because HPChain has no end-effector slot — wrap the result in a
TransformedFK if a tool offset is required.
theta_offset is set to zero for every joint: at zero config each
local x-axis is pinned to Rx(α) · Ry(β) · [1, 0, 0] expressed in the
parent frame.
Source§impl<const N: usize> HPChain<N, f64>
impl<const N: usize> HPChain<N, f64>
Sourcepub const fn new_f64(joints: [HPJoint<f64>; N]) -> Self
pub const fn new_f64(joints: [HPJoint<f64>; N]) -> Self
const-evaluable f64 constructor — analogue of HPChain::<N, f32>::new.
Sourcepub const fn from_hp_f64(h: &[[f64; N]; 3], p: &[[f64; N]; 3]) -> Self
pub const fn from_hp_f64(h: &[[f64; N]; 3], p: &[[f64; N]; 3]) -> Self
const-evaluable f64 analogue of HPChain::from_hp.
Source§impl<const N: usize, F: FKScalar> HPChain<N, F>
impl<const N: usize, F: FKScalar> HPChain<N, F>
Sourcepub fn from_joints(joints: [HPJoint<F>; N]) -> Self
pub fn from_joints(joints: [HPJoint<F>; N]) -> Self
Generic runtime constructor. For f32 the const-evaluable
HPChain::new is preferred; this exists so HPChain<N, f64> (and
any other future scalar) is usable.
Trait Implementations§
Source§impl<const N: usize, F: FKScalar> FKChain<N, F> for HPChain<N, F>
impl<const N: usize, F: FKScalar> FKChain<N, F> for HPChain<N, F>
type Error = DekeError
fn fk(&self, q: &SRobotQ<N, F>) -> Result<[F::AAffine3; N], Self::Error>
fn fk_end(&self, q: &SRobotQ<N, F>) -> Result<F::AAffine3, Self::Error>
Source§fn all_fk(
&self,
q: &SRobotQ<N, F>,
) -> Result<(F::AAffine3, [F::AAffine3; N], F::AAffine3), Self::Error>
fn all_fk( &self, q: &SRobotQ<N, F>, ) -> Result<(F::AAffine3, [F::AAffine3; N], F::AAffine3), Self::Error>
Source§fn joint_axes_positions(
&self,
q: &SRobotQ<N, F>,
) -> Result<([F::AVec3; N], [F::AVec3; N], F::AVec3), Self::Error>
fn joint_axes_positions( &self, q: &SRobotQ<N, F>, ) -> Result<([F::AVec3; N], [F::AVec3; N], F::AVec3), Self::Error>
q, plus the end-effector position.fn dof(&self) -> usize
Source§fn base_tf(&self) -> F::AAffine3
fn base_tf(&self) -> F::AAffine3
TransformedFK with a prefix set, or URDFChain
with fixed leading joints baked in) override this so downstream
consumers (collision validators, visualizers) can place the static
base body at the correct pose.Source§fn max_reach(&self) -> Result<F, Self::Error>
fn max_reach(&self) -> Result<F, Self::Error>
Source§fn jacobian(&self, q: &SRobotQ<N, F>) -> Result<[[F; N]; 6], Self::Error>
fn jacobian(&self, q: &SRobotQ<N, F>) -> Result<[[F; N]; 6], Self::Error>
q.
Rows 0–2: linear velocity, rows 3–5: angular velocity.