rs_opw_kinematics::parallelogram

Struct Parallelogram

Source
pub struct Parallelogram {
    pub robot: Arc<dyn Kinematics>,
    pub scaling: f64,
    pub driven: usize,
    pub coupled: usize,
}
Expand description

Parallelogram Mechanism: The parallelogram mechanism introduces a geometric dependency between two specific joints, typically to maintain the orientation of the end-effector as the robot arm moves. This is useful in tasks that require a constant tool orientation, such as welding or handling objects, ensuring that the tool or end-effector remains level.

The mechanism links two joints, referred to as joints[driven] and joints[coupled]. The movement of the driven joint influences the coupled joint, maintaining the orientation of the end-effector during motion. The scaling factor determines the proportional influence of the driven joint on the coupled joint.

  • Forward Kinematics: The coupled joint (joints[coupled]) is adjusted based on the driven joint: joints[coupled]' = joints[coupled] - scaling * joints[driven]. This adjustment maintains the correct alignment of the end-effector.
  • Inverse Kinematics: The dependency is reversed, adding the influence of the driven joint to the coupled joint: joints[coupled]' = joints[coupled] + scaling * joints[driven]. This ensures accurate calculation of joint angles to achieve the desired pose and orientation.

The Parallelogram structure automatically adjusts joints[coupled] based on joints[driven] using a scaling factor to account for the parallelogram mechanism.

§Fields:

  • robot: The underlying robot’s kinematics model used to compute forward and inverse kinematics.
  • scaling: The factor that determines how much influence joints[driven] has on joints[coupled].
  • driven: The index of the driven joint in the parallelogram mechanism (typically the primary joint).
  • coupled: The index of the coupled joint in the parallelogram mechanism (the secondary joint influenced by the driven joint).

§Example:

use std::sync::Arc;
// As J1 = 0, J2 = 1 and J3 = 2, so it is more clear with J-constants:
use rs_opw_kinematics::kinematic_traits::{J2, J3};

use rs_opw_kinematics::kinematics_impl::OPWKinematics;
use rs_opw_kinematics::parallelogram::Parallelogram;
use rs_opw_kinematics::parameters::opw_kinematics::Parameters;

// Assuming a robot that implements the Kinematics trait
let robot_kinematics = Arc::new(OPWKinematics::new(Parameters::irb2400_10()));

// Create the Parallelogram structure with a scaling factor of 0.5,
// where joints[1] is the driven joint and joints[2] is the coupled joint.
let parallelogram = Parallelogram {
    robot: robot_kinematics,
    scaling: 1.0, // typically there is 1-to-1 influence between driven and coupled joints
    driven: J2,   // Joint 2 is most often the driven joint. 
    coupled: J3,  // Joint 3 is most often the coupled joint
};

As Parallelogram accepts and itself implements Kinematics, it is possible to chain multiple parallelograms if the robot has more than one.

Fields§

§robot: Arc<dyn Kinematics>

The underlying robot’s kinematics used for forward and inverse kinematics calculations.

§scaling: f64

The scaling factor that determines the proportional influence of joints[driven] on joints[coupled].

§driven: usize

The index of the driven joint in the parallelogram mechanism (joints[driven]).

§coupled: usize

The index of the coupled joint in the parallelogram mechanism (joints[coupled]).

Trait Implementations§

Source§

impl Clone for Parallelogram

Source§

fn clone(&self) -> Parallelogram

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Kinematics for Parallelogram

Source§

fn inverse(&self, tcp: &Pose) -> Solutions

Find inverse kinematics (joint position) for this pose This function is faster but does not handle the singularity J5 = 0 well. All returned solutions are cross-checked with forward kinematics and valid.
Source§

fn inverse_5dof(&self, tcp: &Pose, j6: f64) -> Solutions

Calculates the inverse kinematics for a robot while ignoring the rotation around joint 6. The position of the tool center point remains precise, but the rotation is approximate (rotation around the tool axis is ignored). The return value for joint 6 is set according to the provided parameter. This method is significantly faster
Source§

fn inverse_continuing_5dof(&self, tcp: &Pose, previous: &Joints) -> Solutions

Calculates the inverse kinematics for a robot while ignoring the rotation around joint 6. The position of the tool center point remains precise, but the rotation is approximate (rotation around the tool axis is ignored). The return value for joint 6 is set based on the previous joint values. This method is significantly faster
Source§

fn inverse_continuing(&self, tcp: &Pose, previous: &Joints) -> Solutions

Find inverse kinematics (joint position) for this pose This function handles the singularity J5 = 0 by keeping the previous values the values J4 and J6 from the previous solution Use CONSTRAINT_CENTERED as previous if there is no previous position but we prefer to be as close to the center of constraints (or zeroes if not set) as possible.
Source§

fn forward(&self, qs: &Joints) -> Pose

Find forward kinematics (pose from joint positions). For 5 DOF robot, the rotation of the joint 6 should normally be 0.0 but some other value can be given, meaning the tool is mounted with fixed rotation offset.
Source§

fn forward_with_joint_poses(&self, joints: &Joints) -> [Pose; 6]

Computes the forward kinematics for a 6-DOF robotic arm and returns an array of poses representing the position and orientation of each joint, including the final end-effector. Read more
Source§

fn kinematic_singularity(&self, qs: &Joints) -> Option<Singularity>

Detect the singularity. Returns either A type singlularity or None if no singularity detected.
Source§

fn constraints(&self) -> &Option<Constraints>

Returns constraints under what the solver is operating. Constraints are remembered here and can be used for generating random joint angles needed by RRT, or say providing limits of sliders in GUI.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T, U> AsBindGroupShaderType<U> for T
where U: ShaderType, &'a T: for<'a> Into<U>,

Source§

fn as_bind_group_shader_type(&self, _images: &RenderAssets<Image>) -> U

Return the T ShaderType for self. When used in AsBindGroup derives, it is safe to assume that all images in self exist.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> TypeData for T
where T: 'static + Send + Sync + Clone,

Source§

impl<T> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> MaybeSendSync for T

Source§

impl<T> SerializableAny for T
where T: 'static + Any + Clone + for<'a> Send + Sync,

Source§

impl<T> Settings for T
where T: 'static + Send + Sync,

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSync for T
where T: Sync,