Formula Student Autonomous Systems
The code for the main driverless system
Loading...
Searching...
No Matches
trackLoader.cpp
Go to the documentation of this file.
2#include "yaml-cpp/yaml.h"
3#include <iostream>
4#include <string>
5
6using namespace std;
7using namespace YAML;
8
9Node fillChildNode(Node parentNode, string tag)
10{
11 if (parentNode[tag])
12 {
13 Node childNode = parentNode[tag];
14 return childNode;
15 }
16 else
17 throw runtime_error(string("Failed loading the map, no ") + tag);
18}
19
20void addLandmarks(std::vector<Landmark>* _ret, Node* list, int* _coneCounter)
21{
22 Landmark lm;
23 for (const_iterator it = list->begin(); it != list->end(); ++it)
24 {
25 const Node& position = *it;
26 vector<double> vi = position["position"].as<vector<double>>();
27 lm.id = *_coneCounter;
28 *_coneCounter++;
29 lm.position = Eigen::Vector3d(vi[0], vi[1], vi[2]);
30 lm.type = stringToLandmarkType(position["class"].as<std::string>());
31 lm.typeWeights[lm.type] = 1.0;
32 _ret->push_back(lm);
33 }
34}
35
36void addTimeKeepings(std::vector<std::pair<Landmark, Landmark>>* _ret, Node* list, int* _coneCounter)
37{
38 Landmark lm;
39 std::vector<Landmark> lms;
40 for (const_iterator it = list->begin(); it != list->end(); ++it)
41 {
42 const Node& position = *it;
43 vector<double> vi = position["position"].as<vector<double>>();
44 lm.id = *_coneCounter;
45 *_coneCounter++;
46 lm.position = Eigen::Vector3d(vi[0], vi[1], vi[2]);
47 lm.type = stringToLandmarkType(position["class"].as<std::string>());
48 lm.typeWeights[lm.type] = 1.0;
49 lms.push_back(lm);
50 }
51 for (int i = 0; i < (lms.size() / 2); ++i)
52 {
53 _ret->push_back(std::make_pair(lms[i * 2], lms[i * 2 + 1]));
54 }
55}
56
57Track loadMap(string mapPath, Eigen::Vector3d& start_position, Eigen::Vector3d& start_orientation)
58{
59 Node map = LoadFile(mapPath);
60 Node track = fillChildNode(map, "track");
61 Node left = fillChildNode(track, "left");
62 Node right = fillChildNode(track, "right");
63 Node time_keeping = fillChildNode(track, "time_keeping");
64 Node unknown = fillChildNode(track, "unknown");
65 // TODO: Catch pos or orientation size != 3
66 std::vector<double> start_pos = track["start"]["position"].as<vector<double>>();
67 std::vector<double> start_or = track["start"]["orientation"].as<vector<double>>();
68 start_position = Eigen::Vector3d(start_pos.data());
69 start_orientation = Eigen::Vector3d(start_or.data());
70
71 Track ret;
72 std::vector<double> gnss_start_pos = track["earthToTrack"]["position"].as<vector<double>>();
73 std::vector<double> gnss_start_or = track["earthToTrack"]["orientation"].as<vector<double>>();
74 ret.gnssOrigin = Eigen::Vector3d(gnss_start_pos.data());
75 ret.enuToTrackRotation = Eigen::Vector3d(gnss_start_or.data());
76
77 int coneCounter = 0;
78 if (track["lanesFirstWithLastConnected"])
79 {
80 ret.lanesFirstWithLastConnected = track["lanesFirstWithLastConnected"].as<bool>();
81 }
82 else
83 {
85 }
86
87 addLandmarks(&ret.left_lane, &left, &coneCounter);
88 addLandmarks(&ret.right_lane, &right, &coneCounter);
89 addTimeKeepings(&ret.time_keeping_gates, &time_keeping, &coneCounter);
90 addLandmarks(&ret.unknown, &unknown, &coneCounter);
91
92 return ret;
93}
Hash function for cones.
Definition cone.hpp:36
double typeWeights[LandmarkType::UNKNOWN+1]
Definition types.hpp:30
int id
Definition types.hpp:25
Eigen::Vector3d position
Definition types.hpp:26
LandmarkType type
Definition types.hpp:29
std::vector< std::pair< Landmark, Landmark > > time_keeping_gates
Definition types.hpp:45
Eigen::Vector3d enuToTrackRotation
Definition types.hpp:47
std::vector< Landmark > left_lane
Definition types.hpp:42
bool lanesFirstWithLastConnected
Definition types.hpp:41
std::vector< Landmark > unknown
Definition types.hpp:44
std::vector< Landmark > right_lane
Definition types.hpp:43
Eigen::Vector3d gnssOrigin
Definition types.hpp:46
void addTimeKeepings(std::vector< std::pair< Landmark, Landmark > > *_ret, Node *list, int *_coneCounter)
Track loadMap(string mapPath, Eigen::Vector3d &start_position, Eigen::Vector3d &start_orientation)
Node fillChildNode(Node parentNode, string tag)
void addLandmarks(std::vector< Landmark > *_ret, Node *list, int *_coneCounter)
LandmarkType stringToLandmarkType(const std::string &in)
Definition types.cpp:3