1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
use super::control_node::ControlNode;
use arci::gamepad::{Axis, Button, GamepadEvent};
use arci::{BaseVelocity, MoveBase};
use async_trait::async_trait;
const BASE_LINEAR_VEL_AXIS_GAIN: f64 = 0.5;
const BASE_ANGULAR_VEL_AXIS_GAIN: f64 = 1.5;
const BASE_TURBO_GAIN: f64 = 2.0;
pub struct MoveBaseNode<T: MoveBase> {
move_base: T,
mode: String,
submode: String,
vel: BaseVelocity,
is_enabled: bool,
is_turbo: bool,
}
impl<T> MoveBaseNode<T>
where
T: MoveBase,
{
pub fn new(mode: String, move_base: T) -> Self {
Self {
move_base,
mode,
submode: "".to_string(),
vel: BaseVelocity::default(),
is_enabled: false,
is_turbo: false,
}
}
}
#[async_trait]
impl<T> ControlNode for MoveBaseNode<T>
where
T: MoveBase,
{
fn set_event(&mut self, ev: GamepadEvent) {
match ev {
GamepadEvent::AxisChanged(Axis::LeftStickX, v) => {
self.vel.y = v * BASE_LINEAR_VEL_AXIS_GAIN
}
GamepadEvent::AxisChanged(Axis::LeftStickY, v) => {
self.vel.x = v * BASE_LINEAR_VEL_AXIS_GAIN
}
GamepadEvent::AxisChanged(Axis::RightStickX, v) => {
self.vel.theta = v * BASE_ANGULAR_VEL_AXIS_GAIN
}
GamepadEvent::ButtonPressed(Button::RightTrigger2) => {
self.is_enabled = true;
}
GamepadEvent::ButtonReleased(Button::RightTrigger2) => {
self.is_enabled = false;
self.move_base
.send_velocity(&BaseVelocity::default())
.unwrap();
}
GamepadEvent::ButtonPressed(Button::LeftTrigger2) => {
self.is_turbo = true;
}
GamepadEvent::ButtonReleased(Button::LeftTrigger2) => {
self.is_turbo = false;
}
_ => {}
}
}
async fn proc(&self) {
if self.is_enabled {
if self.is_turbo {
let turbo_vel = self.vel * BASE_TURBO_GAIN;
self.move_base.send_velocity(&turbo_vel).unwrap();
} else {
self.move_base.send_velocity(&self.vel).unwrap();
}
}
}
fn mode(&self) -> &str {
&self.mode
}
fn submode(&self) -> &str {
&self.submode
}
}