holonomic.cpp
Go to the documentation of this file.
2 
4 
5 #include <math.h>
6 #include <algorithm>
7 #include <iostream>
8 
10 {
11  const double curr_vel = sqrt(pow(current.lin_x_vel, 2) + pow(current.lin_y_vel, 2));
12  const double prev_vel = sqrt(pow(prev.lin_x_vel, 2) + pow(prev.lin_y_vel, 2));
13 
14  if (curr_vel - prev_vel > limit)
15  {
16  const double scale = (limit - prev_vel) / curr_vel;
17  return {
18  .lin_x_vel = current.lin_x_vel * scale,
19  .lin_y_vel = current.lin_y_vel * scale,
20  .ang_z_vel = current.ang_z_vel * scale,
21  };
22  }
23  else if (curr_vel - prev_vel < -limit)
24  {
25  const double scale = (-limit + prev_vel) / prev_vel;
26  return {
27  .lin_x_vel = prev.lin_x_vel * scale,
28  .lin_y_vel = prev.lin_y_vel * scale,
29  .ang_z_vel = prev.ang_z_vel * scale
30  };
31  }
32 
33  return current;
34 }
35 
36 
38 {
39  const HolonomicCommand true_command = {
40  .lin_x_vel = command.lin_y_vel,
41  .lin_y_vel = command.lin_x_vel,
42  .ang_z_vel = command.ang_z_vel
43  };
44 
45  const double sint = sin(turret_pos);
46  const double cost = cos(turret_pos);
47 
48  const double b_sin = params.wheel_distance * sint;
49  const double b_cos = params.wheel_distance * cost;
50  const double a_sin = params.wheel_distance * sint;
51  const double a_cos = params.wheel_distance * cost;
52 
53  const double wheel_distance_inv = 1.0 / params.wheel_distance;
54  const double output_m1 = (true_command.lin_x_vel * (-b_sin - a_cos) + true_command.lin_y_vel * (b_cos - a_sin)) * wheel_distance_inv;
55  const double output_m2 = (true_command.lin_x_vel * (-b_sin + a_cos) + true_command.lin_y_vel * (b_cos + a_sin)) * wheel_distance_inv;
56 
57  // Notice this is the negative of the listed jacobian. this is because the motor velocity is the negative of the turret velocity.
58  const double output_mt = (-true_command.lin_x_vel * cost - true_command.lin_y_vel * sint) * wheel_distance_inv - true_command.ang_z_vel;
59 
60  // Scale the velocities linearly if a maximuim was reached
61  double scale = 1;
62 
63  if (abs(output_mt) > params.max_motor_turret_vel)
64  {
65  scale = std::min(params.max_motor_turret_vel / abs(output_mt), scale);
66  }
67 
68  if (abs(output_m1) > params.max_motor_left_vel)
69  {
70  scale = std::min(params.max_motor_left_vel / abs(output_m1), scale);
71  }
72 
73  if (abs(output_m2) > params.max_motor_right_vel)
74  {
75  scale = std::min(params.max_motor_right_vel / abs(output_m2), scale);
76  }
77 
78  return {
79  .motor_left_vel = scale * output_m1 / params.wheel_radius,
80  .motor_right_vel = scale * output_m2 / params.wheel_radius,
81  .motor_turret_vel = scale * output_mt,
82  };
83 }
84 
85 std::ostream &operator <<(std::ostream &o, const quori_holonomic_drive_controller::HolonomicParams &v)
86 {
87  return o << "HolonomicParams {" << std::endl
88  << " wheel_distance: " << v.wheel_distance << " meters" << std::endl
89  << " wheel_radius: " << v.wheel_radius << " meters" << std::endl
90  << " max_motor_turret_vel: " << v.max_motor_turret_vel << " rad/s" << std::endl
91  << " max_motor_left_vel: " << v.max_motor_left_vel << " m/s" << std::endl
92  << " max_motor_right_vel: " << v.max_motor_right_vel << " m/s" << std::endl
93  << "}";
94 }
95 
96 std::ostream &operator <<(std::ostream &o, const quori_holonomic_drive_controller::HolonomicCommand &v)
97 {
98  return o << "HolonomicCommand {" << std::endl
99  << " Linear X: " << v.lin_x_vel << " m/s" << std::endl
100  << " Linear Y: " << v.lin_y_vel << " m/s" << std::endl
101  << " Angular Z: " << v.ang_z_vel << " rad/s" << std::endl
102  << "}";
103 }
104 
105 std::ostream &operator <<(std::ostream &o, const quori_holonomic_drive_controller::DiffDriveCommand &v)
106 {
107  return o << "DiffDriveCommand {" << std::endl
108  << " Left Motor: " << v.motor_left_vel << " rad/s" << std::endl
109  << " Right Motor: " << v.motor_right_vel << " rad/s" << std::endl
110  << " Turret Motor: " << v.motor_turret_vel << " rad/s" << std::endl
111  << "}";
112 }
quori_holonomic_drive_controller::limit_acceleration
HolonomicCommand limit_acceleration(const HolonomicCommand &prev, const HolonomicCommand &current, const double limit)
Definition: holonomic.cpp:9
quori_holonomic_drive_controller::HolonomicCommand::lin_y_vel
double lin_y_vel
Definition: holonomic.hpp:21
command
ROSLIB_DECL std::string command(const std::string &cmd)
quori_holonomic_drive_controller::HolonomicCommand
Definition: holonomic.hpp:18
quori_holonomic_drive_controller::compute_ramsis_jacobian
DiffDriveCommand compute_ramsis_jacobian(const HolonomicCommand &command, double turret_pos, const HolonomicParams &params)
Definition: holonomic.cpp:37
quori_holonomic_drive_controller::HolonomicParams::wheel_distance
double wheel_distance
Definition: holonomic.hpp:10
quori_holonomic_drive_controller::DiffDriveCommand
Definition: holonomic.hpp:29
quori_holonomic_drive_controller::HolonomicParams::wheel_radius
double wheel_radius
Definition: holonomic.hpp:11
quori_holonomic_drive_controller::HolonomicParams::max_motor_turret_vel
double max_motor_turret_vel
Definition: holonomic.hpp:13
quori_holonomic_drive_controller::HolonomicParams::max_motor_left_vel
double max_motor_left_vel
Definition: holonomic.hpp:14
quori_holonomic_drive_controller
Definition: holonomic.hpp:5
quori_holonomic_drive_controller::HolonomicCommand::lin_x_vel
double lin_x_vel
Definition: holonomic.hpp:20
operator<<
std::ostream & operator<<(std::ostream &o, const quori_holonomic_drive_controller::HolonomicParams &v)
Definition: holonomic.cpp:85
quori_holonomic_drive_controller::DiffDriveCommand::motor_left_vel
double motor_left_vel
Definition: holonomic.hpp:32
quori_holonomic_drive_controller::DiffDriveCommand::motor_turret_vel
double motor_turret_vel
Definition: holonomic.hpp:38
quori_holonomic_drive_controller::HolonomicCommand::ang_z_vel
double ang_z_vel
Definition: holonomic.hpp:22
quori_holonomic_drive_controller::DiffDriveCommand::motor_right_vel
double motor_right_vel
Definition: holonomic.hpp:35
quori_holonomic_drive_controller::HolonomicParams
Definition: holonomic.hpp:7
quori_holonomic_drive_controller::HolonomicParams::max_motor_right_vel
double max_motor_right_vel
Definition: holonomic.hpp:15
holonomic.hpp


quori_holonomic_drive_controller
Author(s):
autogenerated on Wed Mar 2 2022 00:53:24