20 #include <gtest/gtest.h> 22 #include <Eigen/Geometry> 24 #include <geographiclib_conversions/geodetic_conv.hpp> 31 auto wind_mean_velocity = Eigen::Vector3d(0, 10, 0);
32 double wind_variance = 0.0;
34 Eigen::Vector3d expected_wind = Eigen::Vector3d(0, 10, 0);
36 Eigen::Vector3d actual_wind = vtolDynamicsSim.
calculateWind();
37 ASSERT_EQ(actual_wind, expected_wind);
42 Eigen::Vector3d airSpeed;
43 double result, expected;
45 std::vector<std::pair<Eigen::Vector3d, double>> dataset;
46 dataset.push_back((std::make_pair(Eigen::Vector3d(0, 0, 0), 0.0)));
48 dataset.push_back((std::make_pair(Eigen::Vector3d(10, 1, 1), 0.099669)));
49 dataset.push_back((std::make_pair(Eigen::Vector3d(1, 10, 1), 0.785398)));
50 dataset.push_back((std::make_pair(Eigen::Vector3d(1, 1, 10), 1.471128)));
51 dataset.push_back((std::make_pair(Eigen::Vector3d(1, 2, 3), 1.2490)));
53 dataset.push_back((std::make_pair(Eigen::Vector3d(-10, 1, 1), 3.041924)));
54 dataset.push_back((std::make_pair(Eigen::Vector3d(-1, 10, 1), 2.356194)));
55 dataset.push_back((std::make_pair(Eigen::Vector3d(-1, 1, 10), 1.670465)));
56 dataset.push_back((std::make_pair(Eigen::Vector3d(-1, 2, 3), 1.892547)));
58 dataset.push_back((std::make_pair(Eigen::Vector3d(10, 1, -1), -0.099669)));
59 dataset.push_back((std::make_pair(Eigen::Vector3d(1, 10, -1), -0.785398)));
60 dataset.push_back((std::make_pair(Eigen::Vector3d(1, 1, -10), -1.471128)));
61 dataset.push_back((std::make_pair(Eigen::Vector3d(1, 2, -3), -1.249046)));
63 for(
auto pair : dataset){
65 EXPECT_NEAR(result, pair.second, 0.0001);
71 Eigen::Vector3d airSpeed;
72 double result, expected;
74 std::vector<std::pair<Eigen::Vector3d, double>> dataset;
75 dataset.push_back((std::make_pair(Eigen::Vector3d(0, 0, 0), 0.0)));
77 dataset.push_back((std::make_pair(Eigen::Vector3d(10, 1, 1), 0.099177)));
78 dataset.push_back((std::make_pair(Eigen::Vector3d(1, 10, 1), 1.430307)));
79 dataset.push_back((std::make_pair(Eigen::Vector3d(1, 1, 10), 0.099177)));
80 dataset.push_back((std::make_pair(Eigen::Vector3d(1, 2, 3), 0.563943)));
82 dataset.push_back((std::make_pair(Eigen::Vector3d(10, -1, 1), -0.099177)));
83 dataset.push_back((std::make_pair(Eigen::Vector3d(1, -10, 1), -1.430307)));
84 dataset.push_back((std::make_pair(Eigen::Vector3d(1, -1, 10), -0.099177)));
85 dataset.push_back((std::make_pair(Eigen::Vector3d(1, -2, 3), -0.563943)));
87 dataset.push_back((std::make_pair(Eigen::Vector3d(10, 1, -1), 0.099177)));
88 dataset.push_back((std::make_pair(Eigen::Vector3d(1, 10, -1), 1.430307)));
89 dataset.push_back((std::make_pair(Eigen::Vector3d(1, 1, -10), 0.099177)));
90 dataset.push_back((std::make_pair(Eigen::Vector3d(1, 2, -3), 0.563943)));
92 for(
auto pair : dataset){
94 EXPECT_NEAR(result, pair.second, 0.001);
100 Eigen::MatrixXd table(8, 1);
101 table << 5, 10, 15, 20, 25, 30, 35, 40;
113 TEST(CommonMath, findPrevRowIdxInMonotonicSequenceIncreasing){
115 Eigen::MatrixXd table(8, 1);
116 table << 5, 10, 15, 20, 25, 30, 35, 40;
128 TEST(CommonMath, findPrevRowIdxInMonotonicSequenceDecreasing){
130 Eigen::MatrixXd table(8, 1);
131 table << 40, 35, 30, 25, 20, 15, 10, 5;
143 TEST(calculateCLPolynomial, test_normal_scalar){
146 Eigen::MatrixXd table(2, 2);
149 double airSpeedMod = 0.5;
150 Eigen::VectorXd polynomialCoeffs(1);
153 ASSERT_EQ(polynomialCoeffs[0], airSpeedMod);
156 TEST(calculateCLPolynomial, test_normal_vector){
158 Eigen::VectorXd polynomialCoeffs(2);
160 Eigen::MatrixXd table(2, 3);
163 double airSpeedMod = 0.5;
165 Eigen::VectorXd expectedPolynomialCoeffs(2);
166 expectedPolynomialCoeffs << 0.5, 1.5;
169 ASSERT_EQ(polynomialCoeffs[0], expectedPolynomialCoeffs[0]);
170 ASSERT_EQ(polynomialCoeffs[1], expectedPolynomialCoeffs[1]);
173 TEST(calculateCLPolynomial, test_wrong_input_size){
176 Eigen::MatrixXd table(1, 2);
178 double airSpeedMod = 0.5;
179 Eigen::VectorXd polynomialCoeffs(1);
184 TEST(calculateCLPolynomial, test_wrong_table){
187 Eigen::MatrixXd table(2, 2);
190 double airSpeedMod = 0.5;
191 Eigen::VectorXd polynomialCoeffs(1);
198 ASSERT_EQ(vtolDynamicsSim.
init(), 0);
199 Eigen::VectorXd calculatedpolynomialCoeffs(7);
200 Eigen::VectorXd expectedPolynomialCoeffs(7);
201 Eigen::VectorXd diff(7);
205 expectedPolynomialCoeffs << -3.9340e-11, 8.2040e-09, 1.9350e-07, -3.0750e-05,
206 -4.2090e-04, 0.055200, 0.44380;
208 for(
size_t idx = 0; idx < expectedPolynomialCoeffs.size(); idx++){
209 EXPECT_NEAR(calculatedpolynomialCoeffs[idx], expectedPolynomialCoeffs[idx], 0.00001);
213 expectedPolynomialCoeffs << -1.5820e-11, 8.0740e-09, 9.4100e-08, -3.1150e-05,
214 -2.8150e-04, 0.055940, 0.38260;
216 for(
size_t idx = 0; idx < expectedPolynomialCoeffs.size(); idx++){
217 EXPECT_NEAR(calculatedpolynomialCoeffs[idx], expectedPolynomialCoeffs[idx], 0.00001);
221 expectedPolynomialCoeffs << 7.7000e-12, 7.9440e-09, -5.3000e-09, -3.1550e-05,
222 -1.4210e-04, 0.056680, 0.32140;
224 for(
size_t idx = 0; idx < expectedPolynomialCoeffs.size(); idx++){
225 EXPECT_NEAR(calculatedpolynomialCoeffs[idx], expectedPolynomialCoeffs[idx], 0.00001);
229 expectedPolynomialCoeffs << -5.9110e-11, 7.8790e-09, 2.5740e-07, -2.9610e-05,
230 -4.8380e-04, 0.054580, 0.46370;
232 for(
size_t idx = 0; idx < expectedPolynomialCoeffs.size(); idx++){
233 EXPECT_NEAR(calculatedpolynomialCoeffs[idx], expectedPolynomialCoeffs[idx], 0.00001);
240 Eigen::VectorXd calculatedpolynomialCoeffs(7);
241 double airSpeedMod = 5;
249 Eigen::VectorXd calculatedpolynomialCoeffs(7);
250 double airSpeedMod = 5;
258 Eigen::VectorXd poly(7);
259 poly << 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7;
261 double expected_output = 3.1859;
264 EXPECT_NEAR(actual_output, expected_output, 0.001);
269 ASSERT_EQ(vtolDynamicsSim.
init(), 0);
270 Eigen::MatrixXd x(1, 3);
271 Eigen::MatrixXd y(1, 4);
272 Eigen::MatrixXd
f(4, 3);
275 double actual_result;
276 double expected_result;
287 expected_result = 4.0;
289 EXPECT_NEAR(actual_result, expected_result, 0.001);
293 expected_result = 3.9250;
295 EXPECT_NEAR(actual_result, expected_result, 0.001);
300 ASSERT_EQ(vtolDynamicsSim.
init(), 0);
303 double rudder_position;
307 std::vector<DataSet> data_set;
310 data_set.push_back({.rudder_position = 0, .airspeed = 5, .expected = -1.5009e-04});
311 data_set.push_back({.rudder_position = 0, .airspeed = 5.1, .expected = -1.2303e-04});
312 data_set.push_back({.rudder_position = 0, .airspeed = 8.5, .expected = 5.9762e-04});
313 data_set.push_back({.rudder_position = 0, .airspeed = 8.66025, .expected = 6.0903e-04});
314 data_set.push_back({.rudder_position = 0, .airspeed = 10, .expected = 7.0445e-04});
315 data_set.push_back({.rudder_position = 0, .airspeed = 20, .expected = 9.2322e-04});
316 data_set.push_back({.rudder_position = 0, .airspeed = 40, .expected = -0.0013107});
317 data_set.push_back({.rudder_position = -20, .airspeed = 5, .expected = -0.034155});
318 data_set.push_back({.rudder_position = 0, .airspeed = 5, .expected = -1.5009e-04});
319 data_set.push_back({.rudder_position = 20, .airspeed = 5, .expected = 0.037053});
321 for(
auto test_case : data_set){
322 result = vtolDynamicsSim.
calculateCSRudder(test_case.rudder_position, test_case.airspeed);
323 EXPECT_NEAR(result, test_case.expected, 0.001);
329 ASSERT_EQ(vtolDynamicsSim.
init(), 0);
336 std::vector<DataSet> data_set;
339 data_set.push_back({.aos_degree = 0, .airspeed = 5, .expected = -0.0032540});
340 data_set.push_back({.aos_degree = 0, .airspeed = 10, .expected = -0.0040036});
341 data_set.push_back({.aos_degree = 0, .airspeed = 15, .expected = -0.0037597});
342 data_set.push_back({.aos_degree = 0, .airspeed = 20, .expected = -0.0033221});
345 for(
auto test_case : data_set){
346 result = vtolDynamicsSim.
calculateCSBeta(test_case.aos_degree, test_case.airspeed);
347 EXPECT_NEAR(result, test_case.expected, 0.0000001);
353 ASSERT_EQ(vtolDynamicsSim.
init(), 0);
354 double Cmx_aileron, airspeedNorm, aileron_pos, dynamicPressure;
355 double characteristicLength = 1.5;
359 for(aileron_pos = -2e1; aileron_pos <= 2e1; aileron_pos += 4){
361 Cmx_aileron *= 0.5 * dynamicPressure * characteristicLength;
362 std::cout << aileron_pos <<
" Cmx_aileron = " << Cmx_aileron << std::endl;
368 ASSERT_EQ(vtolDynamicsSim.
init(), 0);
369 Eigen::Vector3d Faero, Maero;
371 Eigen::Vector3d airspeed(0.000001, -9.999999, 0.000001);
372 double AoA = 0.958191;
373 double AoS = -1.570796;
374 double aileron_pos = 0.000000;
375 double elevator_pos = 0.000000;
376 double rudder_pos = 0.000000;
378 Eigen::Vector3d extectedFaero(-4.8133e-07, 2.9513e+01, -6.0493e-06);
379 Eigen::Vector3d extectedMaero(0.21470, 0.69480, -0.31633);
384 for(
size_t idx = 0; idx < 3; idx++){
385 EXPECT_NEAR(Faero[idx], extectedFaero[idx], 0.001);
386 EXPECT_NEAR(Maero[idx], extectedMaero[idx], 0.001);
392 ASSERT_EQ(vtolDynamicsSim.
init(), 0);
393 Eigen::Vector3d expectedResult, Faero, Maero;
395 Eigen::Vector3d airspeed(5, 5, 5);
398 double aileron_pos = 0.5;
399 double elevator_pos = 0.0;
400 double rudder_pos = 0.0;
402 Eigen::Vector3d extectedFaero(7.4133, -4.3077, -6.6924);
403 Eigen::Vector3d extectedMaero(0.333818, 1.754507, -0.037038);
408 for(
size_t idx = 0; idx < 3; idx++){
409 EXPECT_NEAR(Faero[idx], extectedFaero[idx], 0.02);
410 EXPECT_NEAR(Maero[idx], extectedMaero[idx], 0.02);
416 ASSERT_EQ(vtolDynamicsSim.
init(), 0);
417 Eigen::Vector3d expectedResult, Faero, Maero;
419 Eigen::Vector3d airspeed(5, 5, 5);
422 double aileron_pos = 0.0;
423 double elevator_pos = 5;
424 double rudder_pos = 0.0;
426 Eigen::Vector3d extectedFaero(7.4133, -4.3077, -6.6924);
427 Eigen::Vector3d extectedMaero(0.190243, 1.220935, -0.037038);
432 for(
size_t idx = 0; idx < 3; idx++){
433 EXPECT_NEAR(Faero[idx], extectedFaero[idx], 0.02);
434 EXPECT_NEAR(Maero[idx], extectedMaero[idx], 0.02);
440 ASSERT_EQ(vtolDynamicsSim.
init(), 0);
441 Eigen::Vector3d diff, expectedResult, Faero, Maero;
443 Eigen::Vector3d airspeed(5, 5, 5);
444 double AoA = 27.0 * 3.1415 / 180.0;
446 double aileron_pos = 0.0;
447 double elevator_pos = 0.0;
448 double rudder_pos = 0.0;
450 Eigen::Vector3d extectedFaero(6.0625, -7.7260, -17.5536);
451 Eigen::Vector3d extectedMaero(0.16512, 1.26568, -0.11093);
456 for(
size_t idx = 0; idx < 3; idx++){
457 EXPECT_NEAR(Faero[idx], extectedFaero[idx], 0.04);
458 EXPECT_NEAR(Maero[idx], extectedMaero[idx], 0.04);
464 ASSERT_EQ(vtolDynamicsSim.
init(), 0);
465 Eigen::Vector3d expectedResult, Faero, Maero;
467 Eigen::Vector3d airspeed(2.93128, 0.619653, 0.266774);
468 double AoA = 45 * 3.1415 / 180.0;
469 double AoS = 11.8888 * 3.1415 / 180.0;
470 double aileron_pos = 0.0;
471 double elevator_pos = 0.0;
472 double rudder_pos = 0.0;
474 Eigen::Vector3d extectedFaero(-2.28665, -0.92928, -2.66499);
475 Eigen::Vector3d extectedMaero(0.017652, 0.074924, -0.024468);
480 for(
size_t idx = 0; idx < 3; idx++){
481 EXPECT_NEAR(Faero[idx], extectedFaero[idx], 0.04);
482 EXPECT_NEAR(Maero[idx], extectedMaero[idx], 0.04);
486 TEST(thruster, thrusterFirstZeroCmd){
488 ASSERT_EQ(vtolDynamicsSim.
init(), 0);
490 actualThrust, actualTorque, actualRpm,
491 expectedThrust, expectedTorque, expectedRpm;
497 vtolDynamicsSim.
thruster(control, actualThrust, actualTorque, actualRpm);
498 EXPECT_NEAR(actualThrust, expectedThrust, 0.001);
499 EXPECT_NEAR(actualTorque, expectedTorque, 0.00001);
500 EXPECT_NEAR(actualRpm, expectedRpm, 0.00001);
502 TEST(thruster, thrusterSecond){
504 ASSERT_EQ(vtolDynamicsSim.
init(), 0);
506 actualThrust, actualTorque, actualRpm,
507 expectedThrust, expectedTorque, expectedRpm;
509 control = 134.254698;
510 expectedThrust = 3.590800;
511 expectedTorque = 0.013696;
512 expectedRpm = 732.298;
513 vtolDynamicsSim.
thruster(control, actualThrust, actualTorque, actualRpm);
514 EXPECT_NEAR(actualThrust, expectedThrust, 0.0001);
515 EXPECT_NEAR(actualTorque, expectedTorque, 0.000001);
516 EXPECT_NEAR(actualRpm, expectedRpm, 0.001);
520 ASSERT_EQ(vtolDynamicsSim.
init(), 0);
522 actualThrust, actualTorque, actualRpm,
523 expectedThrust, expectedTorque, expectedRpm;
525 control = 500.004648;
526 expectedThrust = 15.8930;
527 expectedTorque = 0.27273;
528 expectedRpm = 2727.3;
529 vtolDynamicsSim.
thruster(control, actualThrust, actualTorque, actualRpm);
530 EXPECT_NEAR(actualThrust, expectedThrust, 0.001);
531 EXPECT_NEAR(actualTorque, expectedTorque, 0.00001);
532 EXPECT_NEAR(actualRpm, expectedRpm, 0.2);
540 std::vector<double> actuators,
541 Eigen::Vector3d Maero,
542 Eigen::Vector3d Faero,
543 Eigen::Vector3d initialLinearVelocity,
544 Eigen::Vector3d initialAngularVelocity,
545 Eigen::Vector3d initialPosition,
546 Eigen::Quaterniond initialAttitude,
547 Eigen::Vector3d& expectedAngAccel,
548 Eigen::Vector3d& expectedLinAccel,
549 Eigen::Vector3d& angularAcceleration,
550 Eigen::Vector3d& linearAcceleration){
552 ASSERT_EQ(vtolDynamicsSim.
init(), 0);
562 double dt = 0.002500;
563 std::vector<double> actuators{0, 0, 0, 0, 0, 0, 0, 0};
564 Eigen::Quaterniond initAttitude(1, 0.2, 0.10, 0.05);
565 Eigen::Vector3d angAccel, linAccel, diff,
566 Faero(0.0, 0.0, 0.0),
567 Maero(0.0, 0.0, 0.0),
568 initialLinVel(0, 0, 0),
571 expectedAngAccel(0.0, 0.0, 0.0),
572 expectedLinAccel(2.5377e-16, -5.0753e-16, 9.8066e+00);
575 initialLinVel, initAngVel, initPose, initAttitude,
576 expectedAngAccel, expectedLinAccel,
579 for(
size_t idx = 0; idx < 3; idx++){
580 EXPECT_NEAR(angAccel[idx], expectedAngAccel[idx], 1e-04);
581 EXPECT_NEAR(linAccel[idx], expectedLinAccel[idx], 1e-04);
586 double dt = 0.002500;
587 std::vector<double> actuators{0, 0, 0, 0, 0, 0, 0, 0};
588 Eigen::Quaterniond initAttitude(1, 0.00, 0.00, 0.00);
589 Eigen::Vector3d angAccel, linAccel, diff,
590 Faero(0.0, 0.0, 0.0),
591 Maero(0.0, 0.0, 0.0),
592 initialLinVel(0, 0, 0),
593 initAngVel(0.3, 0.2, 0.1),
595 expectedAngAccel(-1.9719e-02, 2.9589e-02, -8.3459e-04),
596 expectedLinAccel(9.9127e-19, 1.9825e-18, 9.8066e+00);
599 initialLinVel, initAngVel, initPose, initAttitude,
600 expectedAngAccel, expectedLinAccel,
603 for(
size_t idx = 0; idx < 3; idx++){
604 EXPECT_NEAR(angAccel[idx], expectedAngAccel[idx], 6e-05);
605 EXPECT_NEAR(linAccel[idx], expectedLinAccel[idx], 6e-05);
610 double dt = 0.002500;
611 std::vector<double> actuators{0, 0, 0, 0, 0, 0, 0, 0};
612 Eigen::Quaterniond initAttitude(1, 0.00, 0.00, 0.00);
613 Eigen::Vector3d angAccel, linAccel, diff,
614 Faero(5.7448e-01, 2.9513e+01, 6.1333e-01),
615 Maero(0.0, 0.0, 0.0),
616 initialLinVel(0, 0, 0),
617 initAngVel(0.0, 0.0, 0.0),
619 expectedAngAccel(0.0, 0.0, 0.0),
620 expectedLinAccel(0.082069, 4.216143, 9.894269);
623 initialLinVel, initAngVel, initPose, initAttitude,
624 expectedAngAccel, expectedLinAccel,
627 for(
size_t idx = 0; idx < 3; idx++){
628 EXPECT_NEAR(angAccel[idx], expectedAngAccel[idx], 6e-05);
629 EXPECT_NEAR(linAccel[idx], expectedLinAccel[idx], 6e-05);
634 double dt = 0.002500;
635 std::vector<double> actuators{0, 0, 0, 0, 0, 0, 0, 0};
636 Eigen::Quaterniond initAttitude(1, 0.00, 0.00, 0.00);
637 Eigen::Vector3d angAccel, linAccel, diff,
638 Faero(0.0, 0.0, 0.0),
639 Maero(-0.214696, -0.694801, -0.316328),
640 initialLinVel(0, 0, 0),
641 initAngVel(0.0, 0.0, 0.0),
643 expectedAngAccel(-0.34251, -1.07821, -0.25057),
644 expectedLinAccel(7.7443e-21, -3.8722e-21, 9.8066e+00);
647 initialLinVel, initAngVel, initPose, initAttitude,
648 expectedAngAccel, expectedLinAccel,
651 for(
size_t idx = 0; idx < 3; idx++){
652 EXPECT_NEAR(angAccel[idx], expectedAngAccel[idx], 6e-05);
653 EXPECT_NEAR(linAccel[idx], expectedLinAccel[idx], 6e-05);
658 double dt = 0.002500;
659 std::vector<double> actuators{700, 700, 700, 700, 0, 0, 0, 0};
660 Eigen::Quaterniond initAttitude(1, 0.00, 0.00, 0.00);
661 Eigen::Vector3d angAccel, linAccel, diff,
662 Faero(0.0, 0.0, 0.0),
663 Maero(0.0, 0.0, 0.0),
664 initialLinVel(0, 0, 0),
665 initAngVel(0.0, 0.0, 0.0),
667 expectedAngAccel(0.00000, 0.00000, 0.00000),
668 expectedLinAccel(0.00000, 0.00000, -6.36769);
671 initialLinVel, initAngVel, initPose, initAttitude,
672 expectedAngAccel, expectedLinAccel,
675 for(
size_t idx = 0; idx < 3; idx++){
676 EXPECT_NEAR(angAccel[idx], expectedAngAccel[idx], 6e-05);
677 EXPECT_NEAR(linAccel[idx], expectedLinAccel[idx], 6e-05);
682 double dt = 0.002500;
683 std::vector<double> actuators{700, 680, 660, 640, 0, 0, 0, 0};
684 Eigen::Quaterniond initAttitude(1, 0.00, 0.00, 0.00);
685 Eigen::Vector3d angAccel, linAccel, diff,
686 Faero(0.0, 0.0, 0.0),
687 Maero(0.0, 0.0, 0.0),
688 initialLinVel(0, 0, 0),
689 initAngVel(0.0, 0.0, 0.0),
691 expectedAngAccel(0.1354, 1.2944, 0.10723),
692 expectedLinAccel(-1.3753e-04, 1.2938e-05, -5.0505e+00);
695 initialLinVel, initAngVel, initPose, initAttitude,
696 expectedAngAccel, expectedLinAccel,
699 for(
size_t idx = 0; idx < 3; idx++){
700 EXPECT_NEAR(angAccel[idx], expectedAngAccel[idx], 6e-05);
701 EXPECT_NEAR(linAccel[idx], expectedLinAccel[idx], 6e-05);
706 double dt = 0.002500;
707 std::vector<double> actuators{0, 0, 0, 0, 500, 0, 0, 0};
708 Eigen::Quaterniond initAttitude(1, 0.00, 0.00, 0.00);
709 Eigen::Vector3d angAccel, linAccel, diff,
710 Faero(0.0, 0.0, 0.0),
711 Maero(0.0, 0.0, 0.0),
712 initialLinVel(0, 0, 0),
713 initAngVel(0.0, 0.0, 0.0),
715 expectedAngAccel(-0.43508, 0.00000, 0.00000),
716 expectedLinAccel(2.2705e+00, 3.8722e-21, 9.8066e+00);
719 initialLinVel, initAngVel, initPose, initAttitude,
720 expectedAngAccel, expectedLinAccel,
723 for(
size_t idx = 0; idx < 3; idx++){
724 EXPECT_NEAR(angAccel[idx], expectedAngAccel[idx], 6e-05);
725 EXPECT_NEAR(linAccel[idx], expectedLinAccel[idx], 6e-05);
730 double dt = 0.002500;
731 std::vector<double> actuators{600, 550, 450, 500, 650, 0, 0, 0};
732 Eigen::Quaterniond initAttitude(1, 0, 0, 0);
734 Eigen::Vector3d angAccel, linAccel, diff,
735 Faero(15.0, 10.0, 5.0),
736 Maero(5.0, 10.0, 15.0),
737 initialLinVel(15, 3, 1),
738 initAngVel(0.5, 0.4, 0.3),
740 expectedAngAccel(5.1203, 16.15784, 11.9625),
741 expectedLinAccel(5.60908, 1.44474, 0.80233);
744 initialLinVel, initAngVel, initPose, initAttitude,
745 expectedAngAccel, expectedLinAccel,
748 for(
size_t idx = 0; idx < 3; idx++){
749 EXPECT_NEAR(angAccel[idx], expectedAngAccel[idx], 1e-03);
750 EXPECT_NEAR(linAccel[idx], expectedLinAccel[idx], 1e-03);
755 double dt = 0.002500;
756 std::vector<double> actuators{600, 550, 450, 500, 650, 4, 7, 11};
757 Eigen::Quaterniond initAttitude(0.9833, 0.1436, 0.106, 0.03427);
759 Eigen::Vector3d angAccel, linAccel, diff,
760 Faero(15.0, 10.0, 5.0),
761 Maero(5.0, 10.0, 15.0),
762 initialLinVel(15, 3, 1),
763 initAngVel(0.5, 0.4, 0.3),
765 expectedAngAccel(5.1202, 16.15784, 11.9625),
766 expectedLinAccel(3.45031, 4.40765, 0.68005);
769 initialLinVel, initAngVel, initPose, initAttitude,
770 expectedAngAccel, expectedLinAccel,
773 for(
size_t idx = 0; idx < 3; idx++){
774 EXPECT_NEAR(angAccel[idx], expectedAngAccel[idx], 1e-03);
775 EXPECT_NEAR(linAccel[idx], expectedLinAccel[idx], 1e-03);
780 int main(
int argc,
char *argv[]){
781 testing::InitGoogleTest(&argc, argv);
783 return RUN_ALL_TESTS();
double calculateCSRudder(double rudder_pos, double airspeed) const
Vtol dynamics simulator class.
void setInitialVelocity(const Eigen::Vector3d &linearVelocity, const Eigen::Vector3d &angularVelocity)
Eigen::Vector3d getAngularAcceleration() const
int8_t init() override
Use rosparam here to initialize sim.
int main(int argc, char *argv[])
void calculateCDPolynomial(double airSpeedMod, Eigen::VectorXd &polynomialCoeffs) const
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
TEST(InnoVtolDynamicsSim, calculateWind)
void calculateCSPolynomial(double airSpeedMod, Eigen::VectorXd &polynomialCoeffs) const
void setWindParameter(Eigen::Vector3d windMeanVelocity, double wind_velocityVariance)
size_t findPrevRowIdxInMonotonicSequence(const Eigen::MatrixXd &matrix, double key)
Given monotonic sequence (increasing or decreasing) and key, return the index of the previous element...
double calculateCSBeta(double AoS_deg, double airspeed) const
void calculateNewState(double dt, std::vector< double > actuators, Eigen::Vector3d Maero, Eigen::Vector3d Faero, Eigen::Vector3d initialLinearVelocity, Eigen::Vector3d initialAngularVelocity, Eigen::Vector3d initialPosition, Eigen::Quaterniond initialAttitude, Eigen::Vector3d &expectedAngAccel, Eigen::Vector3d &expectedLinAccel, Eigen::Vector3d &angularAcceleration, Eigen::Vector3d &linearAcceleration)
void thruster(double actuator, double &thrust, double &torque, double &rpm) const
double polyval(const Eigen::VectorXd &poly, double val)
Eigen::Vector3d calculateWind()
double calculateAnglesOfSideslip(const Eigen::Vector3d &airSpeed) const
double calculateCmyElevator(double elevator_pos, double airspeed) const
double griddata(const Eigen::MatrixXd &x, const Eigen::MatrixXd &y, const Eigen::MatrixXd &z, double x_val, double y_val)
void calculateAerodynamics(const Eigen::Vector3d &airspeed, double AoA, double AoS, double aileron_pos, double elevator_pos, double rudder_pos, Eigen::Vector3d &Faero, Eigen::Vector3d &Maero)
bool calculatePolynomial(const Eigen::MatrixXd &table, double airSpeedMod, Eigen::VectorXd &polynomialCoeffs)
size_t findPrevRowIdxInIncreasingSequence(const Eigen::MatrixXd &table, double value)
Given an increasing sequence and a key, return the index of the previous element closest to the key...
void calculateNewState(const Eigen::Vector3d &Maero, const Eigen::Vector3d &Faero, const std::vector< double > &actuator, double dt_sec)
void calculateCLPolynomial(double airSpeedMod, Eigen::VectorXd &polynomialCoeffs) const
Eigen::Vector3d getLinearAcceleration() const
double calculateDynamicPressure(double airSpeedMod) const
void setInitialPosition(const Eigen::Vector3d &position, const Eigen::Quaterniond &attitude) override
double calculateAnglesOfAtack(const Eigen::Vector3d &airSpeed) const