1516X Push Back 1.0
1516X's robot code for the 2025-2026 VEX Robotics Competition
Loading...
Searching...
No Matches
distanceReset.cpp File Reference
#include "globals.h"
#include "lemlib/util.hpp"
#include "pros/distance.hpp"
#include <numeric>

Go to the source code of this file.

Classes

struct  SensorConfig
struct  SensorReadings
struct  distancePose

Functions

distancePose calculateGlobalPosition (const SensorReadings &front_data, const SensorReadings &left_data, const SensorReadings &right_data, const SensorReadings &back_data, double heading_deg, float heading_tolerance=40.0)
distancePose distanceReset (bool setPose=false, bool filter=true, float filter_range=3.5, float heading_tolerance=40.0)
distancePose distanceReset (bool left_use, bool right_use, bool front_use, bool back_use, bool setPose)

Variables

const double MM_TO_IN = 0.0393701
const double FIELD_WIDTH = 3566.668 * MM_TO_IN
const double FIELD_HEIGHT = 3566.668 * MM_TO_IN
const double HALF_WIDTH = FIELD_WIDTH / 2.0
const double HALF_HEIGHT = FIELD_HEIGHT / 2.0
const double MAX_SENSOR_RANGE = 2000 * MM_TO_IN
const double MIN_SENSOR_RANGE = 0 * MM_TO_IN
bool controller_screen_avilable
const SensorConfig front_sensor_cfg = {4.067 + 0.2, 5.756, 0}
const SensorConfig left_sensor_cfg = {-0.5, -6.039 + 0.69, 90}
const SensorConfig right_sensor_cfg = {0.5, 6.039 - 1, -90}
const SensorConfig back_sensor_cfg = {-2.691 + 2.7, 3.879, 180}

Function Documentation

◆ calculateGlobalPosition()

distancePose calculateGlobalPosition ( const SensorReadings & front_data,
const SensorReadings & left_data,
const SensorReadings & right_data,
const SensorReadings & back_data,
double heading_deg,
float heading_tolerance = 40.0 )

Definition at line 44 of file distanceReset.cpp.

51{
52 lemlib::Pose current_pose = chassis.getPose();
53 double est_x = current_pose.x;
54 double est_y = current_pose.y;
55 bool use_pos_x_wall = (est_x >= 0);
56 bool use_pos_y_wall = (est_y >= 0);
57
58 bool using_odom_x = true;
59 bool using_odom_y = true;
60
61 struct SensorData { SensorConfig cfg; double dist_in; int confidence;};
62 const SensorData sensors[] = {
63 {front_sensor_cfg, front_data.dist_mm * MM_TO_IN, frontDistance.get_confidence()},
64 {left_sensor_cfg, left_data.dist_mm * MM_TO_IN, leftDistance.get_confidence()},
65 {right_sensor_cfg, right_data.dist_mm * MM_TO_IN, rightDistance.get_confidence()},
66 {back_sensor_cfg, back_data.dist_mm * MM_TO_IN, backDistance.get_confidence()}
67 };
68
69 auto is_valid = [&](int i) {
70 return (sensors[i].dist_in < MAX_SENSOR_RANGE &&
71 sensors[i].dist_in >= MIN_SENSOR_RANGE);
72 };
73
74 double norm_heading = std::fmod(heading_deg, 360.0);
75 if (norm_heading < 0) norm_heading += 360.0;
76 const double TOLERANCE = heading_tolerance;
77
78 std::vector<double> x_cands;
79 std::vector<double> y_cands;
80
81 auto get_global_offsets = [&](const SensorConfig& cfg, double heading_rad) {
82 double cos_h = std::cos(heading_rad);
83 double sin_h = std::sin(heading_rad);
84 double global_offset_x = (cfg.forward_offset * sin_h) + (cfg.strafe_offset * cos_h);
85 double global_offset_y = (cfg.forward_offset * cos_h) - (cfg.strafe_offset * sin_h);
86 return std::make_pair(global_offset_x, global_offset_y);
87 };
88
89
90 if (norm_heading <= TOLERANCE || norm_heading >= 360.0 - TOLERANCE) {
91 double angle_off_rad = (norm_heading <= TOLERANCE) ?
92 lemlib::degToRad(norm_heading) : lemlib::degToRad(norm_heading - 360.0);
93 double heading_rad = angle_off_rad;
94 double perp_dist_0 = sensors[0].dist_in * std::cos(angle_off_rad);
95 double perp_dist_3 = sensors[3].dist_in * std::cos(angle_off_rad);
96 double perp_dist_1 = sensors[1].dist_in * std::cos(angle_off_rad);
97 double perp_dist_2 = sensors[2].dist_in * std::cos(angle_off_rad);
98
99 auto offset_0 = get_global_offsets(sensors[0].cfg, heading_rad);
100 auto offset_1 = get_global_offsets(sensors[1].cfg, heading_rad);
101 auto offset_2 = get_global_offsets(sensors[2].cfg, heading_rad);
102 auto offset_3 = get_global_offsets(sensors[3].cfg, heading_rad);
103
104 if (is_valid(0) && use_pos_y_wall) { y_cands.push_back(HALF_HEIGHT - perp_dist_0 - offset_0.second); }
105 if (is_valid(3) && !use_pos_y_wall) { y_cands.push_back(-HALF_HEIGHT + perp_dist_3 - offset_3.second); }
106 if (is_valid(1) && !use_pos_x_wall) { x_cands.push_back(-HALF_WIDTH + perp_dist_1 - offset_1.first); }
107 if (is_valid(2) && use_pos_x_wall) { x_cands.push_back(HALF_WIDTH - perp_dist_2 - offset_2.first); }
108 }
109 else if (std::fabs(norm_heading - 180.0) <= TOLERANCE) {
110 double angle_off_rad = lemlib::degToRad(norm_heading - 180.0);
111 double heading_rad = lemlib::degToRad(norm_heading);
112
113 double perp_dist_0 = sensors[0].dist_in * std::cos(angle_off_rad);
114 double perp_dist_3 = sensors[3].dist_in * std::cos(angle_off_rad);
115 double perp_dist_1 = sensors[1].dist_in * std::cos(angle_off_rad);
116 double perp_dist_2 = sensors[2].dist_in * std::cos(angle_off_rad);
117
118 auto offset_0 = get_global_offsets(sensors[0].cfg, heading_rad);
119 auto offset_1 = get_global_offsets(sensors[1].cfg, heading_rad);
120 auto offset_2 = get_global_offsets(sensors[2].cfg, heading_rad);
121 auto offset_3 = get_global_offsets(sensors[3].cfg, heading_rad);
122
123
124 if (is_valid(0) && !use_pos_y_wall) { y_cands.push_back(-HALF_HEIGHT + perp_dist_0 - offset_0.second); }
125 if (is_valid(3) && use_pos_y_wall) { y_cands.push_back(HALF_HEIGHT - perp_dist_3 - offset_3.second); }
126 if (is_valid(1) && use_pos_x_wall) { x_cands.push_back(HALF_WIDTH - perp_dist_1 - offset_1.first); }
127 if (is_valid(2) && !use_pos_x_wall) { x_cands.push_back(-HALF_WIDTH + perp_dist_2 - offset_2.first); }
128 }
129
130 else if (std::fabs(norm_heading - 90.0) <= TOLERANCE) {
131 double angle_off_rad = lemlib::degToRad(norm_heading - 90.0);
132 double heading_rad = lemlib::degToRad(norm_heading);
133
134 double perp_dist_0 = sensors[0].dist_in * std::cos(angle_off_rad);
135 double perp_dist_3 = sensors[3].dist_in * std::cos(angle_off_rad);
136 double perp_dist_1 = sensors[1].dist_in * std::cos(angle_off_rad);
137 double perp_dist_2 = sensors[2].dist_in * std::cos(angle_off_rad);
138
139 auto offset_0 = get_global_offsets(sensors[0].cfg, heading_rad);
140 auto offset_1 = get_global_offsets(sensors[1].cfg, heading_rad);
141 auto offset_2 = get_global_offsets(sensors[2].cfg, heading_rad);
142 auto offset_3 = get_global_offsets(sensors[3].cfg, heading_rad);
143
144
145 if (is_valid(0) && use_pos_x_wall) { x_cands.push_back(HALF_WIDTH - perp_dist_0 - offset_0.first); }
146 if (is_valid(3) && !use_pos_x_wall) { x_cands.push_back(-HALF_WIDTH + perp_dist_3 - offset_3.first); }
147 if (is_valid(1) && use_pos_y_wall) { y_cands.push_back(HALF_HEIGHT - perp_dist_1 - offset_1.second); }
148 if (is_valid(2) && !use_pos_y_wall) { y_cands.push_back(-HALF_HEIGHT + perp_dist_2 - offset_2.second); }
149 }
150
151 else if (std::fabs(norm_heading - 270.0) <= TOLERANCE) {
152 double angle_off_rad = lemlib::degToRad(norm_heading - 270.0);
153 double heading_rad = lemlib::degToRad(norm_heading);
154
155 double perp_dist_0 = sensors[0].dist_in * std::cos(angle_off_rad);
156 double perp_dist_3 = sensors[3].dist_in * std::cos(angle_off_rad);
157 double perp_dist_1 = sensors[1].dist_in * std::cos(angle_off_rad);
158 double perp_dist_2 = sensors[2].dist_in * std::cos(angle_off_rad);
159
160 auto offset_0 = get_global_offsets(sensors[0].cfg, heading_rad);
161 auto offset_1 = get_global_offsets(sensors[1].cfg, heading_rad);
162 auto offset_2 = get_global_offsets(sensors[2].cfg, heading_rad);
163 auto offset_3 = get_global_offsets(sensors[3].cfg, heading_rad);
164
165 if (is_valid(0) && !use_pos_x_wall) { x_cands.push_back(-HALF_WIDTH + perp_dist_0 - offset_0.first); }
166 if (is_valid(3) && use_pos_x_wall) { x_cands.push_back(HALF_WIDTH - perp_dist_3 - offset_3.first); }
167 if (is_valid(1) && !use_pos_y_wall) { y_cands.push_back(-HALF_HEIGHT + perp_dist_1 - offset_1.second); }
168 if (is_valid(2) && use_pos_y_wall) { y_cands.push_back(HALF_HEIGHT - perp_dist_2 - offset_2.second); }
169 }
170
171 if (!x_cands.empty()) {
172 est_x = std::accumulate(x_cands.begin(), x_cands.end(), 0.0) / x_cands.size();
173 using_odom_x = false;
174 }
175
176 if (!y_cands.empty()) {
177 est_y = std::accumulate(y_cands.begin(), y_cands.end(), 0.0) / y_cands.size();
178 using_odom_y = false;
179 }
180
181
182 distancePose pose;
183 pose.x = est_x;
184 pose.y = est_y;
185 pose.using_odom_x = using_odom_x;
186 pose.using_odom_y = using_odom_y;
187 return pose;
188}
const double MAX_SENSOR_RANGE
const double MM_TO_IN
const SensorConfig left_sensor_cfg
const SensorConfig back_sensor_cfg
const SensorConfig right_sensor_cfg
const double HALF_WIDTH
const SensorConfig front_sensor_cfg
const double HALF_HEIGHT
const double MIN_SENSOR_RANGE
pros::Distance backDistance(7)
Chassis chassis(drivebase, lateral_controller, angular_controller, sensors, &throttle_curve, &steer_curve)
pros::Distance leftDistance(5)
pros::Distance rightDistance(6)
pros::Distance frontDistance(8)
double forward_offset

References back_sensor_cfg, backDistance(), chassis(), SensorReadings::dist_mm, SensorConfig::forward_offset, front_sensor_cfg, frontDistance(), HALF_HEIGHT, HALF_WIDTH, left_sensor_cfg, leftDistance(), MAX_SENSOR_RANGE, MIN_SENSOR_RANGE, MM_TO_IN, right_sensor_cfg, rightDistance(), SensorConfig::strafe_offset, distancePose::using_odom_x, distancePose::using_odom_y, distancePose::x, and distancePose::y.

Referenced by distanceReset(), and distanceReset().

◆ distanceReset() [1/2]

distancePose distanceReset ( bool left_use,
bool right_use,
bool front_use,
bool back_use,
bool setPose )

Definition at line 225 of file distanceReset.cpp.

225 {
226 double heading_deg = chassis.getPose().theta;
227
228 const int invalid_dist_mm = 10000;
229 const int invalid_confidence = 0;
230
231 // Direct readings based on boolean flags
232 SensorReadings front_data = front_use
233 ? SensorReadings{(double)frontDistance.get_distance(), frontDistance.get_object_size(), frontDistance.get_confidence()}
234 : SensorReadings{invalid_dist_mm, 0, invalid_confidence};
235
236 SensorReadings left_data = left_use
237 ? SensorReadings{(double)leftDistance.get_distance(), leftDistance.get_object_size(), leftDistance.get_confidence()}
238 : SensorReadings{invalid_dist_mm, 0, invalid_confidence};
239
240 SensorReadings right_data = right_use
241 ? SensorReadings{(double)rightDistance.get_distance(), rightDistance.get_object_size(), rightDistance.get_confidence()}
242 : SensorReadings{invalid_dist_mm, 0, invalid_confidence};
243
244 SensorReadings back_data = back_use
245 ? SensorReadings{(double)backDistance.get_distance(), backDistance.get_object_size(), backDistance.get_confidence()}
246 : SensorReadings{invalid_dist_mm, 0, invalid_confidence};
247
248 distancePose pose = calculateGlobalPosition(front_data, left_data, right_data, back_data, heading_deg);
249
250 if(setPose) {
251 chassis.setPose(pose.x, pose.y, chassis.getPose().theta);
252 }
253
254 return pose;
255}
distancePose calculateGlobalPosition(const SensorReadings &front_data, const SensorReadings &left_data, const SensorReadings &right_data, const SensorReadings &back_data, double heading_deg, float heading_tolerance=40.0)

References backDistance(), calculateGlobalPosition(), chassis(), frontDistance(), leftDistance(), rightDistance(), distancePose::x, and distancePose::y.

◆ distanceReset() [2/2]

distancePose distanceReset ( bool setPose = false,
bool filter = true,
float filter_range = 3.5,
float heading_tolerance = 40.0 )

Definition at line 191 of file distanceReset.cpp.

191 {
192 double heading_deg = chassis.getPose().theta;
193
194 const SensorReadings front_data = {(double)frontDistance.get_distance(), frontDistance.get_object_size(), frontDistance.get_confidence()};
195 const SensorReadings left_data = {(double)leftDistance.get_distance(), leftDistance.get_object_size(), leftDistance.get_confidence()};
196 const SensorReadings right_data = {(double)rightDistance.get_distance(), rightDistance.get_object_size(), rightDistance.get_confidence()};
197 const SensorReadings back_data = {(double)backDistance.get_distance(), backDistance.get_object_size(), backDistance.get_confidence()};
198
199 distancePose pose = calculateGlobalPosition(front_data, left_data, right_data, back_data, heading_deg, heading_tolerance);
200 if(filter)
201 {
202 if(std::abs(pose.x - chassis.getPose().x) > filter_range)
203 {
204 pose.x = chassis.getPose().x;
205 pose.using_odom_x = true;
206 std::cout << "Filtered X" << std::endl;
207 }
208 if(std::abs(pose.y - chassis.getPose().y) > filter_range)
209 {
210 pose.y = chassis.getPose().y;
211 pose.using_odom_y = true;
212 std::cout << "Filtered Y" << std::endl;
213 }
214
215 }
216 if(setPose) {
217 chassis.setPose(pose.x, pose.y, chassis.getPose().theta);
218 pros::delay(2);
219 }
220
221 std::cout << "Distance Reset Pose: " << pose.x << ", " << pose.y << ", using_odom_x: " << pose.using_odom_x << ", using_odom_y: " << pose.using_odom_y << std::endl;
222 return pose;
223}

References backDistance(), calculateGlobalPosition(), chassis(), frontDistance(), leftDistance(), rightDistance(), distancePose::using_odom_x, distancePose::using_odom_y, distancePose::x, and distancePose::y.

Referenced by awp_auton(), left_auton_split(), left_rush(), right_7_wing(), right_auton_split(), right_rush(), skills_auton(), and test_auton().

Variable Documentation

◆ back_sensor_cfg

const SensorConfig back_sensor_cfg = {-2.691 + 2.7, 3.879, 180}

Definition at line 29 of file distanceReset.cpp.

29{-2.691 + 2.7, 3.879, 180};

Referenced by calculateGlobalPosition().

◆ controller_screen_avilable

bool controller_screen_avilable

Definition at line 17 of file distanceReset.cpp.

◆ FIELD_HEIGHT

const double FIELD_HEIGHT = 3566.668 * MM_TO_IN

Definition at line 11 of file distanceReset.cpp.

◆ FIELD_WIDTH

const double FIELD_WIDTH = 3566.668 * MM_TO_IN

Definition at line 10 of file distanceReset.cpp.

◆ front_sensor_cfg

const SensorConfig front_sensor_cfg = {4.067 + 0.2, 5.756, 0}

Definition at line 26 of file distanceReset.cpp.

26{4.067 + 0.2, 5.756, 0};

Referenced by calculateGlobalPosition().

◆ HALF_HEIGHT

const double HALF_HEIGHT = FIELD_HEIGHT / 2.0

Definition at line 13 of file distanceReset.cpp.

Referenced by calculateGlobalPosition().

◆ HALF_WIDTH

const double HALF_WIDTH = FIELD_WIDTH / 2.0

Definition at line 12 of file distanceReset.cpp.

Referenced by calculateGlobalPosition().

◆ left_sensor_cfg

const SensorConfig left_sensor_cfg = {-0.5, -6.039 + 0.69, 90}

Definition at line 27 of file distanceReset.cpp.

27{-0.5, -6.039 + 0.69, 90};

Referenced by calculateGlobalPosition().

◆ MAX_SENSOR_RANGE

const double MAX_SENSOR_RANGE = 2000 * MM_TO_IN

Definition at line 14 of file distanceReset.cpp.

Referenced by calculateGlobalPosition().

◆ MIN_SENSOR_RANGE

const double MIN_SENSOR_RANGE = 0 * MM_TO_IN

Definition at line 15 of file distanceReset.cpp.

Referenced by calculateGlobalPosition().

◆ MM_TO_IN

const double MM_TO_IN = 0.0393701

Definition at line 9 of file distanceReset.cpp.

Referenced by calculateGlobalPosition().

◆ right_sensor_cfg

const SensorConfig right_sensor_cfg = {0.5, 6.039 - 1, -90}

Definition at line 28 of file distanceReset.cpp.

28{0.5, 6.039 - 1, -90};

Referenced by calculateGlobalPosition().