new funcs in navigation to export instructions

This commit is contained in:
2022-02-03 10:44:58 +01:00
parent 23aaa890d5
commit 5ca21b09b2
6 changed files with 135 additions and 18 deletions
+80 -8
View File
@@ -25,17 +25,89 @@ void Navigation::loop() {
gps->encode(Serial1.read()); gps->encode(Serial1.read());
} }
Point Navigation::addCurrentPosToRoute() { bool Navigation::startNavigation() {
Point newTargetPoint = this->route->startRoute();
this->navigationStarted = this->setTargetPoint(newTargetPoint);
if (this->navigationStarted)
this->navigationFinished = false;
return this->navigationStarted;
}
CourseCorrection Navigation::getCourseCorrection() {
CourseCorrection courseCorrection = {0, 0};
Point currentPos = this->currentLocation();
double targetCourse = Navigation::courseTo(currentPos, this->targetPoint);
double distance = Navigation::distanceBetwenn(currentPos, this->targetPoint);
if (targetCourse < 0 || distance < 0 || this->navigationFinished)
return courseCorrection;
// Check if I need a new Point
if (distance < MIN_DISTANCE_BETWEEN_POINTS) {
bool goOn = this->nextPoint();
if (!goOn) {
this->navigationFinished = true;
this->navigationStarted = false;
return courseCorrection; // End of navigation
}
}
double currentCourse = gps->course.deg();
int16_t correction = currentCourse - targetCourse;
if (correction > 180)
correction -= 360;
else if (correction < -180)
correction += 360;
courseCorrection.correction = correction;
courseCorrection.distance = distance;
return courseCorrection;
}
bool Navigation::addCurrentPosToRoute() {
Point p = currentLocation();
if (!p.isValid()) { return false; }
if (MIN_DISTANCE_BETWEEN_POINTS <= this->distanceBetwenn(p, this->lastPoint)) {
this->route->addPointToRoute(p);
this->lastPoint = p;
return true;
}
return false;
}
Point Navigation::currentLocation() {
Point p; Point p;
if (this->gps->location.isValid()) {
if (this->gps->location.isUpdated() && this->gps->location.isValid()) {
p.lat = this->gps->location.lat(); p.lat = this->gps->location.lat();
p.lon = this->gps->location.lng(); p.lon = this->gps->location.lng();
if (MIN_DISTANCE_BETWEEN_POINTS <=
TinyGPSPlus::distanceBetween(p.lat, p.lon, this->lastPoint.lat, this->lastPoint.lon))
this->route->addPointToRoute(p);
} }
return p; return p;
} }
bool Navigation::nextPoint() {
if (!this->navigationStarted)
return false;
Point newTargetPoint = this->route->getNextPoint();
return this->setTargetPoint(newTargetPoint);
}
bool Navigation::setTargetPoint(Point target) {
if (target.isValid()) {
this->targetPoint = target;
return true;
}
return false;
}
double Navigation::distanceBetwenn(Point p1, Point p2) {
if (p1.isValid() && p2.isValid())
return TinyGPSPlus::distanceBetween(p1.lat, p1.lon, p2.lat, p2.lon);
return -1;
}
double Navigation::courseTo(Point p1, Point p2) {
if (p1.isValid() && p2.isValid())
return TinyGPSPlus::courseTo(p1.lat, p1.lon, p2.lat, p2.lon);
return -1;
}
+21 -1
View File
@@ -19,21 +19,41 @@
#include "route.h" #include "route.h"
#define MIN_DISTANCE_BETWEEN_POINTS 1 #define MIN_DISTANCE_BETWEEN_POINTS 1
struct CourseCorrection {
int16_t correction;
double distance;
};
class Navigation { class Navigation {
public: public:
Navigation(uint8_t rx, uint8_t tx); Navigation(uint8_t rx, uint8_t tx);
~Navigation(); ~Navigation();
void loop(); void loop();
Point addCurrentPosToRoute(); void newRoute();
bool startNavigation();
CourseCorrection getCourseCorrection();
bool addCurrentPosToRoute();
TinyGPSPlus* getGPS() { return this->gps; } TinyGPSPlus* getGPS() { return this->gps; }
private: private:
Point currentLocation();
bool nextPoint();
bool setTargetPoint(Point target);
static double distanceBetwenn(Point p1, Point p2);
static double courseTo(Point p1, Point p2);
TinyGPSPlus* gps; TinyGPSPlus* gps;
Route* route; Route* route;
Point lastPoint; Point lastPoint;
Point targetPoint;
bool navigationStarted = false;
bool navigationFinished = false;
}; };
#endif // NAVIGATION_H #endif // NAVIGATION_H
+5 -1
View File
@@ -20,13 +20,17 @@ void Route::addPointToRoute(Point point) {
} }
Point Route::startRoute() { Point Route::startRoute() {
if (this->points.size() < 1)
return Point(0, 0);
*this->it = this->points.begin(); *this->it = this->points.begin();
return **this->it; return **this->it;
} }
Point Route::getNextPoint() { Point Route::getNextPoint() {
if (*this->it != this->points.end()) if (*this->it != this->points.end()) {
this->it++;
return **this->it; return **this->it;
}
else else
return Point(0, 0); return Point(0, 0);
} }
+11 -2
View File
@@ -1,9 +1,18 @@
/**
* @file autopilot.cpp
* @author Alexander Klein (alex@kleiax.de)
* @brief
* @version 0.1
* @date 2022-02-02
*
* @copyright Copyright (c) 2022
*
*/
#include "driveModi/Modi/Autopilot/autopilot.h" #include "driveModi/Modi/Autopilot/autopilot.h"
Autopilot::Autopilot() { Autopilot::Autopilot() {
}
void Autopilot::init() {
} }
void Autopilot::runAutopilot() { void Autopilot::runAutopilot() {
+14 -6
View File
@@ -1,25 +1,33 @@
/**
* @file autopilot.h
* @author Alexander Klein (alex@kleiax.de)
* @brief
* @version 0.1
* @date 2022-02-02
*
* @copyright Copyright (c) 2022
*
*/
#ifndef AUTOPILOT_H #ifndef AUTOPILOT_H
#define AUTOPILOT_H #define AUTOPILOT_H
#include <TinyGPS++.h>
#include "route.h" #include "navigation.h"
#include "moveControl.h" #include "moveControl.h"
#include "debugMqtt.h"
#include "driveModi/driveModi.h" #include "driveModi/driveModi.h"
class Autopilot : DriveModi{ class Autopilot : DriveModi{
public: public:
Autopilot(); Autopilot();
void init();
void loop(); void loop();
void runAutopilot(); void runAutopilot();
private: private:
MoveControl *moveControl; MoveControl* moveControl;
DebugMqtt *debug; Navigation* navigation;
}; };
@@ -14,9 +14,13 @@ class CaptureRoute : public ManualControl {
void loop(); void loop();
void runCaptureRoute(); void runCaptureRoute();
Navigation* getNavigation() const { return this->navigation; }
private: private:
Navigation* navigation; Navigation* navigation;
uint16_t savedPoints = 0;
uint32_t last_millis = 0; uint32_t last_millis = 0;
uint16_t delay = 200; uint16_t delay = 200;
}; };