2014 Eurobot fork
Dependencies: mbed-rtos mbed QEI
Diff: Processes/Motion/motion.cpp
- Revision:
- 24:50805ef8c499
- Child:
- 25:b16f1045108f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Processes/Motion/motion.cpp Tue Apr 09 20:37:59 2013 +0000 @@ -0,0 +1,70 @@ +//////////////////////////////////////////////////////////////////////////////// +// Motion control unit +//////////////////////////////////////////////////////////////////////////////// +// Takes current state of the robot and target waypoint, +// calculates desired forward and angular velocities and requests those from the motor control layer. +//////////////////////////////////////////////////////////////////////////////// + +#include "motion.h" + +namespace motion +{ + +void motionlayer(void const *dummy) +{ + //TODO: current_waypoint global in AI layer + //TODO: threshold for deciding that the waypoint has been achieved + + // get target waypoint from AI + Waypoint target_waypoint = *AI::current_waypoint; + + // get current state from Kalman + State current_state = Kalman::getState(); + + float delta_x = target_waypoint.x - current_state.x; + float delta_y = target_waypoint.y - current_state.y; + + float distance_err = sqrt(delta_x*delta_x + delta_y*delta_y); + + float angle_err = atan2(delta_y, delta_x); + + + // angular velocity controller + const float p_gain_av = 1.0; //TODO: tune + + const float max_av = PI; // radians per sec //TODO: tune + + // angle error [-pi, pi] + float angular_v = p_gain_av * angle_err; + + // constrain range + if (angular_v > max_av) + angular_v = max_av; + else if (angular_v < -max_av) + angular_v = -max_av; + + + // forward velocity controller + const float p_gain_fv = 1.0; //TODO: tune + + float max_fv = 1.0; // meters per sec //TODO: tune + const float angle_envelope_exponent = 8.0; //TODO: tune + + // control, distance_err in meters + float forward_v = p_gain_fv * distance_err; + + // control the forward velocity envelope based on angular error + max_fv = max_fv * pow(cos(angle_err/2), angle_envelope_exponent); + + // constrain range + if (forward_v > max_fv) + forward_v = max_fv; + else if (forward_v < -max_fv) + forward_v = -max_fv; + + //TODO: put into motor control + MotorControl::set_fwdcmd(forward_v); + MotorControl::set_thetacmd(angular_v); +} + +} //namespace \ No newline at end of file