我正在尝试模拟连接到飞机底面的相机。有时,相机设置为锁定在给定位置(纬度,经度和海拔)。使用http://www.cosinekitty.com/compass.html的计算结果,我能够获得从飞机到选定点的方位角(正=东,负=西)和仰角(正=上,负=下)。
不幸的是,我的相机软件需要相对于飞机的偏航,俯仰和横滚,并且http://www.cosinekitty.com/compass.html的计算结果是绝对的(正北),因此我无法将相机对准飞机转弯时的位置和/或俯仰。
一些可用的飞机数据可能是有用的:纬度,经度,高度,速度矢量x,y,z,偏航,俯仰和横滚。
没有陀螺仪,因此飞机倾斜时,地平线将成一定角度。
我的代码将Eigen和Boost库用于矩阵和四分之一元,但是如果有帮助解决此问题,我愿意尝试任何尝试。
我已经在这个问题上研究了两个星期,并且开始忘记我尝试过的所有不同方法。首先,我尝试着理解Martin John Baker的网站(https://www.euclideanspace.com/maths/geometry/rotations/euler/index.htm)并创建自己的旋转矩阵。最近,我尝试将飞机的偏航角,俯仰角和侧倾角转换为四元数(Euler to Quaternion / Quaternion to Euler using Eigen),取其倒数,然后将其乘以计算出的摄像机偏航角(方位角),俯仰角(仰角)和滚(0.0)。
Eigen::Quaterniond qOwnship, qPoint, qResult;
Eigen::Vector3d euler;
// Initialize ownship
double ownshipRoll = convertTo(ownship->getRoll(), Angle::radian);
double ownshipPitch = convertTo(ownship->getPitch(), Angle::radian);
double ownshipYaw = convertTo(ownship->getHeading(), Angle::radian);
// Initialize point
double pointRoll = 0.0;
double pointPitch = convertTo(calculatedAltitudeAngle, Angle::radian);
double pointYaw = convertTo(calculatedAzimuth, Angle::radian);
// Convert ownship to quaternion
qOwnship = Eigen::AngleAxis<double>(ownshipRoll, Eigen::Vector3d::UnitX()) * Eigen::AngleAxis<double>(ownshipPitch, Eigen::Vector3d::UnitY()) * Eigen::AngleAxis<double>(ownshipYaw, Eigen::Vector3d::UnitZ());
// Convert point to quaternion
qPoint = Eigen::AngleAxis<double>(pointRoll, Eigen::Vector3d::UnitX()) * Eigen::AngleAxis<double>(pointPitch, Eigen::Vector3d::UnitY()) * Eigen::AngleAxis<double>(pointYaw, Eigen::Vector3d::UnitZ());
// Calculate result
qResult = qPoint * qOwnship.inverse();
// Convert quaternion to yaw, pitch, and roll
euler = qResult.toRotationMatrix().eulerAngles(0, 1, 2);
printf("Result Euler roll: %f, pitch: %f, yaw: %f\n", euler[0], euler[1], euler[2]);
我希望输出是照相机相对于飞机的偏航,俯仰和横滚,以便它连续指向所需的纬度,经度和高度。
输出可以是将计算出的方位角/仰角转换为相对偏航角,俯仰角和侧倾角或开始清洁后的结果,并使用具有所需点的纬度,经度和高度的飞机数据。
任何帮助将不胜感激。