48 .resistance_coff_qd_15 =
getParam(controller_nh,
"resistance_coff_qd_15", 0.),
49 .resistance_coff_qd_16 =
getParam(controller_nh,
"resistance_coff_qd_16", 0.),
50 .resistance_coff_qd_18 =
getParam(controller_nh,
"resistance_coff_qd_18", 0.),
51 .resistance_coff_qd_30 =
getParam(controller_nh,
"resistance_coff_qd_30", 0.),
52 .g =
getParam(controller_nh,
"g", 0.),
53 .delay =
getParam(controller_nh,
"delay", 0.),
54 .wait_next_armor_delay =
getParam(controller_nh,
"wait_next_armor_delay", 0.105),
55 .wait_diagonal_armor_delay =
getParam(controller_nh,
"wait_diagonal_armor_delay", 0.105),
56 .dt =
getParam(controller_nh,
"dt", 0.),
57 .timeout =
getParam(controller_nh,
"timeout", 0.),
58 .ban_shoot_duration =
getParam(controller_nh,
"ban_shoot_duration", 0.0),
59 .gimbal_switch_duration =
getParam(controller_nh,
"gimbal_switch_duration", 0.0),
60 .max_switch_angle =
getParam(controller_nh,
"max_switch_angle", 40.0),
61 .min_switch_angle =
getParam(controller_nh,
"min_switch_angle", 2.0),
62 .min_shoot_beforehand_vel =
getParam(controller_nh,
"min_shoot_beforehand_vel", 4.5),
63 .max_chassis_angular_vel =
getParam(controller_nh,
"max_chassis_angular_vel", 8.5),
64 .track_rotate_target_delay =
getParam(controller_nh,
"track_rotate_target_delay", 0.),
65 .track_move_target_delay =
getParam(controller_nh,
"track_move_target_delay", 0.),
66 .min_fit_switch_count =
getParam(controller_nh,
"min_fit_switch_count", 3) };
86 d_srv_ =
new dynamic_reconfigure::Server<rm_gimbal_controllers::BulletSolverConfig>(controller_nh);
87 dynamic_reconfigure::Server<rm_gimbal_controllers::BulletSolverConfig>::CallbackType cb =
88 [
this](
auto&& PH1,
auto&& PH2) {
reconfigCB(PH1, PH2); };
106 double resistance_coff;
107 if (bullet_speed < 12.5)
109 else if (bullet_speed < 15.5)
111 else if (bullet_speed < 17)
113 else if (bullet_speed < 24)
117 return resistance_coff;
120 bool BulletSolver::solve(geometry_msgs::Point pos, geometry_msgs::Vector3 vel,
double bullet_speed,
double yaw,
121 double v_yaw,
double r1,
double r2,
double dz,
int armors_num,
double chassis_angular_vel_z)
127 double temp_z = pos.z;
128 double target_rho = std::sqrt(std::pow(pos.x, 2) + std::pow(pos.y, 2));
130 output_pitch_ = std::atan2(temp_z, std::sqrt(std::pow(pos.x, 2) + std::pow(pos.y, 2)));
131 double rough_fly_time =
148 double switch_armor_angle =
150 (acos(r / target_rho) - max_switch_angle +
155 if (((((yaw + v_yaw * rough_fly_time) >
output_yaw_ + switch_armor_angle) && v_yaw > 0.) ||
156 (((yaw + v_yaw * rough_fly_time) <
output_yaw_ - switch_armor_angle) && v_yaw < 0.)) &&
157 std::abs(v_yaw) >= 1.0)
170 r = armors_num == 4 ? r2 : r1;
171 z = armors_num == 4 ? pos.z + dz : pos.z;
195 target_pos_.x = pos.x - r * cos(atan2(pos.y, pos.x));
196 target_pos_.y = pos.y - r * sin(atan2(pos.y, pos.x));
209 while (error >= 0.001)
229 double target_pos_after_fly_time[2];
230 target_pos_after_fly_time[0] = pos.x + vel.x *
fly_time_;
231 target_pos_after_fly_time[1] = pos.y + vel.y *
fly_time_;
233 target_pos_after_fly_time[0] - r * cos(atan2(target_pos_after_fly_time[1], target_pos_after_fly_time[0]));
235 target_pos_after_fly_time[1] - r * sin(atan2(target_pos_after_fly_time[1], target_pos_after_fly_time[0]));
243 error = std::sqrt(std::pow(error_theta * target_rho, 2) + std::pow(error_z, 2));
246 if (count >= 20 || std::isnan(error))
258 geometry_msgs::Point pos, geometry_msgs::Vector3 vel,
double yaw,
259 double v_yaw,
double r1,
double r2,
double dz,
int armors_num)
261 double r = r1, z = pos.z;
269 armor_pos.x = pos.x - r * cos(yaw +
selected_armor_ * 2 * M_PI / armors_num);
270 armor_pos.y = pos.y - r * sin(yaw +
selected_armor_ * 2 * M_PI / armors_num);
272 armor_vel.x = vel.x + v_yaw * r * sin(yaw +
selected_armor_ * 2 * M_PI / armors_num);
273 armor_vel.y = vel.y - v_yaw * r * cos(yaw +
selected_armor_ * 2 * M_PI / armors_num);
288 double roll{}, pitch{}, yaw{};
289 quatToRPY(odom2pitch.transform.rotation, roll, pitch, yaw);
290 geometry_msgs::Point point_desire{}, point_real{};
292 int point_num = int(target_rho * 20);
293 for (
int i = 0; i <= point_num; i++)
295 double rt_bullet_rho = target_rho * i / point_num;
301 point_desire.x = rt_bullet_rho * std::cos(
output_yaw_) + odom2pitch.transform.translation.x;
302 point_desire.y = rt_bullet_rho * std::sin(
output_yaw_) + odom2pitch.transform.translation.y;
303 point_desire.z = rt_bullet_z + odom2pitch.transform.translation.z;
306 for (
int i = 0; i <= point_num; i++)
308 double rt_bullet_rho = target_rho * i / point_num;
314 point_real.x = rt_bullet_rho * std::cos(yaw) + odom2pitch.transform.translation.x;
315 point_real.y = rt_bullet_rho * std::sin(yaw) + odom2pitch.transform.translation.y;
316 point_real.z = rt_bullet_z + odom2pitch.transform.translation.z;
334 double r1,
double r2,
double dz,
int armors_num,
double yaw_real,
double pitch_real,
350 r = armors_num == 4 ? r2 : r1;
351 z = armors_num == 4 ? pos.z + dz : pos.z;
358 double bullet_x = bullet_rho * std::cos(yaw_real);
359 double bullet_y = bullet_rho * std::sin(yaw_real);
368 geometry_msgs::Point target_pos_after_fly_time_and_delay{};
369 target_pos_after_fly_time_and_delay.x =
372 target_pos_after_fly_time_and_delay.y =
375 target_pos_after_fly_time_and_delay.z = z + vel.z * (
fly_time_ + delay);
376 error = std::sqrt(std::pow(
target_pos_.x - target_pos_after_fly_time_and_delay.x, 2) +
377 std::pow(
target_pos_.y - target_pos_after_fly_time_and_delay.y, 2) +
378 std::pow(
target_pos_.z - target_pos_after_fly_time_and_delay.z, 2));
412 ROS_INFO(
"[Bullet Solver] Dynamic params change");
421 config.g = init_config.
g;
422 config.delay = init_config.
delay;
425 config.dt = init_config.
dt;
426 config.timeout = init_config.
timeout;
439 .resistance_coff_qd_15 = config.resistance_coff_qd_15,
440 .resistance_coff_qd_16 = config.resistance_coff_qd_16,
441 .resistance_coff_qd_18 = config.resistance_coff_qd_18,
442 .resistance_coff_qd_30 = config.resistance_coff_qd_30,
444 .delay = config.delay,
445 .wait_next_armor_delay = config.wait_next_armor_delay,
446 .wait_diagonal_armor_delay = config.wait_diagonal_armor_delay,
448 .timeout = config.timeout,
449 .ban_shoot_duration = config.ban_shoot_duration,
450 .gimbal_switch_duration = config.gimbal_switch_duration,
451 .max_switch_angle = config.max_switch_angle,
452 .min_switch_angle = config.min_switch_angle,
453 .min_shoot_beforehand_vel = config.min_shoot_beforehand_vel,
454 .max_chassis_angular_vel = config.max_chassis_angular_vel,
455 .track_rotate_target_delay = config.track_rotate_target_delay,
456 .track_move_target_delay = config.track_move_target_delay,
457 .min_fit_switch_count = config.min_fit_switch_count };