int main() { // Handle CTLR + C struct sigaction sigIntHandler; sigIntHandler.sa_handler = handleSignal; sigemptyset(&sigIntHandler.sa_mask); sigaction(SIGINT, &sigIntHandler, NULL); quit = false; auto lead = new car("lead"); auto follower = new car("follower"); auto controller = new pidController(); follower->setSpeed(0); lead->setSpeed(0); controller->setSetPoint(lead->getSpeed()); controller->setKi(1); controller->setKd(1); controller->setKp(.2); auto pvThread = std::thread(runPv, controller); auto pidThread = std::thread(runPid, controller); auto simThread = std::thread(runSim, lead, follower, controller); std::random_device rd; // only used once to initialise (seed) engine std::mt19937 rng(rd()); // random-number engine used (Mersenne-Twister in this case) std::uniform_int_distribution<int> uni(0,4); // guaranteed unbiased while (!quit) { int randomSpeed = uni(rng); lead->setSpeed(randomSpeed); controller->setSetPoint(lead->getSpeed()); sleepSim(2); } pvThread.join(); simThread.join(); pidThread.join(); delete lead; delete follower; delete controller; return 0; }
void PID::setWeights(const float &Kp, const float &Ki, const float &Kd) { setKp(Kp); setKi(Ki); setKd(Kd); }