path_planning/obstacles/
params.rs

1/* Copyright (C) 2020 Dylan Staatz - All Rights Reserved. */
2
3use nalgebra::SVector;
4use serde::{de::DeserializeOwned, Deserialize, Serialize};
5
6use crate::scalar::Scalar;
7
8use super::Behavior;
9
10#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
11#[serde(bound(
12  serialize = "X: Serialize",
13  deserialize = "X: DeserializeOwned"
14))]
15pub struct Obstacle2dParams<X: Scalar> {
16  pub shape: Shape2dParams<X>,
17  #[serde(default)]
18  pub offset: Offset2dParams<X>,
19  #[serde(default)]
20  pub behavior: Behavior,
21}
22
23#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
24#[serde(bound(
25  serialize = "X: Serialize",
26  deserialize = "X: DeserializeOwned"
27))]
28pub struct Offset2dParams<X: Scalar> {
29  pub translation: SVector<X, 2>,
30  pub angle: X,
31}
32
33impl<X: Scalar> Default for Offset2dParams<X> {
34  fn default() -> Self {
35    Self {
36      translation: SVector::zeros(),
37      angle: X::zero(),
38    }
39  }
40}
41
42#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
43#[serde(bound(
44  serialize = "X: Serialize",
45  deserialize = "X: DeserializeOwned"
46))]
47pub enum Shape2dParams<X: Scalar> {
48  Ball {
49    radius: X,
50  },
51  Capsule {
52    a: SVector<X, 2>,
53    b: SVector<X, 2>,
54    radius: X,
55  },
56  Compound {
57    shapes: Vec<(Offset2dParams<X>, Shape2dParams<X>)>,
58  },
59  RegularPolygon {
60    sides: u8,
61    scale: X,
62  },
63  ConvexPolygon {
64    points: Vec<SVector<X, 2>>,
65  },
66  Cuboid {
67    half_extents: SVector<X, 2>,
68  },
69  HalfSpace {
70    normal: SVector<X, 2>,
71  },
72  RoundRegularPolygon {
73    sides: u8,
74    scale: X,
75    border_radius: X,
76  },
77  RoundConvexPolygon {
78    points: Vec<SVector<X, 2>>,
79    border_radius: X,
80  },
81  RoundCuboid {
82    half_extents: SVector<X, 2>,
83    border_radius: X,
84  },
85  RoundTriangle {
86    a: SVector<X, 2>,
87    b: SVector<X, 2>,
88    c: SVector<X, 2>,
89    border_radius: X,
90  },
91  Segment {
92    a: SVector<X, 2>,
93    b: SVector<X, 2>,
94  },
95  Triangle {
96    a: SVector<X, 2>,
97    b: SVector<X, 2>,
98    c: SVector<X, 2>,
99  },
100}
101
102#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
103#[serde(bound(
104  serialize = "X: Serialize",
105  deserialize = "X: DeserializeOwned"
106))]
107pub struct Obstacle3dParams<X: Scalar> {
108  pub shape: Shape3dParams<X>,
109  #[serde(default)]
110  pub offset: Offset3dParams<X>,
111  #[serde(default)]
112  pub behavior: Behavior,
113}
114
115#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
116#[serde(bound(
117  serialize = "X: Serialize",
118  deserialize = "X: DeserializeOwned"
119))]
120pub struct Offset3dParams<X: Scalar> {
121  pub translation: SVector<X, 3>,
122  pub axis_angle: SVector<X, 3>,
123}
124
125impl<X: Scalar> Default for Offset3dParams<X> {
126  fn default() -> Self {
127    Self {
128      translation: SVector::zeros(),
129      axis_angle: SVector::zeros(),
130    }
131  }
132}
133
134#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
135#[serde(bound(
136  serialize = "X: Serialize",
137  deserialize = "X: DeserializeOwned"
138))]
139pub enum Shape3dParams<X: Scalar> {
140  Ball {
141    radius: X,
142  },
143  Capsule {
144    a: SVector<X, 3>,
145    b: SVector<X, 3>,
146    radius: X,
147  },
148  Compound {
149    shapes: Vec<(Offset3dParams<X>, Shape3dParams<X>)>,
150  },
151  ConvexPolyhedron {
152    points: Vec<SVector<X, 3>>,
153  },
154  Cone {
155    half_height: X,
156    radius: X,
157  },
158  Cuboid {
159    half_extents: SVector<X, 3>,
160  },
161  Cylinder {
162    half_height: X,
163    radius: X,
164  },
165  HalfSpace {
166    normal: SVector<X, 3>,
167  },
168  RoundCone {
169    half_height: X,
170    radius: X,
171    border_radius: X,
172  },
173  RoundConvexPolyhedron {
174    points: Vec<SVector<X, 3>>,
175    border_radius: X,
176  },
177  RoundCuboid {
178    half_extents: SVector<X, 3>,
179    border_radius: X,
180  },
181  RoundCylinder {
182    half_height: X,
183    radius: X,
184    border_radius: X,
185  },
186  RoundTriangle {
187    a: SVector<X, 3>,
188    b: SVector<X, 3>,
189    c: SVector<X, 3>,
190    border_radius: X,
191  },
192  Segment {
193    a: SVector<X, 3>,
194    b: SVector<X, 3>,
195  },
196  Triangle {
197    a: SVector<X, 3>,
198    b: SVector<X, 3>,
199    c: SVector<X, 3>,
200  },
201}