в 5-осевом станке, я использую прямую кинематику, чтобы узнать ориентацию инструмента из положения оси C и A:
Вперед кинематика это просто в Qt:
QVector3D forward_kinematic(double C,double A){
QQuaternion aRotation=QQuaternion::fromAxisAndAngle(-1.0f, 0.0f, 0.0f, A);
QQuaternion cRotation=QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, C );
QQuaternion totalRotation = cRotation*aRotation ;
QVector3D rotated_tool_axis = totalRotation.rotatedVector(QVector3D(0,0,1));
return rotated_tool_axis;
}
Эта конфигурация осей очень проста, но может отличаться, например
aRotation=QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 1.0f, A);;
cRotation=QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, C );;
Мой вопрос: как я могу сделать обратную кинематику?
Например, от вектора ориентации инструмента к позиции C и оси
, например, для осей, параллельных XYZ, я могу использовать auto vect = quaternion.toEulerAngles ();Тогда углы Эйлера равны положению оси.
Например, для оси (1,0,0) и (0, -1,0) я использую
inline QVector2D forward_kinematic( QVector3D orientation){
auto quaternion=QQuaternion::rotationTo(QVector3D(0,0,1),orientation);
auto vect =quaternion.toEulerAngles();
return QVector2D(-vect.y(),vect.x());
}
Но я нене знаю, как это сделать с другими конфигурациями осей