diff.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "space_lib/space_lib.h"
  2. #include "diff/diff.h"
  3. #include <glog/logging.h>
  4. #include <ros/ros.h>
  5. namespace diff {
  6. Diff::Diff()
  7. {
  8. __readConf();
  9. }
  10. Diff::~Diff()
  11. {}
  12. void Diff::__readConf()
  13. {
  14. common::Config conf = getConfig();
  15. std::string path = space::home() + "configure/nav_config.json";
  16. Json::Value c = space::readConfig(path);
  17. Json::Value coy = c;
  18. space::jsonValueTo(c["diff"]["maxmal_next"], conf.maxmal_next) ?
  19. false : (c["diff"]["maxmal_next"] = conf.maxmal_next = 0.6);
  20. space::jsonValueTo(c["diff"]["minmal_next"], conf.minmal_next) ?
  21. false : (c["diff"]["minmal_next"] = conf.minmal_next = 0.25);
  22. space::jsonValueTo(c["diff"]["close_ad"], conf.close_ad) ?
  23. false : (c["diff"]["close_ad"] = conf.close_ad = 1.0);
  24. space::jsonValueTo(c["diff"]["toler_theta"], conf.toler_theta) ?
  25. false : (c["diff"]["toler_theta"] = conf.toler_theta = 0.01);
  26. space::jsonValueTo(c["diff"]["toler_start_theta"], conf.toler_start_theta) ?
  27. false : (c["diff"]["toler_start_theta"] = conf.toler_start_theta = 0.1);
  28. space::jsonValueTo(c["diff"]["toler_follow"], conf.toler_follow) ?
  29. false : (c["diff"]["toler_follow"] = conf.toler_follow = 0.2);
  30. space::jsonValueTo(c["diff"]["toler_follow_theta"], conf.toler_follow_theta) ?
  31. false : (c["diff"]["toler_follow_theta"] = conf.toler_follow_theta = 0.51);
  32. space::jsonValueTo(c["diff"]["angular_slow_p"], conf.angular_slow_p) ?
  33. false : (c["diff"]["angular_slow_p"] = conf.angular_slow_p = 0.8);
  34. space::jsonValueTo(c["diff"]["linear_slow_p"], conf.linear_slow_p) ?
  35. false : (c["diff"]["linear_slow_p"] = conf.linear_slow_p = 0.3);
  36. if (coy != c) {
  37. space::writeConfig(path, c);
  38. }
  39. setConfig(conf);
  40. }
  41. common::NavState Diff::computeVelocityCommands(common::Point& sta_pose, common::Twist& cmd)
  42. {
  43. common::NavState state = computeVelocity(sta_pose, cmd);
  44. static float angle = 0;
  45. float mo = 1 * cmd.angular;
  46. float den = fabs(cmd.x);
  47. mo = cmd.x >= 0 ? mo : -mo;
  48. float trig = atan2(mo, den); // 预期舵轮角度
  49. float e = trig - angle;
  50. float e_dis = fabs(e) + 1e-3; // 防止除0
  51. float t = e_dis / 0.225;
  52. // 舵轮线速度v,角转速w,舵轮角度误差e,允许最大偏移d = 0.1
  53. // 为使车体不偏移 (e / w) * v * sin(e) < d
  54. // 则v < d / ((e / w) * sin(e)), 其中e > M_PI_2 则 e = M_PI_2
  55. float vel;
  56. if (fabs(trig) > 0.765) {
  57. vel = fabs(1.0 * cmd.angular / sin(trig));
  58. vel = cmd.x > 0 ? vel : -vel;
  59. }
  60. else {
  61. vel = cmd.x / cos(trig);
  62. }
  63. float relia = vel * exp(-fabs(e));
  64. if (fabs(e) > 0.017 * 10) {
  65. relia = 0;
  66. }
  67. static ros::Time time = ros::Time::now();
  68. float vv = e > 0 ? 0.3825 : -0.3825;
  69. angle += (ros::Time::now() - time).toSec() * vv;
  70. // LOG(INFO)<<"angle: "<<angle<<" relia: "<<relia<<" cmd x: "<<cmd.x;
  71. time = ros::Time::now();
  72. return state;
  73. }
  74. }