Bench-MR
A Motion Planning Benchmark for Wheeled Mobile Robots
PeaksMetric.h
Go to the documentation of this file.
1#pragma once
2
3#include <cmath>
4#include <vector>
5
6#include "../TrajectoryMetric.h"
7
8#pragma warning "The PeaksMetric is not supported at the moment."
9
10#if 0
11class PeaksMetric : public TMetric<PeaksMetric> {
12 public:
13 static double evaluateMetric(const ompl::geometric::PathGeometric &trajectory,
14 double dt) {
15 double pmetric = 0;
16
17 double v_x[60000];
18 double v_y[60000];
19
20 double acca[60000];
21 const auto path = Point::fromPath(trajectory);
22
24#if TESTM > 0
25 v_x[0] = (path[+1].x - path[0].x) / (dt);
26 v_y[0] = (path[+1].y - path[0].y) / (dt);
27 int acnt = 0;
28 for (size_t i = 1; i < path.size() - 1; i++) {
29 v_x[i] = (path[i + 1].x - path[i - 1].x) / (2 * dt);
30 v_y[i] = (path[i + 1].y - path[i - 1].y) / (2 * dt);
31 acca[i - 1] = sqrt(v_x[i] * v_x[i] + v_y[i] * v_y[i]);
32 acnt++;
33 }
34
35 double myeps = 0.015;
36 for (size_t i = 1; i < acnt - 1; i++) {
37 if (acca[i] - acca[i - 1] > myeps && acca[i] - acca[i + 1] > myeps)
38 pmetric++;
39
40 if (acca[i] - acca[i - 1] < myeps && acca[i] - acca[i + 1] < myeps)
41 pmetric++;
42 }
43#else
44 std::vector<double> vvec(path.size());
45
46 // for (auto va : trajectory->getV()) {
47 // vvec.push_back(va);
48 // }
49
50 int acnt = 0;
51 double mean_acc = 0;
52 for (std::size_t i = 1; i < path.size() - 1; i++) {
53 v_x[i] = vvec[i] * std::cos(0);
54 v_y[i] = vvec[i] * std::sin(0);
55 // TODO this is supposed to be:
56 // v_x[i] = vvec[i] * std::cos(path[i].z);
57 // v_y[i] = vvec[i] * std::sin(path[i].z);
58 acca[i - 1] = std::sqrt(v_x[i] * v_x[i] + v_y[i] * v_y[i]);
59 acnt++;
60 mean_acc += std::sqrt(v_x[i] * v_x[i] + v_y[i] * v_y[i]);
61 }
62
63 mean_acc = mean_acc / acnt;
64
65 double jerk_x[100000];
66 double jerk_y[100000];
67
68 double acc_x[100000];
69 double acc_y[100000];
70 double acc = 0;
71
72 if (path.size() > 3) {
73 for (std::size_t i = 1; i < path.size() - 2; i++) {
74 acc_x[i] = (v_x[i + 1] - v_x[i - 1]) / (2 * dt);
75 acc_y[i] = (v_y[i + 1] - v_y[i - 1]) / (2 * dt);
76 }
77
80 for (std::size_t i = 1; i < path.size() - 3; i++) {
81 jerk_x[i] = (acc_x[i + 1] - acc_x[i - 1]) / (2 * dt);
82 jerk_y[i] = (acc_y[i + 1] - acc_y[i - 1]) / (2 * dt);
83 }
84
85 for (std::size_t i = 1; i < path.size() - 3; i++) {
86 acc = std::sqrt((acc_x[i] * acc_x[i] + acc_y[i] * acc_y[i]));
87 if (acc < 0.000001 && (jerk_x[i] < 0 || jerk_y[i] < 0)) pmetric++;
88 }
89 } else {
90 pmetric = 0;
91 }
92
93#endif
94
95 unsigned long nend = path.size() - 2;
96 int peakkk = 0;
97 double T, ratio, eps;
98 eps = 0.000001;
99
100 for (int i = 1; i < nend - 1; i++) {
101 T = acca[i] - acca[i - 1];
102 ratio = T / mean_acc;
103 if (std::fabs(ratio) > 1) {
104 peakkk++;
105 }
106 }
107
108 // cout<<"DEBUG: Number of Peaks:"<<metric<<endl;
109 return peakkk;
110 }
111};
112#endif
Definition: TrajectoryMetric.h:10
static std::vector< Point > fromPath(const ompl::geometric::PathGeometric &p, bool interpolate=false)
Definition: Primitives.cpp:25