bullet_solver.cpp
Go to the documentation of this file.
1 /*******************************************************************************
2  * BSD 3-Clause License
3  *
4  * Copyright (c) 2021, Qiayuan Liao
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * * Redistributions of source code must retain the above copyright notice, this
11  * list of conditions and the following disclaimer.
12  *
13  * * Redistributions in binary form must reproduce the above copyright notice,
14  * this list of conditions and the following disclaimer in the documentation
15  * and/or other materials provided with the distribution.
16  *
17  * * Neither the name of the copyright holder nor the names of its
18  * contributors may be used to endorse or promote products derived from
19  * this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE
25  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *******************************************************************************/
33 
34 //
35 // Created by qiayuan on 8/14/20.
36 //
37 
39 #include <cmath>
40 #include <tf/transform_datatypes.h>
41 #include <rm_common/ori_tool.h>
42 
43 namespace rm_gimbal_controllers
44 {
46 {
47  config_ = { .resistance_coff_qd_10 = getParam(controller_nh, "resistance_coff_qd_10", 0.),
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) };
67  max_track_target_vel_ = getParam(controller_nh, "max_track_target_vel", 5.0);
68  switch_hysteresis_ = getParam(controller_nh, "switch_hysteresis", 1.0);
69  config_rt_buffer_.initRT(config_);
70 
71  marker_desire_.header.frame_id = "odom";
72  marker_desire_.ns = "model";
73  marker_desire_.action = visualization_msgs::Marker::ADD;
74  marker_desire_.type = visualization_msgs::Marker::POINTS;
75  marker_desire_.scale.x = 0.02;
76  marker_desire_.scale.y = 0.02;
77  marker_desire_.color.r = 1.0;
78  marker_desire_.color.g = 0.0;
79  marker_desire_.color.b = 0.0;
80  marker_desire_.color.a = 1.0;
81 
83  marker_real_.color.r = 0.0;
84  marker_real_.color.g = 1.0;
85 
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); };
89  d_srv_->setCallback(cb);
90 
91  path_desire_pub_.reset(
92  new realtime_tools::RealtimePublisher<visualization_msgs::Marker>(controller_nh, "model_desire", 10));
93  path_real_pub_.reset(
94  new realtime_tools::RealtimePublisher<visualization_msgs::Marker>(controller_nh, "model_real", 10));
96  new realtime_tools::RealtimePublisher<rm_msgs::ShootBeforehandCmd>(controller_nh, "shoot_beforehand_cmd", 10));
97  fly_time_pub_.reset(new realtime_tools::RealtimePublisher<std_msgs::Float64>(controller_nh, "fly_time", 10));
98 
100  controller_nh.subscribe<std_msgs::Bool>("/change", 10, &BulletSolver::identifiedTargetChangeCB, this);
101 }
102 
103 double BulletSolver::getResistanceCoefficient(double bullet_speed) const
104 {
105  // bullet_speed have 5 value:10,15,16,18,30
106  double resistance_coff;
107  if (bullet_speed < 12.5)
108  resistance_coff = config_.resistance_coff_qd_10;
109  else if (bullet_speed < 15.5)
110  resistance_coff = config_.resistance_coff_qd_15;
111  else if (bullet_speed < 17)
112  resistance_coff = config_.resistance_coff_qd_16;
113  else if (bullet_speed < 24)
114  resistance_coff = config_.resistance_coff_qd_18;
115  else
116  resistance_coff = config_.resistance_coff_qd_30;
117  return resistance_coff;
118 }
119 
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)
122 {
123  config_ = *config_rt_buffer_.readFromRT();
124  bullet_speed_ = bullet_speed;
126 
127  double temp_z = pos.z;
128  double target_rho = std::sqrt(std::pow(pos.x, 2) + std::pow(pos.y, 2));
129  output_yaw_ = std::atan2(pos.y, pos.x);
130  output_pitch_ = std::atan2(temp_z, std::sqrt(std::pow(pos.x, 2) + std::pow(pos.y, 2)));
131  double rough_fly_time =
132  (-std::log(1 - target_rho * resistance_coff_ / (bullet_speed_ * std::cos(output_pitch_)))) / resistance_coff_;
133  selected_armor_ = 0;
134  double r = r1;
135  double z = pos.z;
136  double max_switch_angle = config_.max_switch_angle / 180 * M_PI;
137  double min_switch_angle = config_.min_switch_angle / 180 * M_PI;
138  if (track_target_)
139  {
140  if (std::abs(v_yaw) >= max_track_target_vel_ + switch_hysteresis_)
141  track_target_ = false;
142  }
143  else
144  {
145  if (std::abs(v_yaw) <= max_track_target_vel_ - switch_hysteresis_)
146  track_target_ = true;
147  }
148  double switch_armor_angle =
149  track_target_ ?
150  (acos(r / target_rho) - max_switch_angle +
151  (-acos(r / target_rho) + (max_switch_angle + min_switch_angle)) * std::abs(v_yaw) / max_track_target_vel_) *
152  (1 - std::abs(chassis_angular_vel_z) / config_.max_chassis_angular_vel) +
153  min_switch_angle * std::abs(chassis_angular_vel_z) / config_.max_chassis_angular_vel :
154  min_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)
158  {
159  count_++;
161  {
162  count_ = 0;
164  }
166  {
169  selected_armor_ = v_yaw > 0. ? -1 : 1;
170  r = armors_num == 4 ? r2 : r1;
171  z = armors_num == 4 ? pos.z + dz : pos.z;
172  }
173  }
175  (((((yaw + selected_armor_ * 2 * M_PI / armors_num) + v_yaw * (rough_fly_time + config_.delay)) >
176  output_yaw_ + switch_armor_angle) &&
177  v_yaw > 0.) ||
178  ((((yaw + selected_armor_ * 2 * M_PI / armors_num) + v_yaw * (rough_fly_time + config_.delay)) <
179  output_yaw_ - switch_armor_angle) &&
180  v_yaw < 0.)) &&
182  if (track_target_)
183  yaw += v_yaw * config_.track_rotate_target_delay;
184  pos.x += vel.x * config_.track_move_target_delay;
185  pos.y += vel.y * config_.track_move_target_delay;
186  int count{};
187  double error = 999;
188  if (track_target_)
189  {
190  target_pos_.x = pos.x - r * cos(yaw + selected_armor_ * 2 * M_PI / armors_num);
191  target_pos_.y = pos.y - r * sin(yaw + selected_armor_ * 2 * M_PI / armors_num);
192  }
193  else
194  {
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));
197  if ((v_yaw > 1.0 && (yaw + v_yaw * (fly_time_ + config_.wait_next_armor_delay) +
198  selected_armor_ * 2 * M_PI / armors_num) > output_yaw_) ||
199  (v_yaw < -1.0 && (yaw + v_yaw * (fly_time_ + config_.wait_next_armor_delay) +
200  selected_armor_ * 2 * M_PI / armors_num) < output_yaw_))
201  selected_armor_ = v_yaw > 0. ? -2 : 2;
202  if (selected_armor_ % 2 == 0)
203  {
204  r = r1;
205  z = pos.z;
206  }
207  }
208  target_pos_.z = z;
209  while (error >= 0.001)
210  {
211  output_yaw_ = std::atan2(target_pos_.y, target_pos_.x);
212  output_pitch_ = std::atan2(temp_z, std::sqrt(std::pow(target_pos_.x, 2) + std::pow(target_pos_.y, 2)));
213  target_rho = std::sqrt(std::pow(target_pos_.x, 2) + std::pow(target_pos_.y, 2));
214  fly_time_ =
215  (-std::log(1 - target_rho * resistance_coff_ / (bullet_speed_ * std::cos(output_pitch_)))) / resistance_coff_;
216  double real_z = (bullet_speed_ * std::sin(output_pitch_) + (config_.g / resistance_coff_)) *
217  (1 - std::exp(-resistance_coff_ * fly_time_)) / resistance_coff_ -
219 
220  if (track_target_)
221  {
222  target_pos_.x =
223  pos.x + vel.x * fly_time_ - r * cos(yaw + v_yaw * fly_time_ + selected_armor_ * 2 * M_PI / armors_num);
224  target_pos_.y =
225  pos.y + vel.y * fly_time_ - r * sin(yaw + v_yaw * fly_time_ + selected_armor_ * 2 * M_PI / armors_num);
226  }
227  else
228  {
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_;
232  target_pos_.x =
233  target_pos_after_fly_time[0] - r * cos(atan2(target_pos_after_fly_time[1], target_pos_after_fly_time[0]));
234  target_pos_.y =
235  target_pos_after_fly_time[1] - r * sin(atan2(target_pos_after_fly_time[1], target_pos_after_fly_time[0]));
236  }
237  target_pos_.z = z + vel.z * fly_time_;
238 
239  double target_yaw = std::atan2(target_pos_.y, target_pos_.x);
240  double error_theta = target_yaw - output_yaw_;
241  double error_z = target_pos_.z - real_z;
242  temp_z += error_z;
243  error = std::sqrt(std::pow(error_theta * target_rho, 2) + std::pow(error_z, 2));
244  count++;
245 
246  if (count >= 20 || std::isnan(error))
247  return false;
248  }
249  if (fly_time_pub_->trylock())
250  {
251  fly_time_pub_->msg_.data = fly_time_;
252  fly_time_pub_->unlockAndPublish();
253  }
254  return true;
255 }
256 
257 void BulletSolver::getSelectedArmorPosAndVel(geometry_msgs::Point& armor_pos, geometry_msgs::Vector3& armor_vel,
258  geometry_msgs::Point pos, geometry_msgs::Vector3 vel, double yaw,
259  double v_yaw, double r1, double r2, double dz, int armors_num)
260 {
261  double r = r1, z = pos.z;
262  if (armors_num == 4 && selected_armor_ != 0)
263  {
264  r = r2;
265  z = pos.z + dz;
266  }
267  if (track_target_)
268  {
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);
271  armor_pos.z = z;
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);
274  armor_vel.z = vel.z;
275  }
276  else
277  {
278  armor_pos = pos;
279  armor_pos.z = z;
280  armor_vel = vel;
281  }
282 }
283 
284 void BulletSolver::bulletModelPub(const geometry_msgs::TransformStamped& odom2pitch, const ros::Time& time)
285 {
286  marker_desire_.points.clear();
287  marker_real_.points.clear();
288  double roll{}, pitch{}, yaw{};
289  quatToRPY(odom2pitch.transform.rotation, roll, pitch, yaw);
290  geometry_msgs::Point point_desire{}, point_real{};
291  double target_rho = std::sqrt(std::pow(target_pos_.x, 2) + std::pow(target_pos_.y, 2));
292  int point_num = int(target_rho * 20);
293  for (int i = 0; i <= point_num; i++)
294  {
295  double rt_bullet_rho = target_rho * i / point_num;
296  double fly_time = (-std::log(1 - rt_bullet_rho * resistance_coff_ / (bullet_speed_ * std::cos(output_pitch_)))) /
298  double rt_bullet_z = (bullet_speed_ * std::sin(output_pitch_) + (config_.g / resistance_coff_)) *
299  (1 - std::exp(-resistance_coff_ * fly_time)) / resistance_coff_ -
300  config_.g * fly_time / resistance_coff_;
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;
304  marker_desire_.points.push_back(point_desire);
305  }
306  for (int i = 0; i <= point_num; i++)
307  {
308  double rt_bullet_rho = target_rho * i / point_num;
309  double fly_time =
310  (-std::log(1 - rt_bullet_rho * resistance_coff_ / (bullet_speed_ * std::cos(-pitch)))) / resistance_coff_;
311  double rt_bullet_z = (bullet_speed_ * std::sin(-pitch) + (config_.g / resistance_coff_)) *
312  (1 - std::exp(-resistance_coff_ * fly_time)) / resistance_coff_ -
313  config_.g * fly_time / resistance_coff_;
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;
317  marker_real_.points.push_back(point_real);
318  }
319  marker_desire_.header.stamp = time;
320  if (path_desire_pub_->trylock())
321  {
323  path_desire_pub_->unlockAndPublish();
324  }
325  marker_real_.header.stamp = time;
326  if (path_real_pub_->trylock())
327  {
329  path_real_pub_->unlockAndPublish();
330  }
331 }
332 
333 double BulletSolver::getGimbalError(geometry_msgs::Point pos, geometry_msgs::Vector3 vel, double yaw, double v_yaw,
334  double r1, double r2, double dz, int armors_num, double yaw_real, double pitch_real,
335  double bullet_speed)
336 {
337  double delay;
338  if (track_target_)
339  delay = 0.;
340  else
342  double r, z;
343  if (selected_armor_ % 2 == 0)
344  {
345  r = r1;
346  z = pos.z;
347  }
348  else
349  {
350  r = armors_num == 4 ? r2 : r1;
351  z = armors_num == 4 ? pos.z + dz : pos.z;
352  }
353  double error;
354  if (track_target_)
355  {
356  double bullet_rho =
357  bullet_speed * std::cos(pitch_real) * (1 - std::exp(-resistance_coff_ * fly_time_)) / resistance_coff_;
358  double bullet_x = bullet_rho * std::cos(yaw_real);
359  double bullet_y = bullet_rho * std::sin(yaw_real);
360  double bullet_z = (bullet_speed * std::sin(pitch_real) + (config_.g / resistance_coff_)) *
361  (1 - std::exp(-resistance_coff_ * fly_time_)) / resistance_coff_ -
363  error = std::sqrt(std::pow(target_pos_.x - bullet_x, 2) + std::pow(target_pos_.y - bullet_y, 2) +
364  std::pow(target_pos_.z - bullet_z, 2));
365  }
366  else
367  {
368  geometry_msgs::Point target_pos_after_fly_time_and_delay{};
369  target_pos_after_fly_time_and_delay.x =
370  pos.x + vel.x * (fly_time_ + delay) -
371  r * cos(yaw + v_yaw * (fly_time_ + delay) + selected_armor_ * 2 * M_PI / armors_num);
372  target_pos_after_fly_time_and_delay.y =
373  pos.y + vel.y * (fly_time_ + delay) -
374  r * sin(yaw + v_yaw * (fly_time_ + delay) + selected_armor_ * 2 * M_PI / armors_num);
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));
379  }
380  return error;
381 }
382 
383 void BulletSolver::identifiedTargetChangeCB(const std_msgs::BoolConstPtr& msg)
384 {
385  if (msg->data)
387 }
388 
389 void BulletSolver::judgeShootBeforehand(const ros::Time& time, double v_yaw)
390 {
391  if (!track_target_)
392  shoot_beforehand_cmd_ = rm_msgs::ShootBeforehandCmd::JUDGE_BY_ERROR;
394  shoot_beforehand_cmd_ = rm_msgs::ShootBeforehandCmd::BAN_SHOOT;
396  std::abs(v_yaw) > config_.min_shoot_beforehand_vel)
397  shoot_beforehand_cmd_ = rm_msgs::ShootBeforehandCmd::ALLOW_SHOOT;
399  shoot_beforehand_cmd_ = rm_msgs::ShootBeforehandCmd::BAN_SHOOT;
400  else
401  shoot_beforehand_cmd_ = rm_msgs::ShootBeforehandCmd::JUDGE_BY_ERROR;
402  if (shoot_beforehand_cmd_pub_->trylock())
403  {
404  shoot_beforehand_cmd_pub_->msg_.stamp = time;
406  shoot_beforehand_cmd_pub_->unlockAndPublish();
407  }
408 }
409 
410 void BulletSolver::reconfigCB(rm_gimbal_controllers::BulletSolverConfig& config, uint32_t /*unused*/)
411 {
412  ROS_INFO("[Bullet Solver] Dynamic params change");
414  {
415  Config init_config = *config_rt_buffer_.readFromNonRT(); // config init use yaml
416  config.resistance_coff_qd_10 = init_config.resistance_coff_qd_10;
417  config.resistance_coff_qd_15 = init_config.resistance_coff_qd_15;
418  config.resistance_coff_qd_16 = init_config.resistance_coff_qd_16;
419  config.resistance_coff_qd_18 = init_config.resistance_coff_qd_18;
420  config.resistance_coff_qd_30 = init_config.resistance_coff_qd_30;
421  config.g = init_config.g;
422  config.delay = init_config.delay;
423  config.wait_next_armor_delay = init_config.wait_next_armor_delay;
424  config.wait_diagonal_armor_delay = init_config.wait_diagonal_armor_delay;
425  config.dt = init_config.dt;
426  config.timeout = init_config.timeout;
427  config.ban_shoot_duration = init_config.ban_shoot_duration;
428  config.gimbal_switch_duration = init_config.gimbal_switch_duration;
429  config.max_switch_angle = init_config.max_switch_angle;
430  config.min_switch_angle = init_config.min_switch_angle;
431  config.min_shoot_beforehand_vel = init_config.min_shoot_beforehand_vel;
432  config.max_chassis_angular_vel = init_config.max_chassis_angular_vel;
433  config.track_rotate_target_delay = init_config.track_rotate_target_delay;
434  config.track_move_target_delay = init_config.track_move_target_delay;
435  config.min_fit_switch_count = init_config.min_fit_switch_count;
437  }
438  Config config_non_rt{ .resistance_coff_qd_10 = config.resistance_coff_qd_10,
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,
443  .g = config.g,
444  .delay = config.delay,
445  .wait_next_armor_delay = config.wait_next_armor_delay,
446  .wait_diagonal_armor_delay = config.wait_diagonal_armor_delay,
447  .dt = config.dt,
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 };
458  config_rt_buffer_.writeFromNonRT(config_non_rt);
459 }
460 } // namespace rm_gimbal_controllers
rm_gimbal_controllers::Config::wait_next_armor_delay
double wait_next_armor_delay
Definition: bullet_solver.h:121
rm_gimbal_controllers::BulletSolver::output_pitch_
double output_pitch_
Definition: bullet_solver.h:134
rm_gimbal_controllers::BulletSolver::shoot_beforehand_cmd_pub_
std::shared_ptr< realtime_tools::RealtimePublisher< rm_msgs::ShootBeforehandCmd > > shoot_beforehand_cmd_pub_
Definition: bullet_solver.h:126
rm_gimbal_controllers::BulletSolver::count_
int count_
Definition: bullet_solver.h:140
rm_gimbal_controllers::Config::resistance_coff_qd_16
double resistance_coff_qd_16
Definition: bullet_solver.h:120
rm_gimbal_controllers::Config::min_fit_switch_count
int min_fit_switch_count
Definition: bullet_solver.h:124
rm_gimbal_controllers::Config::ban_shoot_duration
double ban_shoot_duration
Definition: bullet_solver.h:122
rm_gimbal_controllers::BulletSolver::shoot_beforehand_cmd_
int shoot_beforehand_cmd_
Definition: bullet_solver.h:138
rm_gimbal_controllers::BulletSolver::fly_time_pub_
std::shared_ptr< realtime_tools::RealtimePublisher< std_msgs::Float64 > > fly_time_pub_
Definition: bullet_solver.h:127
rm_gimbal_controllers::BulletSolver::switch_armor_time_
ros::Time switch_armor_time_
Definition: bullet_solver.h:129
rm_gimbal_controllers::BulletSolver::fly_time_
double fly_time_
Definition: bullet_solver.h:136
rm_gimbal_controllers::BulletSolver::selected_armor_
int selected_armor_
Definition: bullet_solver.h:139
rm_gimbal_controllers::BulletSolver::output_yaw_
double output_yaw_
Definition: bullet_solver.h:134
rm_gimbal_controllers::BulletSolver::marker_desire_
visualization_msgs::Marker marker_desire_
Definition: bullet_solver.h:147
rm_gimbal_controllers::BulletSolver::target_pos_
geometry_msgs::Point target_pos_
Definition: bullet_solver.h:146
rm_gimbal_controllers::BulletSolver::marker_real_
visualization_msgs::Marker marker_real_
Definition: bullet_solver.h:148
rm_gimbal_controllers::BulletSolver::switch_hysteresis_
double switch_hysteresis_
Definition: bullet_solver.h:137
rm_gimbal_controllers::Config::resistance_coff_qd_18
double resistance_coff_qd_18
Definition: bullet_solver.h:120
rm_gimbal_controllers::BulletSolver::bulletModelPub
void bulletModelPub(const geometry_msgs::TransformStamped &odom2pitch, const ros::Time &time)
Definition: bullet_solver.cpp:315
rm_gimbal_controllers::Config::gimbal_switch_duration
double gimbal_switch_duration
Definition: bullet_solver.h:122
rm_gimbal_controllers::BulletSolver::getGimbalError
double getGimbalError(geometry_msgs::Point pos, geometry_msgs::Vector3 vel, double yaw, double v_yaw, double r1, double r2, double dz, int armors_num, double yaw_real, double pitch_real, double bullet_speed)
Definition: bullet_solver.cpp:364
rm_gimbal_controllers::BulletSolver::BulletSolver
BulletSolver(ros::NodeHandle &controller_nh)
Definition: bullet_solver.cpp:76
realtime_tools::RealtimePublisher
rm_gimbal_controllers::BulletSolver::config_
Config config_
Definition: bullet_solver.h:132
rm_gimbal_controllers::Config::resistance_coff_qd_15
double resistance_coff_qd_15
Definition: bullet_solver.h:120
rm_gimbal_controllers::Config::dt
double dt
Definition: bullet_solver.h:121
rm_gimbal_controllers::BulletSolver::identified_target_change_
bool identified_target_change_
Definition: bullet_solver.h:142
rm_gimbal_controllers::Config::wait_diagonal_armor_delay
double wait_diagonal_armor_delay
Definition: bullet_solver.h:121
rm_gimbal_controllers::BulletSolver::identified_target_change_sub_
ros::Subscriber identified_target_change_sub_
Definition: bullet_solver.h:128
rm_gimbal_controllers::BulletSolver::config_rt_buffer_
realtime_tools::RealtimeBuffer< Config > config_rt_buffer_
Definition: bullet_solver.h:130
rm_gimbal_controllers::BulletSolver::identifiedTargetChangeCB
void identifiedTargetChangeCB(const std_msgs::BoolConstPtr &msg)
Definition: bullet_solver.cpp:414
rm_gimbal_controllers::BulletSolver::bullet_speed_
double bullet_speed_
Definition: bullet_solver.h:135
rm_gimbal_controllers::Config::resistance_coff_qd_30
double resistance_coff_qd_30
Definition: bullet_solver.h:121
rm_gimbal_controllers::Config::delay
double delay
Definition: bullet_solver.h:121
rm_gimbal_controllers::BulletSolver::path_desire_pub_
std::shared_ptr< realtime_tools::RealtimePublisher< visualization_msgs::Marker > > path_desire_pub_
Definition: bullet_solver.h:124
rm_gimbal_controllers
Definition: bullet_solver.h:54
rm_gimbal_controllers::BulletSolver::getResistanceCoefficient
double getResistanceCoefficient(double bullet_speed) const
Definition: bullet_solver.cpp:134
rm_gimbal_controllers::BulletSolver::judgeShootBeforehand
void judgeShootBeforehand(const ros::Time &time, double v_yaw)
Definition: bullet_solver.cpp:420
ros::NodeHandle::subscribe
Subscriber subscribe(const std::string &topic, uint32_t queue_size, const boost::function< void(C)> &callback, const VoidConstPtr &tracked_object=VoidConstPtr(), const TransportHints &transport_hints=TransportHints())
rm_gimbal_controllers::BulletSolver::dynamic_reconfig_initialized_
bool dynamic_reconfig_initialized_
Definition: bullet_solver.h:144
rm_gimbal_controllers::BulletSolver::max_track_target_vel_
double max_track_target_vel_
Definition: bullet_solver.h:133
transform_datatypes.h
ros::Time
rm_gimbal_controllers::Config
Definition: bullet_solver.h:87
rm_gimbal_controllers::BulletSolver::resistance_coff_
double resistance_coff_
Definition: bullet_solver.h:135
rm_gimbal_controllers::BulletSolver::getSelectedArmorPosAndVel
void getSelectedArmorPosAndVel(geometry_msgs::Point &armor_pos, geometry_msgs::Vector3 &armor_vel, geometry_msgs::Point pos, geometry_msgs::Vector3 vel, double yaw, double v_yaw, double r1, double r2, double dz, int armors_num)
Definition: bullet_solver.cpp:288
getParam
T getParam(ros::NodeHandle &pnh, const std::string &param_name, const T &default_val)
rm_gimbal_controllers::Config::track_move_target_delay
double track_move_target_delay
Definition: bullet_solver.h:123
rm_gimbal_controllers::BulletSolver::path_real_pub_
std::shared_ptr< realtime_tools::RealtimePublisher< visualization_msgs::Marker > > path_real_pub_
Definition: bullet_solver.h:125
rm_gimbal_controllers::Config::timeout
double timeout
Definition: bullet_solver.h:121
rm_gimbal_controllers::BulletSolver::solve
bool solve(geometry_msgs::Point pos, geometry_msgs::Vector3 vel, double bullet_speed, double yaw, double v_yaw, double r1, double r2, double dz, int armors_num, double chassis_angular_vel_z)
Definition: bullet_solver.cpp:151
rm_gimbal_controllers::BulletSolver::track_target_
bool track_target_
Definition: bullet_solver.h:141
rm_gimbal_controllers::Config::min_shoot_beforehand_vel
double min_shoot_beforehand_vel
Definition: bullet_solver.h:122
rm_gimbal_controllers::BulletSolver::reconfigCB
void reconfigCB(rm_gimbal_controllers::BulletSolverConfig &config, uint32_t)
Definition: bullet_solver.cpp:441
rm_gimbal_controllers::Config::max_chassis_angular_vel
double max_chassis_angular_vel
Definition: bullet_solver.h:123
quatToRPY
void quatToRPY(const geometry_msgs::Quaternion &q, double &roll, double &pitch, double &yaw)
rm_gimbal_controllers::Config::resistance_coff_qd_10
double resistance_coff_qd_10
Definition: bullet_solver.h:120
DurationBase< Duration >::toSec
double toSec() const
rm_gimbal_controllers::Config::track_rotate_target_delay
double track_rotate_target_delay
Definition: bullet_solver.h:123
rm_gimbal_controllers::BulletSolver::is_in_delay_before_switch_
bool is_in_delay_before_switch_
Definition: bullet_solver.h:143
rm_gimbal_controllers::Config::g
double g
Definition: bullet_solver.h:121
ROS_INFO
#define ROS_INFO(...)
rm_gimbal_controllers::Config::max_switch_angle
double max_switch_angle
Definition: bullet_solver.h:122
ros::Duration
bullet_solver.h
ros::NodeHandle
ori_tool.h
ros::Time::now
static Time now()
rm_gimbal_controllers::BulletSolver::d_srv_
dynamic_reconfigure::Server< rm_gimbal_controllers::BulletSolverConfig > * d_srv_
Definition: bullet_solver.h:131
rm_gimbal_controllers::Config::min_switch_angle
double min_switch_angle
Definition: bullet_solver.h:122


rm_gimbal_controllers
Author(s): Qiayuan Liao
autogenerated on Sun May 4 2025 02:57:21