Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
TaskMoveToWaypoint.cpp
00001 /* 00002 * TaskMoveToWaypoint.cpp 00003 * Copyright (c) 2018, ZHAW 00004 * All rights reserved. 00005 */ 00006 00007 #include <cmath> 00008 #include "TaskMoveToWaypoint.h" 00009 00010 using namespace std; 00011 00012 const float TaskMoveToWaypoint::DEFAULT_VELOCITY = 0.2f; // default velocity value, given in [m/s] 00013 const float TaskMoveToWaypoint::PI = 3.14159265f; // the constant PI 00014 const float TaskMoveToWaypoint::K = 2.0f; // controller gain parameter 00015 00016 /** 00017 * Creates a task object that moves the robot to a given waypoint. 00018 * @param conroller a reference to the controller object of the robot. 00019 * @param x the x coordinate of the waypoint position, given in [m]. 00020 * @param y the y coordinate of the waypoint position, given in [m]. 00021 */ 00022 TaskMoveToWaypoint::TaskMoveToWaypoint(Controller& controller, float x, float y) : controller(controller) { 00023 00024 this->x = x; 00025 this->y = y; 00026 this->velocity = DEFAULT_VELOCITY; 00027 this->initialDistance = 0.0f; 00028 } 00029 00030 /** 00031 * Creates a task object that moves the robot to a given waypoint. 00032 * @param conroller a reference to the controller object of the robot. 00033 * @param x the x coordinate of the target position, given in [m]. 00034 * @param y the y coordinate of the target position, given in [m]. 00035 * @param velocity the maximum translational velocity, given in [m/s]. 00036 */ 00037 TaskMoveToWaypoint::TaskMoveToWaypoint(Controller& controller, float x, float y, float velocity) : controller(controller) { 00038 00039 this->x = x; 00040 this->y = y; 00041 this->velocity = velocity; 00042 this->initialDistance = 0.0f; 00043 } 00044 00045 /** 00046 * Deletes the task object. 00047 */ 00048 TaskMoveToWaypoint::~TaskMoveToWaypoint() {} 00049 00050 /** 00051 * This method is called periodically by a task sequencer. 00052 * @param period the period of the task sequencer, given in [s]. 00053 * @return the status of this task, i.e. RUNNING or DONE. 00054 */ 00055 int TaskMoveToWaypoint::run(float period) { 00056 00057 float translationalVelocity = 0.0f; 00058 float rotationalVelocity = 0.0f; 00059 00060 float x = controller.getX(); 00061 float y = controller.getY(); 00062 float alpha = controller.getAlpha(); 00063 00064 float rho = sqrt((this->x-x)*(this->x-x)+(this->y-y)*(this->y-y)); 00065 float gamma = atan2(this->y-y, this->x-x)-alpha; 00066 00067 while (gamma < -PI) gamma += 2.0f*PI; 00068 while (gamma > PI) gamma -= 2.0f*PI; 00069 00070 if (initialDistance == 0.0f) initialDistance = rho; 00071 00072 translationalVelocity = velocity; 00073 rotationalVelocity = (rho < initialDistance/2.0f) ? 0.0f : K*gamma; 00074 00075 controller.setTranslationalVelocity(translationalVelocity); 00076 controller.setRotationalVelocity(rotationalVelocity); 00077 00078 return (rho < initialDistance/2.0f) && ((gamma < -PI/2.0f) || (gamma > PI/2.0f)) ? DONE : RUNNING; 00079 } 00080
Generated on Sun Jul 23 2023 17:17:31 by
1.7.2