In c++, how to traslate a point attached to another in 3D space according to the latest one's quaternion rotations

假如想象 提交于 2019-12-12 03:15:39

问题


I have to possitions, p1 and p2, p2 is attached to p1, not only to p1's position but also to it's rotation, so q1 is a quaternion which represents p1's rotation. If q1 rotates, then p1's position must also rotate around p1 accordingly. I only need to calculate p2's position, not it's rotation, I worked the rotation out already. So basically is a spaceship docked to a station, I need to move and rotate the station around with the ship docked to it. How do I do it?

the code i wrote for it works as long as the station is not rotated during the time of docking:

bool docked[100];
Quaternion quatTarget[100];
double distance_dock[100];

vector3 docking_position(int ship, int station)
{
    if (!docked[ship])
    {
        docked[ship] = true;
        distance_dock[ship] = distances(position[ship], position[station]);
        vector3 direcc = normalized(position[station] - position[ship]);
        quatTarget[ship] = vecToVecRotation(direcc, { 0, 0, 1 });
        QuaternionNormalize(&quatTarget[ship], &quatTarget[ship]);
    }

    Quaternion orientation = total_rotation[station] * quatTarget[ship];

    Matrix docking_place;

    MatrixRotationQuaternion(&docking_place, &orientation);

    vector3 axis_z = { docking_place(0, 2), docking_place(1, 2), docking_place(2, 2) };

    return position[station] + -axis_z * distance_dock[ship];
}

What I do here is take an orientation quaternion from the ship to the station at the time of docking and then traslate the ship "distance_dock" units along the negative z axis of the orientation, so the ship will always move accordingly, but somehow if I dock the ship when the station is already rotated then I get the initial docking position wrong, though it still rotates perfectly along with the station.


回答1:


If I understand you correctly, you have two objects that have a rigid transformation between them. The problem is that you want to calculate the pose (position + orientation) of one, given the pose of the other.

Let's say you have three frames; the Station frame "S", the Vehicle frame "V" and the Global frame "G" (I assume your graphics environment has a global 3D Cartesian frame). The transformation between frames S and V is fully known (translation and orientation) and constant, and is denoted S_p_SV (the position of the Vehicle w.r.t the Station, expressed in the Station frame) and SV_q (the quaternion orientation of the Vehicle, expressed in the Station frame).

This will be confusing if you have not had experience in rigid-body mechanics, in which case you should read some introductory notes/slideshows on "Rigid-Body Mechanics" which are plentiful on Google results.

I have written the expression in LATEX but unfortunately StackOverflow does not support it, so I have attached it as an image. The original LATEX can be found here. In my notation below, for example on the first line Sp_SV , is the position of the Vehicle w.r.t. the Station, expressed in the Station frame (of rotation). The prefixed superscript indicates the rotation frame. For the quaternion G_Sq for example, this represents the orientation of the Station frame from the Ground Frame.

In terms of implementing this in C++, I am unsure of what library you are using for Quaternions, but you will need the following functions:

  • Convert Euler to Quaternions - If you are going to manually specify the rotation SVq (rotation of Vehicle w.r.t Station)
  • Convert Quaternion to DCM - For the first method in the LATEX
  • Quaternion Multiply - For the second method in the LATEX
  • Quaternion Conjugate - For the second method in the LATEX


来源:https://stackoverflow.com/questions/27537160/in-c-how-to-traslate-a-point-attached-to-another-in-3d-space-according-to-the

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!