1414#include " Road.h"
1515#include " RoadMark.h"
1616#include " RoadObject.h"
17- #include " Signal .h"
17+ #include " RoadSignal .h"
1818#include " Utils.hpp"
1919
2020#include < algorithm>
@@ -61,7 +61,7 @@ OpenDriveMap::OpenDriveMap(const std::string& xodr_file,
6161 const bool with_lane_height,
6262 const bool abs_z_for_for_local_road_obj_outline,
6363 const bool fix_spiral_edge_cases,
64- const bool with_signals ) :
64+ const bool with_road_signals ) :
6565 xodr_file (xodr_file)
6666{
6767 pugi::xml_parse_result result = this ->xml_doc .load_file (xodr_file.c_str ());
@@ -632,45 +632,44 @@ OpenDriveMap::OpenDriveMap(const std::string& xodr_file,
632632 }
633633 }
634634 /* parse signals */
635- if (with_signals )
635+ if (with_road_signals )
636636 {
637637 for (pugi::xml_node signal_node : road_node.child (" signals" ).children (" signal" ))
638638 {
639- std::string signal_id = signal_node.attribute (" id" ).as_string (" " );
640- CHECK_AND_REPAIR (road.id_to_signal .find (signal_id) == road.id_to_signal .end (),
641- (std::string (" signal::id already exists - " ) + signal_id).c_str (),
642- signal_id = signal_id + std::string (" _dup" ));
643-
644- const bool is_dynamic_signal = std::string (signal_node.attribute (" dynamic" ).as_string (" no" )) == " yes" ;
645- Signal& signal = road.id_to_signal
646- .insert ({signal_id,
647- Signal (road_id,
648- signal_id,
649- signal_node.attribute (" name" ).as_string (" " ),
650- signal_node.attribute (" s" ).as_double (0 ),
651- signal_node.attribute (" t" ).as_double (0 ),
652- is_dynamic_signal,
653- signal_node.attribute (" zOffset" ).as_double (0 ),
654- signal_node.attribute (" value" ).as_double (0 ),
655- signal_node.attribute (" height" ).as_double (0 ),
656- signal_node.attribute (" width" ).as_double (0 ),
657- signal_node.attribute (" hOffset" ).as_double (0 ),
658- signal_node.attribute (" pitch" ).as_double (0 ),
659- signal_node.attribute (" roll" ).as_double (0 ),
660- signal_node.attribute (" orientation" ).as_string (" none" ),
661- signal_node.attribute (" country" ).as_string (" " ),
662- signal_node.attribute (" type" ).as_string (" none" ),
663- signal_node.attribute (" subtype" ).as_string (" none" ),
664- signal_node.attribute (" unit" ).as_string (" " ),
665- signal_node.attribute (" text" ).as_string (" none" ))})
666- .first ->second ;
667- signal.xml_node = signal_node;
668-
669- CHECK_AND_REPAIR (signal.s0 >= 0 , " signal::s < 0" , signal.s0 = 0 );
670- CHECK_AND_REPAIR (signal.height >= 0 , " signal::height < 0" , signal.height = 0 );
671- CHECK_AND_REPAIR (signal.width >= 0 , " signal::width < 0" , signal.width = 0 );
672-
673- signal.lane_validities = extract_lane_validity_records (signal_node);
639+ std::string road_signal_id = signal_node.attribute (" id" ).as_string (" " );
640+ CHECK_AND_REPAIR (road.id_to_signal .find (road_signal_id) == road.id_to_signal .end (),
641+ (std::string (" signal::id already exists - " ) + road_signal_id).c_str (),
642+ road_signal_id = road_signal_id + std::string (" _dup" ));
643+
644+ RoadSignal& road_signal = road.id_to_signal
645+ .insert ({road_signal_id,
646+ RoadSignal (road_id,
647+ road_signal_id,
648+ signal_node.attribute (" name" ).as_string (" " ),
649+ signal_node.attribute (" s" ).as_double (0 ),
650+ signal_node.attribute (" t" ).as_double (0 ),
651+ signal_node.attribute (" dynamic" ).as_bool (),
652+ signal_node.attribute (" zOffset" ).as_double (0 ),
653+ signal_node.attribute (" value" ).as_double (0 ),
654+ signal_node.attribute (" height" ).as_double (0 ),
655+ signal_node.attribute (" width" ).as_double (0 ),
656+ signal_node.attribute (" hOffset" ).as_double (0 ),
657+ signal_node.attribute (" pitch" ).as_double (0 ),
658+ signal_node.attribute (" roll" ).as_double (0 ),
659+ signal_node.attribute (" orientation" ).as_string (" none" ),
660+ signal_node.attribute (" country" ).as_string (" " ),
661+ signal_node.attribute (" type" ).as_string (" none" ),
662+ signal_node.attribute (" subtype" ).as_string (" none" ),
663+ signal_node.attribute (" unit" ).as_string (" " ),
664+ signal_node.attribute (" text" ).as_string (" none" ))})
665+ .first ->second ;
666+ road_signal.xml_node = signal_node;
667+
668+ CHECK_AND_REPAIR (road_signal.s0 >= 0 , " signal::s < 0" , road_signal.s0 = 0 );
669+ CHECK_AND_REPAIR (road_signal.height >= 0 , " signal::height < 0" , road_signal.height = 0 );
670+ CHECK_AND_REPAIR (road_signal.width >= 0 , " signal::width < 0" , road_signal.width = 0 );
671+
672+ road_signal.lane_validities = extract_lane_validity_records (signal_node);
674673 }
675674 }
676675 }
@@ -686,6 +685,7 @@ RoadNetworkMesh OpenDriveMap::get_road_network_mesh(const double eps) const
686685 LanesMesh& lanes_mesh = out_mesh.lanes_mesh ;
687686 RoadmarksMesh& roadmarks_mesh = out_mesh.roadmarks_mesh ;
688687 RoadObjectsMesh& road_objects_mesh = out_mesh.road_objects_mesh ;
688+ RoadSignalsMesh& road_signals_mesh = out_mesh.road_signals_mesh ;
689689
690690 for (const auto & id_road : this ->id_to_road )
691691 {
@@ -725,6 +725,14 @@ RoadNetworkMesh OpenDriveMap::get_road_network_mesh(const double eps) const
725725 road_objects_mesh.road_object_start_indices [road_objs_idx_offset] = road_object.id ;
726726 road_objects_mesh.add_mesh (road.get_road_object_mesh (road_object, eps));
727727 }
728+
729+ for (const auto & id_signal : road.id_to_signal )
730+ {
731+ const RoadSignal& road_signal = id_signal.second ;
732+ const std::size_t signals_idx_offset = road_signals_mesh.vertices .size ();
733+ road_signals_mesh.road_signal_start_indices [signals_idx_offset] = road_signal.id ;
734+ road_signals_mesh.add_mesh (road.get_road_signal_mesh (road_signal));
735+ }
728736 }
729737
730738 return out_mesh;
0 commit comments