fn main() -> Result<(), Box<dyn std::error::Error>> {
use maliput::api::{objects::RoadObjectType, RoadNetwork, RoadNetworkBackend};
use std::collections::HashMap;
let package_location = std::env::var("CARGO_MANIFEST_DIR").unwrap();
let xodr_path = format!("{}/data/xodr/RoadWithRoadObjects.xodr", package_location);
let road_network_properties = HashMap::from([
("road_geometry_id", "two_roads_with_road_objects"),
("opendrive_file", xodr_path.as_str()),
("linear_tolerance", "0.01"),
]);
let road_network = RoadNetwork::new(RoadNetworkBackend::MaliputMalidrive, &road_network_properties)?;
let book = road_network.road_object_book();
let all_objects = book.road_objects();
println!("Total road objects: {}", all_objects.len());
for obj in &all_objects {
let name_str = obj.name().unwrap_or_else(|| "(none)".to_string());
let subtype_str = obj.subtype().unwrap_or_else(|| "(none)".to_string());
println!(
"\n Object '{}': name='{}' type={:?} subtype='{}'",
obj.id(),
name_str,
obj.object_type(),
subtype_str
);
println!(" is_dynamic: {}", obj.is_dynamic());
let pos = obj.position();
let ip = &pos.inertial_position;
println!(
" inertial position: (x={:.3}, y={:.3}, z={:.3})",
ip.x(),
ip.y(),
ip.z()
);
if let Some((lane_id, s, r, h)) = &pos.lane_position {
println!(" lane position: lane='{}' s={:.3} r={:.3} h={:.3}", lane_id, s, r, h);
}
let orient = obj.orientation();
println!(
" orientation (roll={:.3}, pitch={:.3}, yaw={:.3})",
orient.roll(),
orient.pitch(),
orient.yaw()
);
let bb = obj.bounding_box();
println!(" bounding box vertices: {}", bb.get_vertices().len());
let lanes = obj.related_lanes();
println!(" related_lanes: {:?}", lanes);
let n_outlines = obj.num_outlines();
println!(" num_outlines: {}", n_outlines);
if n_outlines > 0 {
for outline in obj.outlines() {
println!(
" outline '{}': {} corners, closed={}",
outline.id(),
outline.num_corners(),
outline.is_closed()
);
for (i, corner) in outline.corners().iter().enumerate() {
let h_str = corner
.height
.map(|h| format!("{:.3}", h))
.unwrap_or_else(|| "(none)".to_string());
println!(
" corner {}: ({:.3}, {:.3}, {:.3}) height={}",
i, corner.x, corner.y, corner.z, h_str
);
}
}
}
let props = obj.properties();
if !props.is_empty() {
println!(" properties:");
for (key, val) in &props {
println!(" '{}' = '{}'", key, val);
}
}
}
println!("\n--- Look up 'obj_barrier' by ID ---");
match book.get_road_object(&"obj_barrier".to_string()) {
Some(barrier) => {
println!("Found '{}' (type={:?})", barrier.id(), barrier.object_type());
let pos = barrier.position();
println!(
" position: ({:.3}, {:.3}, {:.3})",
pos.inertial_position.x(),
pos.inertial_position.y(),
pos.inertial_position.z()
);
}
None => println!("Object not found."),
}
println!("\n--- Look up 'obj_trashcan' by ID ---");
match book.get_road_object(&"obj_trashcan".to_string()) {
Some(trashcan) => {
println!("Found '{}' (type={:?})", trashcan.id(), trashcan.object_type());
let name_str = trashcan.name().unwrap_or_else(|| "(none)".to_string());
println!(" name: {}", name_str);
let pos = trashcan.position();
println!(
" position: ({:.3}, {:.3}, {:.3})",
pos.inertial_position.x(),
pos.inertial_position.y(),
pos.inertial_position.z()
);
let bb = trashcan.bounding_box();
println!(" bounding box vertices: {}", bb.get_vertices().len());
}
None => println!("Object not found."),
}
println!("\n--- Objects of type Barrier ---");
let barriers = book.find_by_type(&RoadObjectType::Barrier);
println!(" count: {}", barriers.len());
for b in &barriers {
println!(" '{}'", b.id());
}
println!("\n--- Objects of type Crosswalk ---");
let crosswalks = book.find_by_type(&RoadObjectType::Crosswalk);
println!(" count: {}", crosswalks.len());
for c in &crosswalks {
println!(" '{}' (related_lanes: {:?})", c.id(), c.related_lanes());
}
println!("\n--- Objects of type Unknown (includes obj_trashcan) ---");
let unknown_objects = book.find_by_type(&RoadObjectType::Unknown);
println!(" count: {}", unknown_objects.len());
for u in &unknown_objects {
println!(" '{}' name={:?}", u.id(), u.name());
}
println!("\n--- Objects related to lane '1_0_-1' ---");
let objects_for_lane = book.find_by_lane(&"1_0_-1".to_string());
println!(" count: {}", objects_for_lane.len());
for o in &objects_for_lane {
println!(" '{}' (type={:?})", o.id(), o.object_type());
}
println!("\n--- Objects within 5.0 m of (0.0, 4.0, 0.0) ---");
let nearby = book.find_in_radius(0.0, 4.0, 0.0, 5.0);
println!(" count: {}", nearby.len());
for o in &nearby {
let pos = o.position();
println!(
" '{}' at ({:.3}, {:.3}, {:.3})",
o.id(),
pos.inertial_position.x(),
pos.inertial_position.y(),
pos.inertial_position.z()
);
}
Ok(())
}