simmodel_shenlan.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include "simmodel_shenlan.h"
  2. #include "math.h"
  3. #include <iostream>
  4. simmodel_shenlan::simmodel_shenlan()
  5. {
  6. mbInitOK = true;
  7. }
  8. simmodel_shenlan::~simmodel_shenlan()
  9. {
  10. }
  11. void simmodel_shenlan::CalcModel()
  12. {
  13. int64_t ncmdtime = mlastcmdtime;
  14. const double maxnocmdtime = 1000;
  15. int64_t nnow = std::chrono::system_clock::now().time_since_epoch().count();
  16. if((abs(nnow - ncmdtime)/1000000)>maxnocmdtime)
  17. {
  18. // std::cout<<" more than 1 seconds no cmd. not calc."<<std::endl;
  19. mvel = 0;
  20. mwheelsteer = 0;
  21. return;
  22. }
  23. static int64_t nlastcalctime = 0;
  24. double fdifftime = 0;
  25. if((abs(nnow - nlastcalctime)/1000000)>100)
  26. {
  27. fdifftime = 0;
  28. }
  29. else
  30. {
  31. fdifftime = (nnow - nlastcalctime)/1000000.0;
  32. fdifftime = fdifftime/1000.0; //seconds
  33. if(fdifftime <0)fdifftime=0;
  34. }
  35. if(fabs(fdifftime) > 0.000000001)
  36. {
  37. if(mshift == SHIFT_GEER::DRIVE)
  38. {
  39. mx = mx + mvel*fdifftime * cos(mhdg);
  40. my = my + mvel*fdifftime * sin(mhdg);
  41. mhdg = mhdg + mvel *fdifftime* tan(mwheelsteer)/mfwheelbase;
  42. }
  43. if(mshift == SHIFT_GEER::REVERSE)
  44. {
  45. mx = mx - mvel*fdifftime * cos(mhdg);
  46. my = my - mvel*fdifftime * sin(mhdg);
  47. mhdg = mhdg - mvel * fdifftime * tan(mwheelsteer)/mfwheelbase;
  48. }
  49. if(mshift == SHIFT_GEER::PARK)
  50. {
  51. }
  52. double facc;
  53. double fVehWeight = 1800;
  54. // double fg = 9.8;
  55. double fRollForce = 50;
  56. const double fRatio = 2.5;
  57. if(mfcmd_brake<0)
  58. {
  59. facc = mfcmd_brake;
  60. if((mvel<=0)) // &&(mshift == SHIFT_GEER::DRIVE))
  61. {
  62. mvel = 0;
  63. facc = 0;
  64. }
  65. }
  66. else
  67. {
  68. facc = (mfcmd_torque * fRatio - fRollForce)/fVehWeight;
  69. if((facc<0)&&(mvel == 0))
  70. {
  71. facc = 0;
  72. }
  73. }
  74. if(mshift == SHIFT_GEER::PARK)
  75. {
  76. facc = 0;
  77. }
  78. macc = facc;
  79. if(mshift == SHIFT_GEER::PARK)
  80. {
  81. mvel = 0;
  82. macc = 0;
  83. }
  84. mvel = mvel + facc * fdifftime;
  85. // std::cout<<" acc: "<<macc<<std::endl;
  86. double fwheelsteer = mwheelsteer;
  87. fwheelsteer = mfwheelratio * fwheelsteer *180.0/M_PI;
  88. if(fwheelsteer < mfcmd_wheelangle)
  89. {
  90. fwheelsteer = fwheelsteer + mfWHEELSPEED * fdifftime;
  91. if(fwheelsteer > mfcmd_wheelangle)fwheelsteer = mfcmd_wheelangle;
  92. }
  93. if(fwheelsteer > mfcmd_wheelangle){
  94. fwheelsteer = fwheelsteer - mfWHEELSPEED * fdifftime;
  95. if(fwheelsteer < mfcmd_wheelangle)fwheelsteer = mfcmd_wheelangle;
  96. }
  97. fwheelsteer = fwheelsteer *(M_PI/180.0) /mfwheelratio;
  98. mwheelsteer = fwheelsteer;
  99. }
  100. nlastcalctime = nnow;
  101. }