49 const Matrix3d &rest_basis,
50 const Matrix3d &basis,
82 seg->m_parent =
nullptr;
192 lmin =
sin(lmin * 0.5);
193 lmax =
sin(lmax * 0.5);
200 else if (axis == 2) {
227 double theta = dq.norm();
230 Vector3d
w = dq * (1.0 / theta);
232 double sine =
sin(theta);
233 double cosine =
cos(theta);
234 double cosineInv = 1 - cosine;
236 double xsine =
w.x() * sine;
237 double ysine =
w.y() * sine;
238 double zsine =
w.z() * sine;
240 double xxcosine =
w.x() *
w.x() * cosineInv;
241 double xycosine =
w.x() *
w.y() * cosineInv;
242 double xzcosine =
w.x() *
w.z() * cosineInv;
243 double yycosine =
w.y() *
w.y() * cosineInv;
244 double yzcosine =
w.y() *
w.z() * cosineInv;
245 double zzcosine =
w.z() *
w.z() * cosineInv;
263 if (m_limit_y ==
false && m_limit_x ==
false && m_limit_z ==
false) {
279 double ax = a.x(), ay = a.y(), az = a.z();
284 if (a.y() > m_max_y) {
288 else if (a.y() < m_min_y) {
294 if (m_limit_x && m_limit_z) {
299 else if (m_limit_x) {
304 else if (ax > m_max[0]) {
309 else if (m_limit_z) {
314 else if (az > m_max[1]) {
399 if (m_limit ==
false) {
403 if (m_new_angle > m_max) {
404 delta[0] = m_max - m_angle;
406 else if (m_new_angle < m_min) {
407 delta[0] = m_min - m_angle;
414 m_new_angle = m_angle + delta[0];
427 m_angle = m_new_angle;
433 if (lmin > lmax || m_axis != axis) {
449 if (axis == m_axis) {
483 double theta = dq.norm();
486 Vector3d
w = dq * (1.0 / theta);
488 double sine =
sin(theta);
489 double cosine =
cos(theta);
490 double cosineInv = 1 - cosine;
492 double xsine =
w.x() * sine;
493 double zsine =
w.z() * sine;
495 double xxcosine =
w.x() *
w.x() * cosineInv;
496 double xzcosine =
w.x() *
w.z() * cosineInv;
497 double zzcosine =
w.z() *
w.z() * cosineInv;
517 if (m_limit_x ==
false && m_limit_z ==
false) {
522 double ax = 0, az = 0;
526 if (m_limit_x && m_limit_z) {
534 else if (m_limit_x) {
539 else if (ax > m_max[0]) {
544 else if (m_limit_z) {
549 else if (az > m_max[1]) {
590 lmin =
sin(lmin * 0.5);
591 lmax =
sin(lmax * 0.5);
594 double offset = 0.5 * (lmin + lmax);
605 else if (axis == 2) {
620 else if (axis == 2) {
655 v = Vector3d(m_cos_twist, 0, m_sin_twist);
658 v = Vector3d(-m_sin_twist, 0, m_cos_twist);
678 if (m_new_angle > m_max) {
679 delta[0] = m_max - m_angle;
683 else if (m_new_angle < m_min) {
684 delta[0] = m_min - m_angle;
695 if (m_new_twist > m_max_twist) {
696 delta[1] = m_max_twist - m_twist;
697 m_new_twist = m_max_twist;
700 else if (m_new_twist < m_min_twist) {
701 delta[1] = m_min_twist - m_twist;
702 m_new_twist = m_min_twist;
725 m_angle = m_new_angle;
726 m_twist = m_new_twist;
728 m_sin_twist =
sin(m_twist);
729 m_cos_twist =
cos(m_twist);
750 m_limit_twist =
true;
752 else if (axis == m_axis) {
761 if (axis == m_axis) {
764 else if (axis == 1) {
773 m_axis_enabled[0] = m_axis_enabled[1] = m_axis_enabled[2] =
false;
774 m_axis_enabled[axis1] =
true;
778 m_limit[0] = m_limit[1] = m_limit[2] =
false;
783 m_axis_enabled[0] = m_axis_enabled[1] = m_axis_enabled[2] =
false;
784 m_axis_enabled[axis1] =
true;
785 m_axis_enabled[axis2] =
true;
790 m_limit[0] = m_limit[1] = m_limit[2] =
false;
795 m_axis_enabled[0] = m_axis_enabled[1] = m_axis_enabled[2] =
true;
801 m_limit[0] = m_limit[1] = m_limit[2] =
false;
811 int dof_id =
m_DoF_id, dof = 0,
i, clamped =
false;
813 Vector3d dx(0.0, 0.0, 0.0);
815 for (
i = 0;
i < 3;
i++) {
816 if (!m_axis_enabled[
i]) {
827 if (m_new_translation[
i] > m_max[
i]) {
829 m_new_translation[
i] = m_max[
i];
830 clamped =
clamp[dof] =
true;
832 else if (m_new_translation[
i] < m_min[
i]) {
834 m_new_translation[
i] = m_min[
i];
835 clamped =
clamp[dof] =
true;
863 if (m_axis[
i] == axis) {
877 m_limit[axis] =
true;
886 for (
i = 0;
i < 3;
i++) {
891 m_new_translation *= scale;
static void RemoveTwist(Eigen::Matrix3d &R)
static Eigen::Matrix3d CreateMatrix(double xx, double xy, double xz, double yx, double yy, double yz, double zx, double zy, double zz)
static Eigen::Vector3d MatrixToAxisAngle(const Eigen::Matrix3d &R)
static double Clamp(const double x, const double min, const double max)
static Eigen::Matrix3d RotationMatrix(double sine, double cosine, int axis)
static Eigen::Matrix3d ComputeTwistMatrix(double tau)
static Eigen::Vector3d SphericalRangeParameters(const Eigen::Matrix3d &R)
static Eigen::Matrix3d ComputeSwingMatrix(double ax, double az)
static bool EllipseClamp(double &ax, double &az, const double *amin, const double *amax)
static bool FuzzyZero(double x)
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
IK_QElbowSegment(int axis)
void Lock(int dof, IK_QJacobian &jacobian, Vector3d &delta) override
void SetLimit(int axis, double lmin, double lmax) override
void SetWeight(int axis, double weight) override
void UpdateAngleApply() override
bool UpdateAngle(const IK_QJacobian &jacobian, Vector3d &delta, bool *clamp) override
Vector3d Axis(int dof) const override
void SetBasis(const Matrix3d &basis) override
void Lock(int dof_id, double delta)
double AngleUpdate(int dof_id) const
void UpdateAngleApply() override
IK_QRevoluteSegment(int axis)
Vector3d Axis(int dof) const override
void SetBasis(const Matrix3d &basis) override
void Lock(int dof, IK_QJacobian &jacobian, Vector3d &delta) override
bool UpdateAngle(const IK_QJacobian &jacobian, Vector3d &delta, bool *clamp) override
void SetWeight(int axis, double weight) override
void SetLimit(int axis, double lmin, double lmax) override
virtual void SetBasis(const Matrix3d &basis)
virtual EIGEN_MAKE_ALIGNED_OPERATOR_NEW ~IK_QSegment()
Vector3d m_orig_translation
void UpdateTransform(const Affine3d &global)
Affine3d m_global_transform
virtual void Scale(double scale)
void SetComposite(IK_QSegment *seg)
Matrix3d BasisChange() const
IK_QSegment(int num_DoF, bool translational)
void PrependBasis(const Matrix3d &mat)
void SetParent(IK_QSegment *parent)
IK_QSegment * m_composite
void RemoveChild(IK_QSegment *child)
Vector3d TranslationChange() const
void SetTransform(const Vector3d &start, const Matrix3d &rest_basis, const Matrix3d &basis, const double length)
void SetWeight(int axis, double weight) override
Vector3d Axis(int dof) const override
bool UpdateAngle(const IK_QJacobian &jacobian, Vector3d &delta, bool *clamp) override
void UpdateAngleApply() override
void Lock(int dof, IK_QJacobian &jacobian, Vector3d &delta) override
void SetLimit(int axis, double lmin, double lmax) override
bool UpdateAngle(const IK_QJacobian &jacobian, Vector3d &delta, bool *clamp) override
void UpdateAngleApply() override
void SetLimit(int axis, double lmin, double lmax) override
Vector3d Axis(int dof) const override
void Lock(int dof, IK_QJacobian &jacobian, Vector3d &delta) override
void SetWeight(int axis, double weight) override
void SetBasis(const Matrix3d &basis) override
void SetWeight(int axis, double weight) override
void SetLimit(int axis, double lmin, double lmax) override
void UpdateAngleApply() override
void Scale(double scale) override
Vector3d Axis(int dof) const override
bool UpdateAngle(const IK_QJacobian &jacobian, Vector3d &delta, bool *clamp) override
void Lock(int, IK_QJacobian &, Vector3d &) override
constexpr T clamp(T, U, U) RET
float length(VecOp< float, D >) RET
static double ComputeTwist(const KDL::Rotation &R)
static double EulerAngleFromMatrix(const KDL::Rotation &R, int axis)