7 * Segment representing turn at one place.
9 * Speed related variables @c v1, @c v2 and @c acc represents
13 Turn::Turn(Point *_center, double _startHeading, double _turnBy) :
14 center(_center), turnBy(_turnBy), startHeading(_startHeading)
18 void Turn::setMaxV(const TrajectoryConstraints &constr) {
19 maxv = constr.maxomega;
25 double Turn::getDistance(double time) const {
27 return 0.5*acc*time*time + v1*time;
31 void Turn::getPointAt(double distance, Point *p) {
35 TrajectorySegment* Turn::splitAt(double distance, Point *newEnd) {
36 if (distance <= 0 || distance >= fabs(turnBy)) {
37 dbgPrintf("splitAt: distance=%g turnBy=%g\n", distance, turnBy);
41 Turn *ns = new Turn(*this);
45 ns->startHeading+=distance;
46 ns->turnBy -= distance;
50 TrajectorySegment* Turn::splitAtByTime(double time, Point *newEnd) {
51 if (time <= t1 || time >= t2) {
52 dbgPrintf("splitAt: distance=%g turnBy=%g\n", time, turnBy);
56 Turn *ns = new Turn(*this);
57 double distance = 0.5 * acc * time * time + v1 * time;
61 ns->startHeading+=distance;
62 ns->turnBy -= distance;
66 void Turn::getRefPos(double time, Pos &rp) {
68 double fraction = t/(t2-t1);
69 double distance = (v1 + 0.5*acc*t) * t;
73 rp.phi = startHeading + distance;
75 rp.phi = startHeading - distance;
78 rp.omega = v1+fraction*(v2-v1);
79 if (turnBy < 0) rp.omega = -rp.omega;
85 } // namespace Segment