pub struct HPChain<const N: usize> { /* 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>
impl<const N: usize> HPChain<N>
pub const fn new(joints: [HPJoint; 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: [[f64; N]; 3] — rows are (x, y, z) components across joints.
p: [[f64; 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.
Trait Implementations§
Source§impl<const N: usize> FKChain<N> for HPChain<N>
impl<const N: usize> FKChain<N> for HPChain<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 base_tf(&self) -> Affine3A
fn base_tf(&self) -> Affine3A
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<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.