operator_advisor/observation/
util.rs1use crate::observation::Observation;
2use crate::InternalData as Data;
3use crate::Position;
4use strum_macros::{EnumCount as EnumCountMacro, EnumIter};
5
6
7pub fn distance_between_points(p1: Position, p2: Position) -> f32 {
8 let x = p2[0] - p1[0];
9 let y = p2[1] - p1[1];
10 let z = p2[2] - p1[2];
11 f32::sqrt(f32::powi(x, 2) + f32::powi(y, 2) + f32::powi(z, 2))
12}
13
14pub fn distance_between_points_2d(p1: Position, p2: Position) -> f32 {
15 let x = p2[0] - p1[0];
16 let y = p2[1] - p1[1];
17 f32::sqrt(f32::powi(x, 2) + f32::powi(y, 2))
18}
19
20pub fn norm(p: Position) -> f32 {
21 f32::sqrt(f32::powi(p[0], 2) + f32::powi(p[1], 2) + f32::powi(p[2], 2))
22}
23
24pub fn angle(p: Position) -> f32 {
25 (p[1] / p[0]).atan() * 180f32 / std::f32::consts::PI
26}
27
28pub fn data_trees_to_vector(data: &Data) -> Vec<Position> {
29 vec![
30 data.tree_1,
31 data.tree_2,
32 data.tree_3,
33 data.tree_4,
34 data.tree_5,
35 data.tree_6,
36 data.tree_7,
37 data.tree_8,
38 data.tree_9,
39 data.tree_10,
40 ]
41}
42
43pub fn convert_observations_to_int(obs: &Vec<Box<dyn Observation>>) -> Vec<usize> {
44 obs.iter()
45 .map(|x| x.to_int().expect("this observation is not discrete"))
46 .collect()
47}
48
49pub fn convert_observations_to_feature_vector(obs: &Vec<Box<dyn Observation>>) -> Vec<Vec<f32>> {
50 obs.iter()
51 .map(|x| x.to_vec().expect("this observation is not continous"))
52 .collect()
53}
54
55pub fn get_feature_from_observation(obs: &Vec<Vec<f32>>, feature: &Feature) -> Vec<f32> {
56 obs.iter().map(|x| x[feature.clone() as usize]).collect()
57}
58
59#[derive(EnumCountMacro, Clone,EnumIter, Debug)]
60pub enum Feature {
61 Tree1 = 0,
62 Tree2,
63 Tree3,
64 Tree4,
65 Tree5,
66 Tree6,
67 Tree7,
68 Tree8,
69 Tree9,
70 Tree10,
71 ExcavatorSpeed,
72 ExcavatorAngularSpeed,
73 StickExtension,
74 StickAngle,
75 FingerState,
76}