Skip to content
Snippets Groups Projects
Commit dc4023ed authored by Alejandro Lopez Gestoso's avatar Alejandro Lopez Gestoso
Browse files

Added generate_spwan_launch_file

parent 0952fb6d
No related branches found
No related tags found
No related merge requests found
#ifndef _ADC_CIRCUIT_H #ifndef _ADC_CIRCUIT_H
#define _ADC_CIRCUIT_H #define _ADC_CIRCUIT_H
#include <string>
#include <vector> #include <vector>
#include "adc_road.h" #include "adc_road.h"
#include <vector> #include <vector>
...@@ -18,6 +19,7 @@ class CAdcCircuit ...@@ -18,6 +19,7 @@ class CAdcCircuit
void debug(void); void debug(void);
void calculate_signals_pose(bool debug = false); void calculate_signals_pose(bool debug = false);
void get_signals(std::vector<CAdcSignals> &signals); void get_signals(std::vector<CAdcSignals> &signals);
void generate_spwan_launch_file(std::string &filename);
}; };
#endif #endif
\ No newline at end of file
...@@ -32,6 +32,7 @@ class CAdcRoad ...@@ -32,6 +32,7 @@ class CAdcRoad
void debug(void); void debug(void);
void calculate_signals_pose(bool debug = false); void calculate_signals_pose(bool debug = false);
void get_signals(std::vector<CAdcSignals> &signals); void get_signals(std::vector<CAdcSignals> &signals);
void append_signs_spawn(std::string &filename);
}; };
#endif #endif
#ifndef _ADC_SIGNALS_H #ifndef _ADC_SIGNALS_H
#define _ADC_SIGNALS_H #define _ADC_SIGNALS_H
#include <string> #include <string>
#include <map>
// UNMARKEDINTERSECTION 102 #define UNMARKEDINTERSECTION_TYPE "102"
// STOPANDGIVEWAY 206 #define UNMARKEDINTERSECTION_MARKER "alvar0"
// PARKINGAREA ??? #define STOPANDGIVEWAY_TYPE "206"
// HAVEWAY ??? #define STOPANDGIVEWAY_MARKER "alvar1"
// AHEADONLY 209 #define PARKINGAREA_TYPE "???"
// AHEADONLYSUB 30 #define PARKINGAREA_MARKER "alvar2"
// GIVEWAY 205 #define HAVEWAY_TYPE "???"
// PEDESTRIANCROSSING ??? #define HAVEWAY_MARKER "alvar3"
// ROUNDABOUT ??? #define AHEADONLY_TYPE "209"
// NOOVERTAKING 276 #define AHEADONLY_SUB_TYPE "30"
// NOENTRYVEHICULARTRAFFIC 267 #define AHEADONLY_MARKER "alvar4"
// TESTCOURSEA9 ??? #define GIVEWAY_TYPE "205"
// ONEWAYSTREET 220 #define GIVEWAY_MARKER "alvar5"
// ROADWORKS 123 #define PEDESTRIANCROSSING_TYPE "???"
// KMH50 274 #define PEDESTRIANCROSSING_MARKER "alvar6"
// KMH100 274 #define ROUNDABOUT_TYPE "???"
#define ROUNDABOUT_MARKER "alvar7"
#define NOOVERTAKING_TYPE "276"
#define NOOVERTAKING_MARKER "alvar8"
#define NOENTRYVEHICULARTRAFFIC_TYPE "267"
#define NOENTRYVEHICULARTRAFFIC_MARKER "alvar9"
#define TESTCOURSEA9_TYPE "???"
#define TESTCOURSEA9_MARKER "alvar10"
#define ONEWAYSTREET_TYPE "220"
#define ONEWAYSTREET_MARKER "alvar11"
#define ROADWORKS_TYPE "123"
#define ROADWORKS_MARKER "alvar12"
#define MAX_VEL_TYPE "274"
#define MAX_VEL_50_MARKER "alvar13"
#define MAX_VEL_100_MARKER "alvar14"
#define SEMAPHORE_TYPE "1000001"
#define SEMAPHORE_MARKER "alvar15"
typedef struct
{
std::string type;
std::string marker;
}Sign_urdf_info;
class CAdcSignals class CAdcSignals
{ {
...@@ -33,6 +56,8 @@ class CAdcSignals ...@@ -33,6 +56,8 @@ class CAdcSignals
std::string sub_type; std::string sub_type;
int value; int value;
std::string text; std::string text;
static std::map<std::string, Sign_urdf_info> urdf_map;
static void set_urdf_map(void);
public: public:
CAdcSignals(); CAdcSignals();
CAdcSignals(int id, double s, double t, double heading, std::string type, std::string sub_type, int value, std::string text, bool reverse = false); CAdcSignals(int id, double s, double t, double heading, std::string type, std::string sub_type, int value, std::string text, bool reverse = false);
...@@ -43,6 +68,7 @@ class CAdcSignals ...@@ -43,6 +68,7 @@ class CAdcSignals
void get_sign_info(std::string &type, std::string &sub_type, int &value, std::string &text); void get_sign_info(std::string &type, std::string &sub_type, int &value, std::string &text);
void set_world_pose(double x, double y, double yaw); void set_world_pose(double x, double y, double yaw);
void debug(bool world_pose = false); void debug(bool world_pose = false);
void append_sign_spawn(std::string &filename);
}; };
#endif #endif
...@@ -13,6 +13,7 @@ class COpenDriveFormat ...@@ -13,6 +13,7 @@ class COpenDriveFormat
void load(std::string &filename, bool debug = false); void load(std::string &filename, bool debug = false);
void calculate_signals_pose(bool debug = false); void calculate_signals_pose(bool debug = false);
void get_signals(std::vector<CAdcSignals> &signals); void get_signals(std::vector<CAdcSignals> &signals);
void generate_spwan_launch_file(std::string &filename);
~COpenDriveFormat(); ~COpenDriveFormat();
private: private:
CAdcCircuit adc_circuit; CAdcCircuit adc_circuit;
......
#include "adc_circuit.h" #include "adc_circuit.h"
#include <sstream>
#include <iostream>
#include <fstream>
#include "exceptions.h"
CAdcCircuit::CAdcCircuit() CAdcCircuit::CAdcCircuit()
{ {
...@@ -40,4 +43,37 @@ void CAdcCircuit::get_signals(std::vector<CAdcSignals> &signals) ...@@ -40,4 +43,37 @@ void CAdcCircuit::get_signals(std::vector<CAdcSignals> &signals)
std::vector<CAdcSignals>().swap(signals); std::vector<CAdcSignals>().swap(signals);
for (unsigned int i = 0; i < this->roads.size(); i++) for (unsigned int i = 0; i < this->roads.size(); i++)
this->roads[i].get_signals(signals); this->roads[i].get_signals(signals);
}
void CAdcCircuit::generate_spwan_launch_file(std::string &filename)
{
std::remove(filename.c_str());
//First the header
std::ostringstream oss;
oss << "<?xml version=\"1.0\"?>" << std::endl << std::endl;
oss << "<launch>" << std::endl;
oss << " <arg name=\"parent\" default=\"map\"/>" << std::endl;
oss << " <arg name=\"rviz\" default=\"false\"/>" << std::endl;
std::ofstream out_file;
out_file.open(filename.c_str(), std::ios_base::app);
if (!out_file.is_open())
throw CException(_HERE_,"CAdcCircuit::generate_spwan_launch_file -> The output file can't be open");
out_file << oss.str() << std::endl;
out_file.close();
//sign info
for (unsigned int i = 0; i < this->roads.size(); i++)
this->roads[i].append_signs_spawn(filename);
//End
oss.str("");
oss.clear();
oss << std::endl << "</launch>" << std::endl;
out_file.open(filename.c_str(), std::ios_base::app);
if (!out_file.is_open())
throw CException(_HERE_,"CAdcCircuit::generate_spwan_launch_file -> The output file can't be open");
out_file << oss.str() << std::endl;
out_file.close();
} }
\ No newline at end of file
...@@ -111,4 +111,10 @@ void CAdcRoad::get_signals(std::vector<CAdcSignals> &signals) ...@@ -111,4 +111,10 @@ void CAdcRoad::get_signals(std::vector<CAdcSignals> &signals)
{ {
for (unsigned int i = 0; i < this->signals.size(); i++) for (unsigned int i = 0; i < this->signals.size(); i++)
signals.push_back(this->signals[i]); signals.push_back(this->signals[i]);
}
void CAdcRoad::append_signs_spawn(std::string &filename)
{
for (unsigned int i = 0; i < this->signals.size(); i++)
this->signals[i].append_sign_spawn(filename);
} }
\ No newline at end of file
#include "adc_signals.h" #include "adc_signals.h"
#include <cmath> #include <cmath>
#include <iostream> #include <iostream>
#include <sstream>
#include <fstream>
#include "exceptions.h"
std::map<std::string, Sign_urdf_info> CAdcSignals::urdf_map;
CAdcSignals::CAdcSignals() CAdcSignals::CAdcSignals()
{ {
...@@ -8,10 +13,14 @@ CAdcSignals::CAdcSignals() ...@@ -8,10 +13,14 @@ CAdcSignals::CAdcSignals()
this->s = 0; this->s = 0;
this->t = 0; this->t = 0;
this->heading = 0; this->heading = 0;
this->world_x = 0;
this->world_y = 0;
this->world_yaw = 0;
this->type = ""; this->type = "";
this->sub_type = ""; this->sub_type = "";
this->value = 0; this->value = 0;
this->text = ""; this->text = "";
set_urdf_map();
} }
CAdcSignals::~CAdcSignals() CAdcSignals::~CAdcSignals()
...@@ -20,6 +29,9 @@ CAdcSignals::~CAdcSignals() ...@@ -20,6 +29,9 @@ CAdcSignals::~CAdcSignals()
this->s = 0; this->s = 0;
this->t = 0; this->t = 0;
this->heading = 0; this->heading = 0;
this->world_x = 0;
this->world_y = 0;
this->world_yaw = 0;
this->type = ""; this->type = "";
this->sub_type = ""; this->sub_type = "";
this->value = 0; this->value = 0;
...@@ -36,6 +48,73 @@ CAdcSignals::CAdcSignals(int id, double s, double t, double heading, std::string ...@@ -36,6 +48,73 @@ CAdcSignals::CAdcSignals(int id, double s, double t, double heading, std::string
this->sub_type = sub_type; this->sub_type = sub_type;
this->value = value; this->value = value;
this->text = text; this->text = text;
this->world_x = 0;
this->world_y = 0;
this->world_yaw = 0;
set_urdf_map();
}
void CAdcSignals::set_urdf_map(void)
{
if (urdf_map.size() == 0)
{
Sign_urdf_info urdf_info;
urdf_info.type = "unmarked_intersection";
urdf_info.marker = UNMARKEDINTERSECTION_MARKER;
urdf_map[UNMARKEDINTERSECTION_TYPE] = urdf_info;
urdf_info.type = "stop";
urdf_info.marker = STOPANDGIVEWAY_MARKER;
urdf_map[STOPANDGIVEWAY_TYPE] = urdf_info;
urdf_info.type = "parking";
urdf_info.marker = PARKINGAREA_MARKER;
urdf_map[PARKINGAREA_TYPE] = urdf_info;
urdf_info.type = "haveway";
urdf_info.marker = HAVEWAY_MARKER;
urdf_map[HAVEWAY_TYPE] = urdf_info;
urdf_info.type = "ahead_only";
urdf_info.marker = AHEADONLY_MARKER;
std::stringstream ss;
ss << AHEADONLY_TYPE << "." << AHEADONLY_SUB_TYPE;
urdf_map[ss.str()] = urdf_info;
urdf_info.type = "giveway";
urdf_info.marker = GIVEWAY_MARKER;
urdf_map[GIVEWAY_TYPE] = urdf_info;
urdf_info.type = "pedestrian_crossing";
urdf_info.marker = PEDESTRIANCROSSING_MARKER;
urdf_map[PEDESTRIANCROSSING_TYPE] = urdf_info;
urdf_info.type = "roundabout";
urdf_info.marker = ROUNDABOUT_MARKER;
urdf_map[ROUNDABOUT_TYPE] = urdf_info;
urdf_info.type = "no_overtaking";
urdf_info.marker = NOOVERTAKING_MARKER;
urdf_map[NOOVERTAKING_TYPE] = urdf_info;
urdf_info.type = "no_entry";
urdf_info.marker = NOENTRYVEHICULARTRAFFIC_MARKER;
urdf_map[NOENTRYVEHICULARTRAFFIC_TYPE] = urdf_info;
urdf_info.type = "test_course";
urdf_info.marker = TESTCOURSEA9_MARKER;
urdf_map[TESTCOURSEA9_TYPE] = urdf_info;
urdf_info.type = "one_way";
urdf_info.marker = ONEWAYSTREET_MARKER;
urdf_map[ONEWAYSTREET_TYPE] = urdf_info;
urdf_info.type = "roadworks";
urdf_info.marker = ROADWORKS_MARKER;
urdf_map[ROADWORKS_TYPE] = urdf_info;
urdf_info.type = "max_50";
urdf_info.marker = MAX_VEL_50_MARKER;
ss.str("");
ss.clear();
ss << MAX_VEL_TYPE << ".50";
urdf_map[ss.str()] = urdf_info;
urdf_info.type = "max_100";
urdf_info.marker = MAX_VEL_100_MARKER;
ss.str("");
ss.clear();
ss << MAX_VEL_TYPE << ".100";
urdf_map[ss.str()] = urdf_info;
urdf_info.type = "semaphore";
urdf_info.marker = SEMAPHORE_MARKER;
urdf_map[SEMAPHORE_TYPE] = urdf_info;
}
} }
void CAdcSignals::get_pose(double &s, double &t, double &heading) void CAdcSignals::get_pose(double &s, double &t, double &heading)
...@@ -69,3 +148,43 @@ void CAdcSignals::debug(bool world_pose) ...@@ -69,3 +148,43 @@ void CAdcSignals::debug(bool world_pose)
if (world_pose) if (world_pose)
std::cout << " world pose: x = " << this->world_x << ", y = " << this->world_y << ", yaw = " << this->world_yaw << std::endl; std::cout << " world pose: x = " << this->world_x << ", y = " << this->world_y << ", yaw = " << this->world_yaw << std::endl;
} }
void CAdcSignals::append_sign_spawn(std::string &filename)
{
std::map<std::string, Sign_urdf_info>::iterator it = urdf_map.end();
std::stringstream ss;
if (this->type == AHEADONLY_TYPE)
ss << AHEADONLY_TYPE << "." << AHEADONLY_SUB_TYPE;
else if (this->type == MAX_VEL_TYPE)
ss << MAX_VEL_TYPE << "." << this->value;
else
ss << this->type;
it = urdf_map.find(ss.str());
if (it == urdf_map.end())
{
std::cout << "WARNING: Unknown signal type " << this->type << std::endl;
return;
}
std::ostringstream oss;
oss << std::endl << " <include file=\"$(find sign_description)/launch/spwan.launch\">" << std::endl;
oss << " <arg name=\"name\" value=\"" << it->second.type << this->id << "\"/>" << std::endl;
oss << " <arg name=\"model\" value=\"" << (this->type == SEMAPHORE_TYPE ? "semaphore": "sign") << "\"/>" << std::endl;
oss << " <arg name=\"tag\" value=\"" << it->second.marker << "\"/>" << std::endl;
oss << " <arg name=\"type\" value=\"" << it->second.type << "\"/>" << std::endl;
oss << " <arg name=\"x\" value=\"" << this->world_x << "\"/>" << std::endl;
oss << " <arg name=\"y\" value=\"" << this->world_y << "\"/>" << std::endl;
oss << " <arg name=\"yaw\" value=\"" << this->world_yaw << "\"/>" << std::endl;
oss << " <arg name=\"parent\" value=\"$(arg parent)\"/>" << std::endl;
oss << " <arg name=\"rviz\" value=\"$(arg rviz)\"/>" << std::endl;
oss << " </include>" << std::endl;
std::ofstream out_file;
out_file.open(filename.c_str(), std::ios_base::app);
if (!out_file.is_open())
throw CException(_HERE_,"CAdcCircuit::generate_spwan_launch_file -> The output file can't be open");
out_file << oss.str() << std::endl;
out_file.close();
}
\ No newline at end of file
...@@ -8,6 +8,7 @@ int main(int argc, char *argv[]) ...@@ -8,6 +8,7 @@ int main(int argc, char *argv[])
{ {
COpenDriveFormat open_drive_format; COpenDriveFormat open_drive_format;
std::string xml_file = "../src/xml/atlatec_generic.xodr"; std::string xml_file = "../src/xml/atlatec_generic.xodr";
std::string launch_file = "../spawn_signs.launch";
// std::string xml_file = "../src/xml/atlatec_vires.xodr"; // std::string xml_file = "../src/xml/atlatec_vires.xodr";
try try
{ {
...@@ -15,9 +16,10 @@ int main(int argc, char *argv[]) ...@@ -15,9 +16,10 @@ int main(int argc, char *argv[])
open_drive_format.calculate_signals_pose(false); open_drive_format.calculate_signals_pose(false);
std::vector<CAdcSignals> signals; std::vector<CAdcSignals> signals;
open_drive_format.get_signals(signals); // open_drive_format.get_signals(signals);
for (unsigned int i = 0; i < signals.size(); i++) // for (unsigned int i = 0; i < signals.size(); i++)
signals[i].debug(true); // signals[i].debug(true);
open_drive_format.generate_spwan_launch_file(launch_file);
} }
catch (CException &e) catch (CException &e)
{ {
......
...@@ -22,6 +22,7 @@ COpenDriveFormat::COpenDriveFormat() ...@@ -22,6 +22,7 @@ COpenDriveFormat::COpenDriveFormat()
void COpenDriveFormat::load(std::string &filename, bool debug) void COpenDriveFormat::load(std::string &filename, bool debug)
{ {
std::cout << "Loading .xodr info..." << std::endl;
struct stat buffer; struct stat buffer;
if(stat(filename.c_str(),&buffer)==0) if(stat(filename.c_str(),&buffer)==0)
...@@ -123,9 +124,9 @@ void COpenDriveFormat::load(std::string &filename, bool debug) ...@@ -123,9 +124,9 @@ void COpenDriveFormat::load(std::string &filename, bool debug)
this->adc_circuit.add_road(road); this->adc_circuit.add_road(road);
} }
std::cout << "Loading .xodr info done." << std::endl;
if (debug) if (debug)
this->adc_circuit.debug(); this->adc_circuit.debug();
std::cout << "Done." << std::endl;
}catch (const xml_schema::exception& e){ }catch (const xml_schema::exception& e){
std::ostringstream os; std::ostringstream os;
os << e; os << e;
...@@ -139,7 +140,9 @@ void COpenDriveFormat::load(std::string &filename, bool debug) ...@@ -139,7 +140,9 @@ void COpenDriveFormat::load(std::string &filename, bool debug)
void COpenDriveFormat::calculate_signals_pose(bool debug) void COpenDriveFormat::calculate_signals_pose(bool debug)
{ {
std::cout << "Calculating world signs poses..." << std::endl;
this->adc_circuit.calculate_signals_pose(debug); this->adc_circuit.calculate_signals_pose(debug);
std::cout << "Calculating world signs poses done" << std::endl;
} }
void COpenDriveFormat::get_signals(std::vector<CAdcSignals> &signals) void COpenDriveFormat::get_signals(std::vector<CAdcSignals> &signals)
...@@ -147,6 +150,12 @@ void COpenDriveFormat::get_signals(std::vector<CAdcSignals> &signals) ...@@ -147,6 +150,12 @@ void COpenDriveFormat::get_signals(std::vector<CAdcSignals> &signals)
this->adc_circuit.get_signals(signals); this->adc_circuit.get_signals(signals);
} }
void COpenDriveFormat::generate_spwan_launch_file(std::string &filename)
{
std::cout << "Generating " << filename << " ..." << std::endl;
this->adc_circuit.generate_spwan_launch_file(filename);
std::cout << "Generating " << filename << " done" << std::endl;
}
// void COpenDriveFormat::load(std::string &filename) // void COpenDriveFormat::load(std::string &filename)
// { // {
// struct stat buffer; // struct stat buffer;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment