Commit 11006e55 authored by Lorenz Meier's avatar Lorenz Meier

Fixed up first version of sensor level HIL, needs more validation, but operational

parent 2e625497
...@@ -474,14 +474,27 @@ void QGCXPlaneLink::readBytes() ...@@ -474,14 +474,27 @@ void QGCXPlaneLink::readBytes()
if (p.index == 4) if (p.index == 4)
{ {
xacc = p.f[5] * 9.81f; xacc = p.f[5] * 9.81f;
xacc = p.f[6] * 9.81f; yacc = p.f[6] * 9.81f;
zacc = -p.f[4] * 9.81f; zacc = -p.f[4] * 9.81f;
Eigen::Vector3f g(0, 0, -9.81f);
Eigen::Matrix3f R = euler_to_wRo(yaw, pitch, roll);
Eigen::Vector3f gr = R.transpose().eval() * g;
// TODO Add centrip. accel
xacc = gr[0];
yacc = gr[1];
zacc = gr[2];
fields_changed |= (1 << 0) | (1 << 1) | (1 << 2); fields_changed |= (1 << 0) | (1 << 1) | (1 << 2);
} }
else if (p.index == 6 && xPlaneVersion == 10) else if (p.index == 6 && xPlaneVersion == 10)
{ {
// inHg to kPa // inHg to hPa (hecto Pascal / millibar)
abs_pressure = p.f[0] * 3.3863886666718317f; abs_pressure = p.f[0] * 33.863886666718317f;
temperature = p.f[1]; temperature = p.f[1];
fields_changed |= (1 << 9) | (1 << 12); fields_changed |= (1 << 9) | (1 << 12);
} }
...@@ -496,12 +509,12 @@ void QGCXPlaneLink::readBytes() ...@@ -496,12 +509,12 @@ void QGCXPlaneLink::readBytes()
// UAS* uas = dynamic_cast<UAS*>(mav); // UAS* uas = dynamic_cast<UAS*>(mav);
// if (uas) uas->setManualControlCommands(man_roll, man_pitch, man_yaw, 0.6); // if (uas) uas->setManualControlCommands(man_roll, man_pitch, man_yaw, 0.6);
// } // }
else if (xPlaneVersion == 10 && p.index == 16) else if ((xPlaneVersion == 10 && p.index == 16) || (xPlaneVersion == 9 && p.index == 17))
{ {
//qDebug() << "ANG VEL:" << p.f[0] << p.f[3] << p.f[7]; // Cross checked with XPlane flight
rollspeed = p.f[2]; pitchspeed = p.f[0];
pitchspeed = p.f[1]; rollspeed = p.f[1];
yawspeed = p.f[0]; yawspeed = p.f[2];
fields_changed |= (1 << 3) | (1 << 4) | (1 << 5); fields_changed |= (1 << 3) | (1 << 4) | (1 << 5);
} }
else if ((xPlaneVersion == 10 && p.index == 17) || (xPlaneVersion == 9 && p.index == 18)) else if ((xPlaneVersion == 10 && p.index == 17) || (xPlaneVersion == 9 && p.index == 18))
...@@ -510,6 +523,9 @@ void QGCXPlaneLink::readBytes() ...@@ -510,6 +523,9 @@ void QGCXPlaneLink::readBytes()
pitch = p.f[0] / 180.0f * M_PI; pitch = p.f[0] / 180.0f * M_PI;
roll = p.f[1] / 180.0f * M_PI; roll = p.f[1] / 180.0f * M_PI;
yaw = p.f[2] / 180.0f * M_PI; yaw = p.f[2] / 180.0f * M_PI;
yaw = yaw;
// X-Plane expresses yaw as 0..2 PI // X-Plane expresses yaw as 0..2 PI
if (yaw > M_PI) { if (yaw > M_PI) {
yaw -= 2.0 * M_PI; yaw -= 2.0 * M_PI;
...@@ -518,7 +534,7 @@ void QGCXPlaneLink::readBytes() ...@@ -518,7 +534,7 @@ void QGCXPlaneLink::readBytes()
yaw += 2.0 * M_PI; yaw += 2.0 * M_PI;
} }
float yawmag = p.f[3]; float yawmag = p.f[3] / 180.0f * M_PI;
if (yawmag > M_PI) { if (yawmag > M_PI) {
yawmag -= 2.0 * M_PI; yawmag -= 2.0 * M_PI;
...@@ -527,20 +543,17 @@ void QGCXPlaneLink::readBytes() ...@@ -527,20 +543,17 @@ void QGCXPlaneLink::readBytes()
yawmag += 2.0 * M_PI; yawmag += 2.0 * M_PI;
} }
xmag = cos(yawmag) * 0.4f - sin(yawmag) * 0.0f + 0.0f; // Normal rotation matrix, but since we rotate the
ymag = sin(yawmag) * 0.4f - sin(yawmag) * 0.0f + 0.0f; // vector [0.25 0 0.45]', we end up with these relevant
zmag = 0.0f + 0.0f + 1.0f * 0.4f; // matrix parts.
xmag = cos(-yawmag) * 0.25f;
ymag = sin(-yawmag) * 0.25f;
zmag = 0.45f;
fields_changed |= (1 << 6) | (1 << 7) | (1 << 8); fields_changed |= (1 << 6) | (1 << 7) | (1 << 8);
emitUpdate = true; emitUpdate = true;
} }
else if ((xPlaneVersion == 9 && p.index == 17))
{
rollspeed = p.f[2];
pitchspeed = p.f[1];
yawspeed = p.f[0];
fields_changed |= (1 << 3) | (1 << 4) | (1 << 5);
}
// else if (p.index == 19) // else if (p.index == 19)
// { // {
...@@ -622,20 +635,19 @@ void QGCXPlaneLink::readBytes() ...@@ -622,20 +635,19 @@ void QGCXPlaneLink::readBytes()
emit sensorHilRawImuChanged(QGC::groundTimeUsecs(), xacc, yacc, zacc, rollspeed, pitchspeed, yawspeed, emit sensorHilRawImuChanged(QGC::groundTimeUsecs(), xacc, yacc, zacc, rollspeed, pitchspeed, yawspeed,
xmag, ymag, zmag, abs_pressure, diff_pressure, pressure_alt, temperature, fields_changed); xmag, ymag, zmag, abs_pressure, diff_pressure, pressure_alt, temperature, fields_changed);
int gps_fix_type = 3;
float eph = 0.3;
float epv = 0.6;
float vel = sqrt(vx*vx + vy*vy + vz*vz);
float cog = yaw;
int satellites = 8;
emit sensorHilGpsChanged(QGC::groundTimeUsecs(), lat, lon, alt, gps_fix_type, eph, epv, vel, cog, satellites);
} else {
emit hilStateChanged(QGC::groundTimeUsecs(), roll, pitch, yaw, rollspeed,
pitchspeed, yawspeed, lat, lon, alt,
vx, vy, vz, xacc, yacc, zacc);
} }
int gps_fix_type = 3;
float eph = 0.3;
float epv = 0.6;
float vel = sqrt(vx*vx + vy*vy + vz*vz);
float cog = yaw;
int satellites = 8;
emit sensorHilGpsChanged(QGC::groundTimeUsecs(), lat, lon, alt, gps_fix_type, eph, epv, vel, cog, satellites);
emit hilStateChanged(QGC::groundTimeUsecs(), roll, pitch, yaw, rollspeed,
pitchspeed, yawspeed, lat, lon, alt,
vx, vy, vz, xacc, yacc, zacc);
} }
if (!oldConnectionState && xPlaneConnected) if (!oldConnectionState && xPlaneConnected)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment