-
Notifications
You must be signed in to change notification settings - Fork 126
Expand file tree
/
Copy pathprimitive_executor.cpp
More file actions
138 lines (120 loc) · 5.33 KB
/
primitive_executor.cpp
File metadata and controls
138 lines (120 loc) · 5.33 KB
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include "software/embedded/primitive_executor.h"
#include "proto/message_translation/tbots_geometry.h"
#include "proto/message_translation/tbots_protobuf.h"
#include "proto/primitive.pb.h"
#include "proto/primitive/primitive_msg_factory.h"
#include "proto/tbots_software_msgs.pb.h"
#include "proto/visualization.pb.h"
#include "software/geom/algorithms/distance.h"
#include "software/logger/logger.h"
#include "software/physics/velocity_conversion_util.h"
PrimitiveExecutor::PrimitiveExecutor(
const robot_constants::RobotConstants& robot_constants)
: current_primitive_(), robot_constants_(robot_constants)
{
}
void PrimitiveExecutor::updatePrimitive(const TbotsProto::Primitive& primitive_msg)
{
current_primitive_ = primitive_msg;
if (current_primitive_.has_move())
{
trajectory_path_ =
createTrajectoryPathFromParams(current_primitive_.move().xy_traj_params(),
state_.velocity(), robot_constants_);
angular_trajectory_ =
createAngularTrajectoryFromParams(current_primitive_.move().w_traj_params(),
state_.angularVelocity(), robot_constants_);
time_since_trajectory_creation_ = Duration::fromSeconds(VISION_TO_ROBOT_DELAY_S);
}
}
void PrimitiveExecutor::updateState(const RobotState& state)
{
Vector actual_global_velocity =
localToGlobalVelocity(state.localVelocity(), state_.orientation());
state_.setVelocity(actual_global_velocity);
state_.setAngularVelocity(state.angularVelocity());
}
Vector PrimitiveExecutor::getTargetLinearVelocity()
{
Vector local_velocity = globalToLocalVelocity(
trajectory_path_->getVelocity(time_since_trajectory_creation_.toSeconds()),
state_.orientation());
Point position =
trajectory_path_->getPosition(time_since_trajectory_creation_.toSeconds());
double distance_to_destination =
distance(position, trajectory_path_->getDestination());
// Dampen velocity as we get closer to the destination to reduce jittering
if (distance_to_destination < MAX_DAMPENING_VELOCITY_DISTANCE_M)
{
local_velocity *= distance_to_destination / MAX_DAMPENING_VELOCITY_DISTANCE_M;
}
return local_velocity;
}
AngularVelocity PrimitiveExecutor::getTargetAngularVelocity()
{
state_.setOrientation(
angular_trajectory_->getPosition(time_since_trajectory_creation_.toSeconds()));
AngularVelocity angular_velocity =
angular_trajectory_->getVelocity(time_since_trajectory_creation_.toSeconds());
Angle orientation_to_destination =
state_.orientation().minDiff(angular_trajectory_->getDestination());
if (orientation_to_destination.toDegrees() < 5)
{
angular_velocity *= orientation_to_destination.toDegrees() / 5;
}
return angular_velocity;
}
std::unique_ptr<TbotsProto::DirectControlPrimitive> PrimitiveExecutor::stepPrimitive(
TbotsProto::PrimitiveExecutorStatus& status, Duration delta_time)
{
time_since_trajectory_creation_ += delta_time;
status.set_running_primitive(true);
switch (current_primitive_.primitive_case())
{
case TbotsProto::Primitive::kStop:
{
auto prim = createDirectControlPrimitive(Vector(), AngularVelocity(), 0.0,
TbotsProto::AutoChipOrKick());
auto output = std::make_unique<TbotsProto::DirectControlPrimitive>(
prim->direct_control());
status.set_running_primitive(false);
return output;
}
case TbotsProto::Primitive::kDirectControl:
{
return std::make_unique<TbotsProto::DirectControlPrimitive>(
current_primitive_.direct_control());
}
case TbotsProto::Primitive::kMove:
{
if (!trajectory_path_.has_value() || !angular_trajectory_.has_value())
{
auto prim = createDirectControlPrimitive(Vector(), AngularVelocity(), 0.0,
TbotsProto::AutoChipOrKick());
auto output = std::make_unique<TbotsProto::DirectControlPrimitive>(
prim->direct_control());
LOG(INFO)
<< "Not moving because trajectory_path_ or angular_trajectory_ is not set";
return output;
}
Vector local_velocity = getTargetLinearVelocity();
AngularVelocity angular_velocity = getTargetAngularVelocity();
auto output = createDirectControlPrimitive(
local_velocity, angular_velocity,
convertDribblerModeToDribblerSpeed(
current_primitive_.move().dribbler_mode(), robot_constants_),
current_primitive_.move().auto_chip_or_kick());
return std::make_unique<TbotsProto::DirectControlPrimitive>(
output->direct_control());
}
case TbotsProto::Primitive::PRIMITIVE_NOT_SET:
{
// TODO (#2283) Once we can add/remove robots, this log should
// be re-enabled. Right now it just gets spammed because we command
// 6 robots for Div B when there are 11 on the field.
//
// LOG(DEBUG) << "No primitive set!";
}
}
return std::make_unique<TbotsProto::DirectControlPrimitive>();
}