www.pudn.com > ccnu_robot.rar > Action.cpp
#include#include "Strategy.h" #include "Action.h" // 设置小车轮数 void Velocity ( Robot *robot, int vl, int vr ) { robot->velocityLeft = vl; robot->velocityRight = vr; } // 小车转角控制 void Angle ( Robot *robot, int desired_angle) { int theta_e, vl, vr; theta_e = desired_angle - (int)robot->rotation; while (theta_e > 180) theta_e -= 360; while (theta_e < -180) theta_e += 360; if (theta_e < -90) theta_e += 180; else if (theta_e > 90) theta_e -= 180; if (abs(theta_e) > 50) { vl = (int)(-9./90.0 * (double)theta_e); vr = (int)(9./90.0 * (double)theta_e); } else if (abs(theta_e) > 20) { vl = (int)(-11.0/90.0 * (double)theta_e); vr = (int)(11.0/90.0 * (double)theta_e); } Velocity (robot, vl, vr); } //移动小车到制定位置 void Position( Robot *robot, double x, double y ) { int desired_angle = 0, theta_e = 0, d_angle = 0, vl, vr, vc = 70; double dx, dy, d_e, Ka = 10.0/90.0; //计算当前位置与目标的相对位移 dx = x - robot->pos.x; dy = y - robot->pos.y; //计算到目标位置的直线距离 d_e = sqrt(dx * dx + dy * dy); //计算当前位置到目标点的角度 if (dx == 0 && dy == 0) desired_angle = 90; else desired_angle = (int)(180. / PI * atan2((double)(dy), (double)(dx))); //当前机器人与目标的夹角 theta_e = desired_angle - (int)robot->rotation; while (theta_e > 180) theta_e -= 360; while (theta_e < -180) theta_e += 360; if (d_e > 100.) Ka = 17. / 90.; else if (d_e > 50) Ka = 19. / 90.; else if (d_e > 30) Ka = 21. / 90.; else if (d_e > 20) Ka = 23. / 90.; else Ka = 25. / 90.; if (theta_e > 95 || theta_e < -95) { theta_e += 180; if (theta_e > 180) theta_e -= 360; if (theta_e > 80) theta_e = 80; if (theta_e < -80) theta_e = -80; if (d_e < 5.0 && abs(theta_e) < 40) Ka = 0.1; vr = (int)(-vc * (1.0 / (1.0 + exp(-3.0 * d_e)) - 0.3) + Ka * theta_e); vl = (int)(-vc * (1.0 / (1.0 + exp(-3.0 * d_e)) - 0.3) - Ka * theta_e); } else if (theta_e < 85 && theta_e > -85) { if (d_e < 5.0 && abs(theta_e) < 40) Ka = 0.1; vr = (int)( vc * (1.0 / (1.0 + exp(-3.0 * d_e)) - 0.3) + Ka * theta_e); vl = (int)( vc * (1.0 / (1.0 + exp(-3.0 * d_e)) - 0.3) - Ka * theta_e); } else { vr = (int)(+.17 * theta_e); vl = (int)(-.17 * theta_e); } Velocity(robot, vl, vr); }