DbwNode.cpp
Go to the documentation of this file.
1 /*********************************************************************
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2018-2019 New Eagle
5  * Copyright (c) 2015-2018, Dataspeed Inc.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * * Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above
15  * copyright notice, this list of conditions and the following
16  * disclaimer in the documentation and/or other materials provided
17  * with the distribution.
18  * * Neither the name of Dataspeed Inc. nor the names of its
19  * contributors may be used to endorse or promote products derived
20  * from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE.
34  *********************************************************************/
35 
36 #include "DbwNode.h"
38 
39 namespace raptor_dbw_can
40 {
41 
43 {
44  priv_nh.getParam("dbw_dbc_file", dbcFile_);
45 
46  // Initialize enable state machine
47  prev_enable_ = true;
48  enable_ = false;
49  override_brake_ = false;
51  override_steering_ = false;
52  override_gear_ = false;
53  fault_brakes_ = false;
55  fault_steering_ = false;
56  fault_steering_cal_ = false;
57  fault_watchdog_ = false;
59  fault_watchdog_warned_ = false;
60  timeout_brakes_ = false;
62  timeout_steering_ = false;
63  enabled_brakes_ = false;
65  enabled_steering_ = false;
66  gear_warned_ = false;
67 
68  // Frame ID
69  frame_id_ = "base_footprint";
70  priv_nh.getParam("frame_id", frame_id_);
71 
72  // Buttons (enable/disable)
73  buttons_ = true;
74  priv_nh.getParam("buttons", buttons_);
75 
76 
77  // Ackermann steering parameters
78  acker_wheelbase_ = 2.8498; // 112.2 inches
79  acker_track_ = 1.5824; // 62.3 inches
80  steering_ratio_ = 14.8;
81  priv_nh.getParam("ackermann_wheelbase", acker_wheelbase_);
82  priv_nh.getParam("ackermann_track", acker_track_);
83  priv_nh.getParam("steering_ratio", steering_ratio_);
84 
85  // Initialize joint states
86  joint_state_.position.resize(JOINT_COUNT);
87  joint_state_.velocity.resize(JOINT_COUNT);
88  joint_state_.effort.resize(JOINT_COUNT);
89  joint_state_.name.resize(JOINT_COUNT);
90  joint_state_.name[JOINT_FL] = "wheel_fl"; // Front Left
91  joint_state_.name[JOINT_FR] = "wheel_fr"; // Front Right
92  joint_state_.name[JOINT_RL] = "wheel_rl"; // Rear Left
93  joint_state_.name[JOINT_RR] = "wheel_rr"; // Rear Right
94  joint_state_.name[JOINT_SL] = "steer_fl";
95  joint_state_.name[JOINT_SR] = "steer_fr";
96 
97  // Set up Publishers
98  pub_can_ = node.advertise<can_msgs::Frame>("can_tx", 10);
99  pub_brake_ = node.advertise<raptor_dbw_msgs::BrakeReport>("brake_report", 2);
100  pub_accel_pedal_ = node.advertise<raptor_dbw_msgs::AcceleratorPedalReport>("accelerator_pedal_report", 2);
101  pub_steering_ = node.advertise<raptor_dbw_msgs::SteeringReport>("steering_report", 2);
102  pub_gear_ = node.advertise<raptor_dbw_msgs::GearReport>("gear_report", 2);
103  pub_wheel_speeds_ = node.advertise<raptor_dbw_msgs::WheelSpeedReport>("wheel_speed_report", 2);
104  pub_wheel_positions_ = node.advertise<raptor_dbw_msgs::WheelPositionReport>("wheel_position_report", 2);
105  pub_tire_pressure_ = node.advertise<raptor_dbw_msgs::TirePressureReport>("tire_pressure_report", 2);
106  pub_surround_ = node.advertise<raptor_dbw_msgs::SurroundReport>("surround_report", 2);
107 
108  pub_low_voltage_system_ = node.advertise<raptor_dbw_msgs::LowVoltageSystemReport>("low_voltage_system_report", 2);
109 
110  pub_brake_2_report_ = node.advertise<raptor_dbw_msgs::Brake2Report>("brake_2_report", 2);
111  pub_steering_2_report_ = node.advertise<raptor_dbw_msgs::Steering2Report>("steering_2_report", 2);
112  pub_fault_actions_report_ = node.advertise<raptor_dbw_msgs::FaultActionsReport>("fault_actions_report", 2);
113  pub_hmi_global_enable_report_ = node.advertise<raptor_dbw_msgs::HmiGlobalEnableReport>("hmi_global_enable_report", 2);
114 
115  pub_imu_ = node.advertise<sensor_msgs::Imu>("imu/data_raw", 10);
116  pub_joint_states_ = node.advertise<sensor_msgs::JointState>("joint_states", 10);
117  pub_twist_ = node.advertise<geometry_msgs::TwistStamped>("twist", 10);
118  pub_vin_ = node.advertise<std_msgs::String>("vin", 1, true);
119  pub_driver_input_ = node.advertise<raptor_dbw_msgs::DriverInputReport>("driver_input_report", 2);
120  pub_misc_ = node.advertise<raptor_dbw_msgs::MiscReport>("misc_report", 2);
121  pub_sys_enable_ = node.advertise<std_msgs::Bool>("dbw_enabled", 1, true);
123 
124  // Set up Subscribers
125  sub_enable_ = node.subscribe("enable", 10, &DbwNode::recvEnable, this, ros::TransportHints().tcpNoDelay(true));
126  sub_disable_ = node.subscribe("disable", 10, &DbwNode::recvDisable, this, ros::TransportHints().tcpNoDelay(true));
127  sub_can_ = node.subscribe("can_rx", 100, &DbwNode::recvCAN, this, ros::TransportHints().tcpNoDelay(true));
128  sub_brake_ = node.subscribe("brake_cmd", 1, &DbwNode::recvBrakeCmd, this, ros::TransportHints().tcpNoDelay(true));
129  sub_accelerator_pedal_ = node.subscribe("accelerator_pedal_cmd", 1, &DbwNode::recvAcceleratorPedalCmd, this, ros::TransportHints().tcpNoDelay(true));
130  sub_steering_ = node.subscribe("steering_cmd", 1, &DbwNode::recvSteeringCmd, this, ros::TransportHints().tcpNoDelay(true));
131  sub_gear_ = node.subscribe("gear_cmd", 1, &DbwNode::recvGearCmd, this, ros::TransportHints().tcpNoDelay(true));
132  sub_misc_ = node.subscribe("misc_cmd", 1, &DbwNode::recvMiscCmd, this, ros::TransportHints().tcpNoDelay(true));
133  sub_global_enable_ = node.subscribe("global_enable_cmd", 1, &DbwNode::recvGlobalEnableCmd, this, ros::TransportHints().tcpNoDelay(true));
134 
135  pdu1_relay_pub_ = node.advertise<pdu_msgs::RelayCommand>("/pduB/relay_cmd", 1000);
136  count_ = 0;
137 
139 
140  // Set up Timer
141  timer_ = node.createTimer(ros::Duration(1 / 20.0), &DbwNode::timerCallback, this);
142 }
143 
145 {
146 }
147 
148 void DbwNode::recvEnable(const std_msgs::Empty::ConstPtr& msg)
149 {
150  enableSystem();
151 }
152 
153 void DbwNode::recvDisable(const std_msgs::Empty::ConstPtr& msg)
154 {
155  disableSystem();
156 }
157 
158 void DbwNode::recvCAN(const can_msgs::Frame::ConstPtr& msg)
159 {
160 
161  if (!msg->is_rtr && !msg->is_error) {
162  switch (msg->id) {
163  case ID_BRAKE_REPORT:
164  {
166 
167  if (msg->dlc >= message->GetDlc()) {
168  message->SetFrame(msg);
169 
170  bool faultCh1 = message->GetSignal("DBW_BrakeFault_Ch1")->GetResult() ? true : false;
171  bool faultCh2 = message->GetSignal("DBW_BrakeFault_Ch2")->GetResult() ? true : false;
172  bool brakeSystemFault = message->GetSignal("DBW_BrakeFault")->GetResult() ? true : false;
173  bool dbwSystemFault = brakeSystemFault;
174 
175  faultBrakes(faultCh1 && faultCh2);
176  faultWatchdog(dbwSystemFault, brakeSystemFault);
177 
178  overrideBrake(message->GetSignal("DBW_BrakeDriverActivity")->GetResult());
179  raptor_dbw_msgs::BrakeReport brakeReport;
180  brakeReport.header.stamp = msg->header.stamp;
181  brakeReport.pedal_position = message->GetSignal("DBW_BrakePdlDriverInput")->GetResult();
182  brakeReport.pedal_output = message->GetSignal("DBW_BrakePdlPosnFdbck")->GetResult();
183 
184  brakeReport.enabled = message->GetSignal("DBW_BrakeEnabled")->GetResult() ? true : false;
185  brakeReport.driver_activity = message->GetSignal("DBW_BrakeDriverActivity")->GetResult() ? true : false;
186 
187  brakeReport.fault_brake_system = brakeSystemFault;
188 
189  brakeReport.fault_ch2 = faultCh2;
190 
191  brakeReport.rolling_counter = message->GetSignal("DBW_BrakeRollingCntr")->GetResult();
192 
193  brakeReport.brake_torque_actual = message->GetSignal("DBW_BrakePcntTorqueActual")->GetResult();
194 
195  brakeReport.intervention_active = message->GetSignal("DBW_BrakeInterventionActv")->GetResult() ? true : false;
196  brakeReport.intervention_ready = message->GetSignal("DBW_BrakeInterventionReady")->GetResult() ? true : false;
197 
198  brakeReport.parking_brake.status = message->GetSignal("DBW_BrakeParkingBrkStatus")->GetResult();
199 
200  brakeReport.control_type.value = message->GetSignal("DBW_BrakeCtrlType")->GetResult();
201 
202  pub_brake_.publish(brakeReport);
203  if (faultCh1 || faultCh2) {
204  ROS_WARN_THROTTLE(5.0, "Brake fault. FLT1: %s FLT2: %s",
205  faultCh1 ? "true, " : "false,",
206  faultCh2 ? "true, " : "false,");
207  }
208  }
209  }
210  break;
211 
213  {
215  if (msg->dlc >= message->GetDlc()) {
216 
217  message->SetFrame(msg);
218 
219  bool faultCh1 = message->GetSignal("DBW_AccelPdlFault_Ch1")->GetResult() ? true : false;
220  bool faultCh2 = message->GetSignal("DBW_AccelPdlFault_Ch2")->GetResult() ? true : false;
221  bool accelPdlSystemFault = message->GetSignal("DBW_AccelPdlFault")->GetResult() ? true : false;
222  bool dbwSystemFault = accelPdlSystemFault;
223 
224  uint16_t positionFeedback = message->GetSignal("DBW_AccelPdlPosnFdbck")->GetResult();
225 
226  faultAcceleratorPedal(faultCh1 && faultCh2);
227  faultWatchdog(dbwSystemFault, accelPdlSystemFault);
228 
229  overrideAcceleratorPedal(message->GetSignal("DBW_AccelPdlDriverActivity")->GetResult());
230 
231  raptor_dbw_msgs::AcceleratorPedalReport accelPedalReprt;
232  accelPedalReprt.header.stamp = msg->header.stamp;
233  accelPedalReprt.pedal_input = message->GetSignal("DBW_AccelPdlDriverInput")->GetResult();
234  accelPedalReprt.pedal_output = message->GetSignal("DBW_AccelPdlPosnFdbck")->GetResult();
235  accelPedalReprt.enabled = message->GetSignal("DBW_AccelPdlEnabled")->GetResult() ? true : false;
236  accelPedalReprt.ignore_driver = message->GetSignal("DBW_AccelPdlIgnoreDriver")->GetResult() ? true : false;
237  accelPedalReprt.driver_activity = message->GetSignal("DBW_AccelPdlDriverActivity")->GetResult() ? true : false;
238  accelPedalReprt.torque_actual = message->GetSignal("DBW_AccelPcntTorqueActual")->GetResult();
239 
240  accelPedalReprt.control_type.value = message->GetSignal("DBW_AccelCtrlType")->GetResult();
241 
242  accelPedalReprt.rolling_counter = message->GetSignal("DBW_AccelPdlRollingCntr")->GetResult();
243 
244  accelPedalReprt.fault_accel_pedal_system = accelPdlSystemFault;
245 
246  accelPedalReprt.fault_ch1 = faultCh1;
247  accelPedalReprt.fault_ch2 = faultCh2;
248 
249  pub_accel_pedal_.publish(accelPedalReprt);
250 
251  if (faultCh1 || faultCh2) {
252  ROS_WARN_THROTTLE(5.0, "Accelerator Pedal fault. FLT1: %s FLT2: %s",
253  faultCh1 ? "true, " : "false,",
254  faultCh2 ? "true, " : "false,");
255  }
256  }
257  }
258  break;
259 
260  case ID_STEERING_REPORT:
261  {
263  if (msg->dlc >= message->GetDlc()) {
264 
265  message->SetFrame(msg);
266 
267  bool steeringSystemFault = message->GetSignal("DBW_SteeringFault")->GetResult() ? true : false;
268  bool dbwSystemFault = steeringSystemFault;
269 
270  faultSteering(steeringSystemFault);
271 
272  faultWatchdog(dbwSystemFault);
273  overrideSteering(message->GetSignal("DBW_SteeringDriverActivity")->GetResult() ? true : false);
274 
275  raptor_dbw_msgs::SteeringReport steeringReport;
276  steeringReport.header.stamp = msg->header.stamp;
277  steeringReport.steering_wheel_angle = message->GetSignal("DBW_SteeringWhlAngleAct")->GetResult() * (M_PI / 180);
278  steeringReport.steering_wheel_angle_cmd = message->GetSignal("DBW_SteeringWhlAngleDes")->GetResult() * (M_PI / 180);
279  steeringReport.steering_wheel_torque = message->GetSignal("DBW_SteeringWhlPcntTrqCmd")->GetResult() * 0.0625;
280 
281  steeringReport.enabled = message->GetSignal("DBW_SteeringEnabled")->GetResult() ? true : false;
282  steeringReport.driver_activity = message->GetSignal("DBW_SteeringDriverActivity")->GetResult() ? true : false;
283 
284  steeringReport.rolling_counter = message->GetSignal("DBW_SteeringRollingCntr")->GetResult();
285 
286  steeringReport.control_type.value = message->GetSignal("DBW_SteeringCtrlType")->GetResult();
287 
288  steeringReport.overheat_prevention_mode = message->GetSignal("DBW_OverheatPreventMode")->GetResult() ? true : false;
289 
290  steeringReport.steering_overheat_warning = message->GetSignal("DBW_SteeringOverheatWarning")->GetResult() ? true : false;
291 
292  steeringReport.fault_steering_system = steeringSystemFault;
293 
294  pub_steering_.publish(steeringReport);
295 
296  publishJointStates(msg->header.stamp, NULL, &steeringReport);
297 
298  if (steeringSystemFault) {
299  ROS_WARN_THROTTLE(5.0, "Steering fault: %s",
300  steeringSystemFault ? "true, " : "false,");
301  }
302  }
303  }
304  break;
305 
306  case ID_GEAR_REPORT:
307  {
309 
310  if (msg->dlc >= 1) {
311 
312  message->SetFrame(msg);
313 
314  bool driverActivity = message->GetSignal("DBW_PrndDriverActivity")->GetResult() ? true : false;
315 
316  overrideGear(driverActivity);
317  raptor_dbw_msgs::GearReport out;
318  out.header.stamp = msg->header.stamp;
319 
320  out.enabled = message->GetSignal("DBW_PrndCtrlEnabled")->GetResult() ? true : false;
321  out.state.gear = message->GetSignal("DBW_PrndStateActual")->GetResult();
322  out.driver_activity = driverActivity;
323  out.gear_select_system_fault = message->GetSignal("DBW_PrndFault")->GetResult() ? true : false;
324 
325  out.reject = message->GetSignal("DBW_PrndStateReject")->GetResult() ? true : false;
326 
327  pub_gear_.publish(out);
328  }
329  }
330  break;
331 
333  {
335 
336  if (msg->dlc >= message->GetDlc()) {
337  message->SetFrame(msg);
338 
339  raptor_dbw_msgs::WheelSpeedReport out;
340  out.header.stamp = msg->header.stamp;
341 
342  out.front_left = message->GetSignal("DBW_WhlSpd_FL")->GetResult();
343  out.front_right = message->GetSignal("DBW_WhlSpd_FR")->GetResult();
344  out.rear_left = message->GetSignal("DBW_WhlSpd_RL")->GetResult();
345  out.rear_right = message->GetSignal("DBW_WhlSpd_RR")->GetResult();
346 
348  publishJointStates(msg->header.stamp, &out, NULL);
349  }
350  }
351  break;
352 
354  {
356  if (msg->dlc >= message->GetDlc()) {
357 
358  message->SetFrame(msg);
359 
360  raptor_dbw_msgs::WheelPositionReport out;
361  out.header.stamp = msg->header.stamp;
362  out.front_left = message->GetSignal("DBW_WhlPulseCnt_FL")->GetResult();
363  out.front_right = message->GetSignal("DBW_WhlPulseCnt_FR")->GetResult();
364  out.rear_left = message->GetSignal("DBW_WhlPulseCnt_RL")->GetResult();
365  out.rear_right = message->GetSignal("DBW_WhlPulseCnt_RR")->GetResult();
366  out.wheel_pulses_per_rev = message->GetSignal("DBW_WhlPulsesPerRev")->GetResult();
367 
369  }
370  }
371  break;
372 
374  {
376 
377  if (msg->dlc >= message->GetDlc()) {
378 
379  message->SetFrame(msg);
380 
381  raptor_dbw_msgs::TirePressureReport out;
382  out.header.stamp = msg->header.stamp;
383  out.front_left = message->GetSignal("DBW_TirePressFL")->GetResult();
384  out.front_right = message->GetSignal("DBW_TirePressFR")->GetResult();
385  out.rear_left = message->GetSignal("DBW_TirePressRL")->GetResult();
386  out.rear_right = message->GetSignal("DBW_TirePressRR")->GetResult();
388  }
389  }
390  break;
391 
392  case ID_REPORT_SURROUND:
393  {
395 
396  if (msg->dlc >= message->GetDlc()) {
397 
398  message->SetFrame(msg);
399 
400  raptor_dbw_msgs::SurroundReport out;
401  out.header.stamp = msg->header.stamp;
402 
403  out.front_radar_object_distance = message->GetSignal("DBW_Reserved2")->GetResult();
404  out.rear_radar_object_distance = message->GetSignal("DBW_SonarRearDist")->GetResult();
405 
406  out.front_radar_distance_valid = message->GetSignal("DBW_Reserved3")->GetResult() ? true : false;
407  out.parking_sonar_data_valid = message->GetSignal("DBW_SonarVld")->GetResult() ? true : false;
408 
409  out.rear_right.status = message->GetSignal("DBW_SonarArcNumRR")->GetResult();
410  out.rear_left.status = message->GetSignal("DBW_SonarArcNumRL")->GetResult();
411  out.rear_center.status = message->GetSignal("DBW_SonarArcNumRC")->GetResult();
412 
413  out.front_right.status = message->GetSignal("DBW_SonarArcNumFR")->GetResult();
414  out.front_left.status = message->GetSignal("DBW_SonarArcNumFL")->GetResult();
415  out.front_center.status = message->GetSignal("DBW_SonarArcNumFC")->GetResult();
416 
417  pub_surround_.publish(out);
418  }
419  }
420  break;
421 
422  case ID_VIN:
423  {
425 
426  if (msg->dlc >= message->GetDlc()) {
427 
428  message->SetFrame(msg);
429 
430  if (message->GetSignal("DBW_VinMultiplexor")->GetResult() == VIN_MUX_VIN0) {
431  vin_.push_back(message->GetSignal("DBW_VinDigit_01")->GetResult());
432  vin_.push_back(message->GetSignal("DBW_VinDigit_02")->GetResult());
433  vin_.push_back(message->GetSignal("DBW_VinDigit_03")->GetResult());
434  vin_.push_back(message->GetSignal("DBW_VinDigit_04")->GetResult());
435  vin_.push_back(message->GetSignal("DBW_VinDigit_05")->GetResult());
436  vin_.push_back(message->GetSignal("DBW_VinDigit_06")->GetResult());
437  vin_.push_back(message->GetSignal("DBW_VinDigit_07")->GetResult());
438  } else if (message->GetSignal("DBW_VinMultiplexor")->GetResult() == VIN_MUX_VIN1) {
439  vin_.push_back(message->GetSignal("DBW_VinDigit_08")->GetResult());
440  vin_.push_back(message->GetSignal("DBW_VinDigit_09")->GetResult());
441  vin_.push_back(message->GetSignal("DBW_VinDigit_10")->GetResult());
442  vin_.push_back(message->GetSignal("DBW_VinDigit_11")->GetResult());
443  vin_.push_back(message->GetSignal("DBW_VinDigit_12")->GetResult());
444  vin_.push_back(message->GetSignal("DBW_VinDigit_13")->GetResult());
445  vin_.push_back(message->GetSignal("DBW_VinDigit_14")->GetResult());
446  } else if (message->GetSignal("DBW_VinMultiplexor")->GetResult() == VIN_MUX_VIN2) {
447  vin_.push_back(message->GetSignal("DBW_VinDigit_15")->GetResult());
448  vin_.push_back(message->GetSignal("DBW_VinDigit_16")->GetResult());
449  vin_.push_back(message->GetSignal("DBW_VinDigit_17")->GetResult());
450  std_msgs::String msg; msg.data = vin_;
451  pub_vin_.publish(msg);
452  //ROS_INFO("Detected VIN: %s", vin_.c_str());
453  }
454  }
455  }
456  break;
457 
458  case ID_REPORT_IMU:
459  {
461 
462  if (msg->dlc >= message->GetDlc()) {
463 
464  message->SetFrame(msg);
465 
466  sensor_msgs::Imu out;
467  out.header.stamp = msg->header.stamp;
468  out.header.frame_id = frame_id_;
469 
470  out.angular_velocity.z = (double)message->GetSignal("DBW_ImuYawRate")->GetResult() * (M_PI / 180.0);
471 
472  out.linear_acceleration.x = (double)message->GetSignal("DBW_ImuAccelX")->GetResult();
473  out.linear_acceleration.y = (double)message->GetSignal("DBW_ImuAccelY")->GetResult();
474 
475  pub_imu_.publish(out);
476  }
477  }
478  break;
479 
481  {
483 
484  if (msg->dlc >= message->GetDlc()) {
485 
486  message->SetFrame(msg);
487 
488  raptor_dbw_msgs::DriverInputReport out;
489  out.header.stamp = msg->header.stamp;
490 
491  out.turn_signal.value = message->GetSignal("DBW_DrvInptTurnSignal")->GetResult();
492  out.high_beam_headlights.status = message->GetSignal("DBW_DrvInptHiBeam")->GetResult();
493  out.wiper.status = message->GetSignal("DBW_DrvInptWiper")->GetResult();
494 
495  out.cruise_resume_button = message->GetSignal("DBW_DrvInptCruiseResumeBtn")->GetResult() ? true : false;
496  out.cruise_cancel_button = message->GetSignal("DBW_DrvInptCruiseCancelBtn")->GetResult() ? true : false;
497  out.cruise_accel_button = message->GetSignal("DBW_DrvInptCruiseAccelBtn")->GetResult() ? true : false;
498  out.cruise_decel_button = message->GetSignal("DBW_DrvInptCruiseDecelBtn")->GetResult() ? true : false;
499  out.cruise_on_off_button = message->GetSignal("DBW_DrvInptCruiseOnOffBtn")->GetResult() ? true : false;
500 
501  out.adaptive_cruise_on_off_button = message->GetSignal("DBW_DrvInptAccOnOffBtn")->GetResult() ? true : false;
502  out.adaptive_cruise_increase_distance_button = message->GetSignal("DBW_DrvInptAccIncDistBtn")->GetResult() ? true : false;
503  out.adaptive_cruise_decrease_distance_button = message->GetSignal("DBW_DrvInptAccDecDistBtn")->GetResult() ? true : false;
504 
505  out.door_or_hood_ajar = message->GetSignal("DBW_OccupAnyDoorOrHoodAjar")->GetResult() ? true : false;
506 
507  out.airbag_deployed = message->GetSignal("DBW_OccupAnyAirbagDeployed")->GetResult() ? true : false;
508  out.any_seatbelt_unbuckled = message->GetSignal("DBW_OccupAnySeatbeltUnbuckled")->GetResult() ? true : false;
509 
511  }
512  }
513  break;
514 
515  case ID_MISC_REPORT:
516  {
518 
519  if (msg->dlc >= message->GetDlc()) {
520 
521  message->SetFrame(msg);
522 
523  raptor_dbw_msgs::MiscReport out;
524  out.header.stamp = msg->header.stamp;
525 
526  out.fuel_level = (double)message->GetSignal("DBW_MiscFuelLvl")->GetResult();
527 
528  out.drive_by_wire_enabled = (bool)message->GetSignal("DBW_MiscByWireEnabled")->GetResult();
529  out.vehicle_speed = (double)message->GetSignal("DBW_MiscVehicleSpeed")->GetResult();
530 
531  out.software_build_number = message->GetSignal("DBW_SoftwareBuildNumber")->GetResult();
532  out.general_actuator_fault = message->GetSignal("DBW_MiscFault")->GetResult() ? true : false;
533  out.by_wire_ready = message->GetSignal("DBW_MiscByWireReady")->GetResult() ? true : false;
534  out.general_driver_activity = message->GetSignal("DBW_MiscDriverActivity")->GetResult() ? true : false;
535  out.comms_fault = message->GetSignal("DBW_MiscAKitCommFault")->GetResult() ? true : false;
536 
537  out.ambient_temp = (double)message->GetSignal("DBW_AmbientTemp")->GetResult();
538 
539  pub_misc_.publish(out);
540  }
541  }
542  break;
543 
545  {
547 
548  if (msg->dlc >= message->GetDlc()) {
549 
550  message->SetFrame(msg);
551 
552  raptor_dbw_msgs::LowVoltageSystemReport lvSystemReport;
553  lvSystemReport.header.stamp = msg->header.stamp;
554 
555  lvSystemReport.vehicle_battery_volts = (double)message->GetSignal("DBW_LvVehBattVlt")->GetResult();
556  lvSystemReport.vehicle_battery_current = (double)message->GetSignal("DBW_LvBattCurr")->GetResult();
557  lvSystemReport.vehicle_alternator_current = (double)message->GetSignal("DBW_LvAlternatorCurr")->GetResult();
558 
559  lvSystemReport.dbw_battery_volts = (double)message->GetSignal("DBW_LvDbwBattVlt")->GetResult();
560  lvSystemReport.dcdc_current = (double)message->GetSignal("DBW_LvDcdcCurr")->GetResult();
561 
562  lvSystemReport.aux_inverter_contactor = message->GetSignal("DBW_LvInvtrContactorCmd")->GetResult() ? true : false;
563 
564  pub_low_voltage_system_.publish(lvSystemReport);
565  }
566  }
567  break;
568 
569  case ID_BRAKE_2_REPORT:
570  {
572 
573  if (msg->dlc >= message->GetDlc()) {
574  message->SetFrame(msg);
575 
576  raptor_dbw_msgs::Brake2Report brake2Report;
577  brake2Report.header.stamp = msg->header.stamp;
578 
579  brake2Report.brake_pressure = message->GetSignal("DBW_BrakePress_bar")->GetResult();
580 
581  brake2Report.estimated_road_slope = message->GetSignal("DBW_RoadSlopeEstimate")->GetResult();
582 
583  brake2Report.speed_set_point = message->GetSignal("DBW_SpeedSetpt")->GetResult();
584 
585  pub_brake_2_report_.publish(brake2Report);
586  }
587  }
588  break;
589 
591  {
593 
594  if (msg->dlc >= message->GetDlc()) {
595  message->SetFrame(msg);
596 
597  raptor_dbw_msgs::Steering2Report steering2Report;
598  steering2Report.header.stamp = msg->header.stamp;
599 
600  steering2Report.vehicle_curvature_actual = message->GetSignal("DBW_SteeringVehCurvatureAct")->GetResult();
601 
602  steering2Report.max_torque_driver = message->GetSignal("DBW_SteerTrq_Driver")->GetResult();
603 
604  steering2Report.max_torque_motor = message->GetSignal("DBW_SteerTrq_Motor")->GetResult();
605 
606  pub_steering_2_report_.publish(steering2Report);
607  }
608  }
609  break;
610 
612  {
614 
615  if (msg->dlc >= message->GetDlc()) {
616  message->SetFrame(msg);
617 
618  raptor_dbw_msgs::FaultActionsReport faultActionsReport;
619  faultActionsReport.header.stamp = msg->header.stamp;
620 
621  faultActionsReport.autonomous_disabled_no_brakes = message->GetSignal("DBW_FltAct_AutonDsblNoBrakes")->GetResult();
622 
623  faultActionsReport.autonomous_disabled_apply_brakes = message->GetSignal("DBW_FltAct_AutonDsblApplyBrakes")->GetResult();
624  faultActionsReport.can_gateway_disabled = message->GetSignal("DBW_FltAct_CANGatewayDsbl")->GetResult();
625  faultActionsReport.inverter_contactor_disabled = message->GetSignal("DBW_FltAct_InvtrCntctrDsbl")->GetResult();
626  faultActionsReport.prevent_enter_autonomous_mode = message->GetSignal("DBW_FltAct_PreventEnterAutonMode")->GetResult();
627  faultActionsReport.warn_driver_only = message->GetSignal("DBW_FltAct_WarnDriverOnly")->GetResult();
628 
629  pub_fault_actions_report_.publish(faultActionsReport);
630  }
631  }
632  break;
633 
634  case ID_BRAKE_CMD:
635  //ROS_WARN("DBW system: Another node on the CAN bus is commanding the vehicle!!! Subsystem: Brake. Id: 0x%03X", ID_BRAKE_CMD);
636  break;
638  //ROS_WARN("DBW system: Another node on the CAN bus is commanding the vehicle!!! Subsystem: Accelerator Pedal. Id: 0x%03X", ID_ACCELERATOR_PEDAL_CMD);
639  break;
640  case ID_STEERING_CMD:
641  //ROS_WARN("DBW system: Another node on the CAN bus is commanding the vehicle!!! Subsystem: Steering. Id: 0x%03X", ID_STEERING_CMD);
642  break;
643  case ID_GEAR_CMD:
644  //ROS_WARN("DBW system: Another node on the CAN bus is commanding the vehicle!!! Subsystem: Shifting. Id: 0x%03X", ID_GEAR_CMD);
645  break;
646  }
647  }
648 #if 0
649  ROS_INFO("ena: %s, clr: %s, brake: %s, Accelerator Pedal: %s, steering: %s, gear: %s",
650  enabled() ? "true " : "false",
651  clear() ? "true " : "false",
652  override_brake_ ? "true " : "false",
653  override_accelerator_pedal_ ? "true " : "false",
654  override_steering_ ? "true " : "false",
655  override_gear_ ? "true " : "false"
656  );
657 #endif
658 }
659 
660 void DbwNode::recvBrakeCmd(const raptor_dbw_msgs::BrakeCmd::ConstPtr& msg)
661 {
662  NewEagle::DbcMessage* message = dbwDbc_.GetMessage("AKit_BrakeRequest");
663 
664  message->GetSignal("AKit_BrakePedalReq")->SetResult(0);
665  message->GetSignal("AKit_BrakeCtrlEnblReq")->SetResult(0);
666  message->GetSignal("AKit_BrakeCtrlReqType")->SetResult(0);
667  message->GetSignal("AKit_BrakePcntTorqueReq")->SetResult(0);
668  message->GetSignal("AKit_SpeedModeDecelLim")->SetResult(0);
669  message->GetSignal("AKit_SpeedModeNegJerkLim")->SetResult(0);
670 
671  if (enabled()) {
672  if (msg->control_type.value == raptor_dbw_msgs::ActuatorControlMode::open_loop) {
673  message->GetSignal("AKit_BrakeCtrlReqType")->SetResult(0);
674  message->GetSignal("AKit_BrakePedalReq")->SetResult(msg->pedal_cmd);
675  } else if (msg->control_type.value == raptor_dbw_msgs::ActuatorControlMode::closed_loop_actuator) {
676  message->GetSignal("AKit_BrakeCtrlReqType")->SetResult(1);
677  message->GetSignal("AKit_BrakePcntTorqueReq")->SetResult(msg->torque_cmd);
678  } else if (msg->control_type.value == raptor_dbw_msgs::ActuatorControlMode::closed_loop_vehicle) {
679  message->GetSignal("AKit_BrakeCtrlReqType")->SetResult(2);
680  message->GetSignal("AKit_SpeedModeDecelLim")->SetResult(msg->decel_limit);
681  message->GetSignal("AKit_SpeedModeNegJerkLim")->SetResult(msg->decel_negative_jerk_limit);
682  } else {
683  message->GetSignal("AKit_BrakeCtrlReqType")->SetResult(0);
684  }
685 
686  if(msg->enable) {
687  message->GetSignal("AKit_BrakeCtrlEnblReq")->SetResult(1);
688  }
689 
690  }
691 
692  NewEagle::DbcSignal* cnt = message->GetSignal("AKit_BrakeRollingCntr");
693  cnt->SetResult(msg->rolling_counter);
694 
695  can_msgs::Frame frame = message->GetFrame();
696 
697  pub_can_.publish(frame);
698 }
699 
700 void DbwNode::recvAcceleratorPedalCmd(const raptor_dbw_msgs::AcceleratorPedalCmd::ConstPtr& msg)
701 {
702  NewEagle::DbcMessage* message = dbwDbc_.GetMessage("AKit_AccelPdlRequest");
703 
704  message->GetSignal("AKit_AccelPdlReq")->SetResult(0);
705  message->GetSignal("AKit_AccelPdlEnblReq")->SetResult(0);
706  message->GetSignal("Akit_AccelPdlIgnoreDriverOvrd")->SetResult(0);
707  message->GetSignal("AKit_AccelPdlRollingCntr")->SetResult(0);
708  message->GetSignal("AKit_AccelReqType")->SetResult(0);
709  message->GetSignal("AKit_AccelPcntTorqueReq")->SetResult(0);
710  message->GetSignal("AKit_AccelPdlChecksum")->SetResult(0);
711  message->GetSignal("AKit_SpeedReq")->SetResult(0);
712  message->GetSignal("AKit_SpeedModeRoadSlope")->SetResult(0);
713  message->GetSignal("AKit_SpeedModeAccelLim")->SetResult(0);
714  message->GetSignal("AKit_SpeedModePosJerkLim")->SetResult(0);
715 
716  if (enabled()) {
717 
718  if (msg->control_type.value == raptor_dbw_msgs::ActuatorControlMode::open_loop) {
719  message->GetSignal("AKit_AccelReqType")->SetResult(0);
720  message->GetSignal("AKit_AccelPdlReq")->SetResult(msg->pedal_cmd);
721  } else if (msg->control_type.value == raptor_dbw_msgs::ActuatorControlMode::closed_loop_actuator) {
722  message->GetSignal("AKit_AccelReqType")->SetResult(1);
723  message->GetSignal("AKit_AccelPcntTorqueReq")->SetResult(msg->torque_cmd);
724  } else if (msg->control_type.value == raptor_dbw_msgs::ActuatorControlMode::closed_loop_vehicle) {
725  message->GetSignal("AKit_AccelReqType")->SetResult(2);
726 
727  message->GetSignal("AKit_SpeedReq")->SetResult(msg->speed_cmd);
728  message->GetSignal("AKit_SpeedModeRoadSlope")->SetResult(msg->road_slope);
729  message->GetSignal("AKit_SpeedModeAccelLim")->SetResult(msg->accel_limit);
730  message->GetSignal("AKit_SpeedModePosJerkLim")->SetResult(msg->accel_positive_jerk_limit);
731  } else {
732  message->GetSignal("AKit_AccelReqType")->SetResult(0);
733  }
734 
735  if(msg->enable) {
736  message->GetSignal("AKit_AccelPdlEnblReq")->SetResult(1);
737  }
738  }
739 
740  NewEagle::DbcSignal* cnt = message->GetSignal("AKit_AccelPdlRollingCntr");
741  cnt->SetResult(msg->rolling_counter);
742 
743  if (msg->ignore) {
744  message->GetSignal("Akit_AccelPdlIgnoreDriverOvrd")->SetResult(1);
745  }
746 
747  can_msgs::Frame frame = message->GetFrame();
748 
749  pub_can_.publish(frame);
750 }
751 
752 void DbwNode::recvSteeringCmd(const raptor_dbw_msgs::SteeringCmd::ConstPtr& msg)
753 {
754  NewEagle::DbcMessage* message = dbwDbc_.GetMessage("AKit_SteeringRequest");
755 
756  message->GetSignal("AKit_SteeringWhlAngleReq")->SetResult(0);
757  message->GetSignal("AKit_SteeringWhlAngleVelocityLim")->SetResult(0);
758  message->GetSignal("AKit_SteerCtrlEnblReq")->SetResult(0);
759  message->GetSignal("AKit_SteeringWhlIgnoreDriverOvrd")->SetResult(0);
760  message->GetSignal("AKit_SteeringWhlPcntTrqReq")->SetResult(0);
761  message->GetSignal("AKit_SteeringReqType")->SetResult(0);
762  message->GetSignal("AKit_SteeringVehCurvatureReq")->SetResult(0);
763  message->GetSignal("AKit_SteeringChecksum")->SetResult(0);
764 
765  if (enabled()) {
766  if (msg->control_type.value == raptor_dbw_msgs::ActuatorControlMode::open_loop) {
767  message->GetSignal("AKit_SteeringReqType")->SetResult(0);
768  message->GetSignal("AKit_SteeringWhlPcntTrqReq")->SetResult(msg->torque_cmd);
769  } else if (msg->control_type.value == raptor_dbw_msgs::ActuatorControlMode::closed_loop_actuator) {
770  message->GetSignal("AKit_SteeringReqType")->SetResult(1);
771  double scmd = std::max((float)-470.0, std::min((float)470.0, (float)(msg->angle_cmd * (180 / M_PI * 1.0))));
772  message->GetSignal("AKit_SteeringWhlAngleReq")->SetResult(scmd);
773  } else if (msg->control_type.value == raptor_dbw_msgs::ActuatorControlMode::closed_loop_vehicle) {
774  message->GetSignal("AKit_SteeringReqType")->SetResult(2);
775  message->GetSignal("AKit_SteeringVehCurvatureReq")->SetResult(msg->vehicle_curvature_cmd);
776  } else {
777  message->GetSignal("AKit_SteeringReqType")->SetResult(0);
778  }
779 
780  if (fabsf(msg->angle_velocity) > 0)
781  {
782  uint16_t vcmd = std::max((float)1, std::min((float)254, (float)roundf(fabsf(msg->angle_velocity) * 180 / M_PI / 2)));
783 
784  message->GetSignal("AKit_SteeringWhlAngleVelocityLim")->SetResult(vcmd);
785  }
786  if(msg->enable) {
787  message->GetSignal("AKit_SteerCtrlEnblReq")->SetResult(1);
788  }
789  }
790 
791  if (msg->ignore) {
792  message->GetSignal("AKit_SteeringWhlIgnoreDriverOvrd")->SetResult(1);
793  }
794 
795  message->GetSignal("AKit_SteerRollingCntr")->SetResult(msg->rolling_counter);
796 
797  can_msgs::Frame frame = message->GetFrame();
798 
799  pub_can_.publish(frame);
800 }
801 
802 void DbwNode::recvGearCmd(const raptor_dbw_msgs::GearCmd::ConstPtr& msg)
803 {
804  NewEagle::DbcMessage* message = dbwDbc_.GetMessage("AKit_PrndRequest");
805 
806  message->GetSignal("AKit_PrndCtrlEnblReq")->SetResult(0);
807  message->GetSignal("AKit_PrndStateReq")->SetResult(0);
808  message->GetSignal("AKit_PrndChecksum")->SetResult(0);
809 
810  if (enabled()) {
811  if(msg->enable)
812  {
813  message->GetSignal("AKit_PrndCtrlEnblReq")->SetResult(1);
814  }
815 
816  message->GetSignal("AKit_PrndStateReq")->SetResult(msg->cmd.gear);
817  }
818 
819  message->GetSignal("AKit_PrndRollingCntr")->SetResult(msg->rolling_counter);
820 
821  can_msgs::Frame frame = message->GetFrame();
822 
823  pub_can_.publish(frame);
824 }
825 
826 void DbwNode::recvGlobalEnableCmd(const raptor_dbw_msgs::GlobalEnableCmd::ConstPtr& msg)
827 {
828  NewEagle::DbcMessage* message = dbwDbc_.GetMessage("AKit_GlobalEnbl");
829 
830  message->GetSignal("AKit_GlobalEnblRollingCntr")->SetResult(0);
831  message->GetSignal("AKit_GlobalByWireEnblReq")->SetResult(0);
832  message->GetSignal("AKit_EnblJoystickLimits")->SetResult(0);
833  message->GetSignal("AKit_SoftwareBuildNumber")->SetResult(0);
834  message->GetSignal("Akit_GlobalEnblChecksum")->SetResult(0);
835 
836  if (enabled()) {
837  if(msg->global_enable) {
838  message->GetSignal("AKit_GlobalByWireEnblReq")->SetResult(1);
839  }
840 
841  if(msg->enable_joystick_limits) {
842  message->GetSignal("AKit_EnblJoystickLimits")->SetResult(1);
843  }
844 
845  message->GetSignal("AKit_SoftwareBuildNumber")->SetResult(msg->ecu_build_number);
846  }
847 
848  message->GetSignal("AKit_GlobalEnblRollingCntr")->SetResult(msg->rolling_counter);
849 
850  can_msgs::Frame frame = message->GetFrame();
851 
852  pub_can_.publish(frame);
853 }
854 
855 void DbwNode::recvMiscCmd(const raptor_dbw_msgs::MiscCmd::ConstPtr& msg)
856 {
857  NewEagle::DbcMessage* message = dbwDbc_.GetMessage("AKit_OtherActuators");
858 
859  message->GetSignal("AKit_TurnSignalReq")->SetResult(0);
860  message->GetSignal("AKit_RightRearDoorReq")->SetResult(0);
861  message->GetSignal("AKit_HighBeamReq")->SetResult(0);
862  message->GetSignal("AKit_FrontWiperReq")->SetResult(0);
863  message->GetSignal("AKit_RearWiperReq")->SetResult(0);
864  message->GetSignal("AKit_IgnitionReq")->SetResult(0);
865  message->GetSignal("AKit_LeftRearDoorReq")->SetResult(0);
866  message->GetSignal("AKit_LiftgateDoorReq")->SetResult(0);
867  message->GetSignal("AKit_BlockBasicCruiseCtrlBtns")->SetResult(0);
868  message->GetSignal("AKit_BlockAdapCruiseCtrlBtns")->SetResult(0);
869  message->GetSignal("AKit_BlockTurnSigStalkInpts")->SetResult(0);
870  message->GetSignal("AKit_OtherChecksum")->SetResult(0);
871  message->GetSignal("AKit_HornReq")->SetResult(0);
872  message->GetSignal("AKit_LowBeamReq")->SetResult(0);
873 
874  if (enabled()) {
875 
876  message->GetSignal("AKit_TurnSignalReq")->SetResult(msg->cmd.value);
877 
878  message->GetSignal("AKit_RightRearDoorReq")->SetResult(msg->door_request_right_rear.value);
879  message->GetSignal("AKit_HighBeamReq")->SetResult(msg->high_beam_cmd.status);
880 
881  message->GetSignal("AKit_FrontWiperReq")->SetResult(msg->front_wiper_cmd.status);
882  message->GetSignal("AKit_RearWiperReq")->SetResult(msg->rear_wiper_cmd.status);
883 
884  message->GetSignal("AKit_IgnitionReq")->SetResult(msg->ignition_cmd.status);
885 
886  message->GetSignal("AKit_LeftRearDoorReq")->SetResult(msg->door_request_left_rear.value);
887  message->GetSignal("AKit_LiftgateDoorReq")->SetResult(msg->door_request_lift_gate.value);
888 
889  message->GetSignal("AKit_BlockBasicCruiseCtrlBtns")->SetResult(msg->block_standard_cruise_buttons);
890  message->GetSignal("AKit_BlockAdapCruiseCtrlBtns")->SetResult(msg->block_adaptive_cruise_buttons);
891  message->GetSignal("AKit_BlockTurnSigStalkInpts")->SetResult(msg->block_turn_signal_stalk);
892 
893  message->GetSignal("AKit_HornReq")->SetResult(msg->horn_cmd);
894  message->GetSignal("AKit_LowBeamReq")->SetResult(msg->low_beam_cmd.status);
895  }
896 
897  message->GetSignal("AKit_OtherRollingCntr")->SetResult(msg->rolling_counter);
898 
899  can_msgs::Frame frame = message->GetFrame();
900 
901  pub_can_.publish(frame);
902 }
903 
905 {
906  bool change = false;
907  bool en = enabled();
908  if (prev_enable_ != en) {
909  std_msgs::Bool msg;
910  msg.data = en;
912  change = true;
913  }
914  prev_enable_ = en;
915  return change;
916 }
917 
919 {
920  if (clear()) {
921  can_msgs::Frame out;
922  out.is_extended = false;
923 
924  if (override_brake_) {
925  // Might have an issue with WatchdogCntr when these are set.
926  NewEagle::DbcMessage* message = dbwDbc_.GetMessage("AKit_BrakeRequest");
927  message->GetSignal("AKit_BrakePedalReq")->SetResult(0);
928  message->GetSignal("AKit_BrakeCtrlEnblReq")->SetResult(0);
929  //message->GetSignal("AKit_BrakePedalCtrlMode")->SetResult(0);
930  pub_can_.publish(message->GetFrame());
931  }
932 
934  {
935  // Might have an issue with WatchdogCntr when these are set.
936  NewEagle::DbcMessage* message = dbwDbc_.GetMessage("AKit_AccelPdlRequest");
937  message->GetSignal("AKit_AccelPdlReq")->SetResult(0);
938  message->GetSignal("AKit_AccelPdlEnblReq")->SetResult(0);
939  message->GetSignal("Akit_AccelPdlIgnoreDriverOvrd")->SetResult(0);
940  //message->GetSignal("AKit_AccelPdlCtrlMode")->SetResult(0);
941  pub_can_.publish(message->GetFrame());
942  }
943 
944  if (override_steering_) {
945  // Might have an issue with WatchdogCntr when these are set.
946  NewEagle::DbcMessage* message = dbwDbc_.GetMessage("AKit_SteeringRequest");
947  message->GetSignal("AKit_SteeringWhlAngleReq")->SetResult(0);
948  message->GetSignal("AKit_SteeringWhlAngleVelocityLim")->SetResult(0);
949  message->GetSignal("AKit_SteeringWhlIgnoreDriverOvrd")->SetResult(0);
950  message->GetSignal("AKit_SteeringWhlPcntTrqReq")->SetResult(0);
951  //message->GetSignal("AKit_SteeringWhlCtrlMode")->SetResult(0);
952  //message->GetSignal("AKit_SteeringWhlCmdType")->SetResult(0);
953 
954  pub_can_.publish(message->GetFrame());
955  }
956 
957  if (override_gear_) {
958  NewEagle::DbcMessage* message = dbwDbc_.GetMessage("AKit_GearRequest");
959  message->GetSignal("AKit_PrndStateCmd")->SetResult(0);
960  message->GetSignal("AKit_PrndChecksum")->SetResult(0);
961  pub_can_.publish(message->GetFrame());
962  }
963  }
964 }
965 
967 {
968  if (!enable_) {
969  if (fault()) {
970  if (fault_steering_cal_) {
971  ROS_WARN("DBW system not enabled. Steering calibration fault.");
972  }
973  if (fault_brakes_) {
974  ROS_WARN("DBW system not enabled. Braking fault.");
975  }
977  ROS_WARN("DBW system not enabled. Accelerator Pedal fault.");
978  }
979  if (fault_steering_) {
980  ROS_WARN("DBW system not enabled. Steering fault.");
981  }
982  if (fault_watchdog_) {
983  ROS_WARN("DBW system not enabled. Watchdog fault.");
984  }
985  } else {
986  enable_ = true;
987  if (publishDbwEnabled()) {
988  ROS_INFO("DBW system enabled.");
989  } else {
990  ROS_INFO("DBW system enable requested. Waiting for ready.");
991  }
992  }
993  }
994 }
995 
997 {
998  if (enable_) {
999  enable_ = false;
1001  ROS_WARN("DBW system disabled.");
1002  }
1003 }
1004 
1006 {
1007  if (enable_) {
1008  enable_ = false;
1010  ROS_WARN("DBW system disabled. Cancel button pressed.");
1011  }
1012 }
1013 
1014 void DbwNode::overrideBrake(bool override)
1015 {
1016  bool en = enabled();
1017  if (override && en) {
1018  enable_ = false;
1019  }
1020  override_brake_ = override;
1021  if (publishDbwEnabled()) {
1022  if (en) {
1023  ROS_WARN("DBW system disabled. Driver override on brake/Accelerator Pedal pedal.");
1024  } else {
1025  ROS_INFO("DBW system enabled.");
1026  }
1027  }
1028 }
1029 
1031 {
1032  bool en = enabled();
1033  if (override && en) {
1034  enable_ = false;
1035  }
1036  override_accelerator_pedal_ = override;
1037  if (publishDbwEnabled()) {
1038  if (en) {
1039  ROS_WARN("DBW system disabled. Driver override on brake/Accelerator Pedal pedal.");
1040  } else {
1041  ROS_INFO("DBW system enabled.");
1042  }
1043  }
1044 }
1045 
1046 void DbwNode::overrideSteering(bool override)
1047 {
1048  bool en = enabled();
1049  if (override && en) {
1050  enable_ = false;
1051  }
1052  override_steering_ = override;
1053  if (publishDbwEnabled()) {
1054  if (en) {
1055  ROS_WARN("DBW system disabled. Driver override on steering wheel.");
1056  } else {
1057  ROS_INFO("DBW system enabled.");
1058  }
1059  }
1060 }
1061 
1062 void DbwNode::overrideGear(bool override)
1063 {
1064  bool en = enabled();
1065  if (override && en) {
1066  enable_ = false;
1067  }
1068  override_gear_ = override;
1069  if (publishDbwEnabled()) {
1070  if (en) {
1071  ROS_WARN("DBW system disabled. Driver override on shifter.");
1072  } else {
1073  ROS_INFO("DBW system enabled.");
1074  }
1075  }
1076 }
1077 
1078 void DbwNode::timeoutBrake(bool timeout, bool enabled)
1079 {
1080  if (!timeout_brakes_ && enabled_brakes_ && timeout && !enabled) {
1081  ROS_WARN("Brake subsystem disabled after 100ms command timeout");
1082  }
1083  timeout_brakes_ = timeout;
1085 }
1086 
1088 {
1089  if (!timeout_accelerator_pedal_ && enabled_accelerator_pedal_ && timeout && !enabled) {
1090  ROS_WARN("Accelerator Pedal subsystem disabled after 100ms command timeout");
1091  }
1092  timeout_accelerator_pedal_ = timeout;
1094 }
1095 
1096 void DbwNode::timeoutSteering(bool timeout, bool enabled)
1097 {
1098  if (!timeout_steering_ && enabled_steering_ && timeout && !enabled) {
1099  ROS_WARN("Steering subsystem disabled after 100ms command timeout");
1100  }
1101  timeout_steering_ = timeout;
1103 }
1104 
1106 {
1107  bool en = enabled();
1108  if (fault && en) {
1109  enable_ = false;
1110  }
1111  fault_brakes_ = fault;
1112  if (publishDbwEnabled()) {
1113  if (en) {
1114  ROS_ERROR("DBW system disabled. Braking fault.");
1115  } else {
1116  ROS_INFO("DBW system enabled.");
1117  }
1118  }
1119 }
1120 
1122 {
1123  bool en = enabled();
1124  if (fault && en) {
1125  enable_ = false;
1126  }
1128  if (publishDbwEnabled()) {
1129  if (en) {
1130  ROS_ERROR("DBW system disabled. Accelerator Pedal fault.");
1131  } else {
1132  ROS_INFO("DBW system enabled.");
1133  }
1134  }
1135 }
1136 
1138 {
1139  bool en = enabled();
1140  if (fault && en) {
1141  enable_ = false;
1142  }
1144  if (publishDbwEnabled()) {
1145  if (en) {
1146  ROS_ERROR("DBW system disabled. Steering fault.");
1147  } else {
1148  ROS_INFO("DBW system enabled.");
1149  }
1150  }
1151 }
1152 
1154 {
1155  bool en = enabled();
1156  if (fault && en) {
1157  enable_ = false;
1158  }
1160  if (publishDbwEnabled()) {
1161  if (en) {
1162  ROS_ERROR("DBW system disabled. Steering calibration fault.");
1163  } else {
1164  ROS_INFO("DBW system enabled.");
1165  }
1166  }
1167 }
1168 
1169 void DbwNode::faultWatchdog(bool fault, uint8_t src, bool braking)
1170 {
1171  bool en = enabled();
1172  if (fault && en) {
1173  enable_ = false;
1174  }
1176  if (publishDbwEnabled()) {
1177  if (en) {
1178  ROS_ERROR("DBW system disabled. Watchdog fault.");
1179  } else {
1180  ROS_INFO("DBW system enabled.");
1181  }
1182  }
1183  if (braking && !fault_watchdog_using_brakes_) {
1184  ROS_WARN("Watchdog event: Alerting driver and applying brakes.");
1185  } else if (!braking && fault_watchdog_using_brakes_) {
1186  ROS_INFO("Watchdog event: Driver has successfully taken control.");
1187  }
1188  if (fault && src && !fault_watchdog_warned_) {
1189  ROS_WARN("Watchdog event: Unknown Fault!");
1190  // switch (src) {
1191  // case raptor_dbw_msgs::WatchdogStatus::OTHER_BRAKE:
1192  // ROS_WARN("Watchdog event: Fault determined by brake controller");
1193  // break;
1194  // case raptor_dbw_msgs::WatchdogStatus::OTHER_ACCELERATOR_PEDAL:
1195  // ROS_WARN("Watchdog event: Fault determined by Accelerator Pedal controller");
1196  // break;
1197  // case raptor_dbw_msgs::WatchdogStatus::OTHER_STEERING:
1198  // ROS_WARN("Watchdog event: Fault determined by steering controller");
1199  // break;
1200  // case raptor_dbw_msgs::WatchdogStatus::BRAKE_COUNTER:
1201  // ROS_WARN("Watchdog event: Brake command counter failed to increment");
1202  // break;
1203  // case raptor_dbw_msgs::WatchdogStatus::BRAKE_DISABLED:
1204  // ROS_WARN("Watchdog event: Brake transition to disabled while in gear or moving");
1205  // break;
1206  // case raptor_dbw_msgs::WatchdogStatus::BRAKE_COMMAND:
1207  // ROS_WARN("Watchdog event: Brake command timeout after 100ms");
1208  // break;
1209  // case raptor_dbw_msgs::WatchdogStatus::BRAKE_REPORT:
1210  // ROS_WARN("Watchdog event: Brake report timeout after 100ms");
1211  // break;
1212  // case raptor_dbw_msgs::WatchdogStatus::ACCELERATOR_PEDAL_COUNTER:
1213  // ROS_WARN("Watchdog event: Accelerator Pedal command counter failed to increment");
1214  // break;
1215  // case raptor_dbw_msgs::WatchdogStatus::ACCELERATOR_PEDAL_DISABLED:
1216  // ROS_WARN("Watchdog event: Accelerator Pedal transition to disabled while in gear or moving");
1217  // break;
1218  // case raptor_dbw_msgs::WatchdogStatus::ACCELERATOR_PEDAL_COMMAND:
1219  // ROS_WARN("Watchdog event: Accelerator Pedal command timeout after 100ms");
1220  // break;
1221  // case raptor_dbw_msgs::WatchdogStatus::ACCELERATOR_PEDAL_REPORT:
1222  // ROS_WARN("Watchdog event: Accelerator Pedal report timeout after 100ms");
1223  // break;
1224  // case raptor_dbw_msgs::WatchdogStatus::STEERING_COUNTER:
1225  // ROS_WARN("Watchdog event: Steering command counter failed to increment");
1226  // break;
1227  // case raptor_dbw_msgs::WatchdogStatus::STEERING_DISABLED:
1228  // ROS_WARN("Watchdog event: Steering transition to disabled while in gear or moving");
1229  // break;
1230  // case raptor_dbw_msgs::WatchdogStatus::STEERING_COMMAND:
1231  // ROS_WARN("Watchdog event: Steering command timeout after 100ms");
1232  // break;
1233  // case raptor_dbw_msgs::WatchdogStatus::STEERING_REPORT:
1234  // ROS_WARN("Watchdog event: Steering report timeout after 100ms");
1235  // break;
1236  // }
1237  fault_watchdog_warned_ = true;
1238  } else if (!fault) {
1239  fault_watchdog_warned_ = false;
1240  }
1241  fault_watchdog_using_brakes_ = braking;
1243  ROS_WARN_THROTTLE(2.0, "Watchdog event: Press left OK button on the steering wheel or cycle power to clear event.");
1244  }
1245 }
1246 
1247 void DbwNode::faultWatchdog(bool fault, uint8_t src) {
1248  faultWatchdog(fault, src, fault_watchdog_using_brakes_); // No change to 'using brakes' status
1249 }
1250 
1251 void DbwNode::publishJointStates(const ros::Time &stamp, const raptor_dbw_msgs::WheelSpeedReport *wheels, const raptor_dbw_msgs::SteeringReport *steering)
1252 {
1253  double dt = (stamp - joint_state_.header.stamp).toSec();
1254  if (wheels) {
1255  joint_state_.velocity[JOINT_FL] = wheels->front_left;
1256  joint_state_.velocity[JOINT_FR] = wheels->front_right;
1257  joint_state_.velocity[JOINT_RL] = wheels->rear_left;
1258  joint_state_.velocity[JOINT_RR] = wheels->rear_right;
1259  }
1260  if (steering) {
1261  const double L = acker_wheelbase_;
1262  const double W = acker_track_;
1263  const double r = L / tan(steering->steering_wheel_angle / steering_ratio_);
1264  joint_state_.position[JOINT_SL] = atan(L / (r - W/2));
1265  joint_state_.position[JOINT_SR] = atan(L / (r + W/2));
1266  }
1267  if (dt < 0.5) {
1268  for (unsigned int i = JOINT_FL; i <= JOINT_RR; i++) {
1269  joint_state_.position[i] = fmod(joint_state_.position[i] + dt * joint_state_.velocity[i], 2*M_PI);
1270  }
1271  }
1272  joint_state_.header.stamp = stamp;
1274 }
1275 
1276 } // raptor_dbw_can
NewEagle::DbcSignal * GetSignal(std::string signalName)
bool override_accelerator_pedal_
Definition: DbwNode.h:109
void overrideBrake(bool override)
Definition: DbwNode.cpp:1014
ros::Subscriber sub_accelerator_pedal_
Definition: DbwNode.h:178
ros::Publisher pub_misc_
Definition: DbwNode.h:190
ros::Publisher pub_low_voltage_system_
Definition: DbwNode.h:201
ros::Subscriber sub_brake_
Definition: DbwNode.h:177
bool fault_watchdog_using_brakes_
Definition: DbwNode.h:117
#define ROS_WARN_THROTTLE(rate,...)
void publish(const boost::shared_ptr< M > &message) const
void faultSteeringCal(bool fault)
Definition: DbwNode.cpp:1153
ros::Subscriber sub_gear_
Definition: DbwNode.h:180
void SetFrame(const can_msgs::Frame::ConstPtr &msg)
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
void recvAcceleratorPedalCmd(const raptor_dbw_msgs::AcceleratorPedalCmd::ConstPtr &msg)
Definition: DbwNode.cpp:700
void faultAcceleratorPedal(bool fault)
Definition: DbwNode.cpp:1121
NewEagle::Dbc NewDbc(const std::string &dbcFile)
ros::Publisher pub_steering_
Definition: DbwNode.h:188
void overrideSteering(bool override)
Definition: DbwNode.cpp:1046
ros::Publisher pub_sys_enable_
Definition: DbwNode.h:199
void publishJointStates(const ros::Time &stamp, const raptor_dbw_msgs::WheelSpeedReport *wheels, const raptor_dbw_msgs::SteeringReport *steering)
Definition: DbwNode.cpp:1251
std::string vin_
Definition: DbwNode.h:160
ros::Subscriber sub_enable_
Definition: DbwNode.h:174
ros::Publisher pub_brake_2_report_
Definition: DbwNode.h:203
void recvDisable(const std_msgs::Empty::ConstPtr &msg)
Definition: DbwNode.cpp:153
void timeoutBrake(bool timeout, bool enabled)
Definition: DbwNode.cpp:1078
#define ROS_WARN(...)
double GetResult() const
ros::Publisher pub_hmi_global_enable_report_
Definition: DbwNode.h:206
ros::Publisher pub_wheel_speeds_
Definition: DbwNode.h:191
void overrideAcceleratorPedal(bool override)
Definition: DbwNode.cpp:1030
can_msgs::Frame GetFrame()
void recvSteeringCmd(const raptor_dbw_msgs::SteeringCmd::ConstPtr &msg)
Definition: DbwNode.cpp:752
NewEagle::DbcMessage * GetMessage(std::string messageName)
void recvBrakeCmd(const raptor_dbw_msgs::BrakeCmd::ConstPtr &msg)
Definition: DbwNode.cpp:660
bool enabled_accelerator_pedal_
Definition: DbwNode.h:123
ros::Publisher pub_imu_
Definition: DbwNode.h:195
std::string frame_id_
Definition: DbwNode.h:163
ros::Publisher pub_joint_states_
Definition: DbwNode.h:196
ros::Publisher pub_vin_
Definition: DbwNode.h:198
ros::Publisher pub_twist_
Definition: DbwNode.h:197
void faultSteering(bool fault)
Definition: DbwNode.cpp:1137
#define ROS_INFO(...)
ros::Publisher pub_surround_
Definition: DbwNode.h:194
ros::Publisher pub_accel_pedal_
Definition: DbwNode.h:187
Timer createTimer(Rate r, Handler h, Obj o, bool oneshot=false, bool autostart=true) const
ros::Subscriber sub_misc_
Definition: DbwNode.h:181
ros::Publisher pub_can_
Definition: DbwNode.h:185
std::string dbcFile_
Definition: DbwNode.h:209
NewEagle::Dbc dbwDbc_
Definition: DbwNode.h:208
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
void recvEnable(const std_msgs::Empty::ConstPtr &msg)
Definition: DbwNode.cpp:148
void SetResult(double result)
ros::Publisher pub_steering_2_report_
Definition: DbwNode.h:204
ros::Publisher pub_brake_
Definition: DbwNode.h:186
ros::Subscriber sub_steering_
Definition: DbwNode.h:179
void faultWatchdog(bool fault, uint8_t src, bool braking)
Definition: DbwNode.cpp:1169
ros::Publisher pub_tire_pressure_
Definition: DbwNode.h:193
ros::Publisher pub_fault_actions_report_
Definition: DbwNode.h:205
void timeoutSteering(bool timeout, bool enabled)
Definition: DbwNode.cpp:1096
ros::Publisher pub_gear_
Definition: DbwNode.h:189
NewEagle::DbcMessage * GetMessageById(uint32_t id)
bool getParam(const std::string &key, std::string &s) const
void timeoutAcceleratorPedal(bool timeout, bool enabled)
Definition: DbwNode.cpp:1087
void faultBrakes(bool fault)
Definition: DbwNode.cpp:1105
void recvGearCmd(const raptor_dbw_msgs::GearCmd::ConstPtr &msg)
Definition: DbwNode.cpp:802
ros::Publisher pub_driver_input_
Definition: DbwNode.h:200
ros::Subscriber sub_global_enable_
Definition: DbwNode.h:182
bool timeout_accelerator_pedal_
Definition: DbwNode.h:120
DbwNode(ros::NodeHandle &node, ros::NodeHandle &priv_nh)
Definition: DbwNode.cpp:42
ros::Publisher pdu1_relay_pub_
Definition: DbwNode.h:212
sensor_msgs::JointState joint_state_
Definition: DbwNode.h:157
ros::Publisher pub_wheel_positions_
Definition: DbwNode.h:192
void recvGlobalEnableCmd(const raptor_dbw_msgs::GlobalEnableCmd::ConstPtr &msg)
Definition: DbwNode.cpp:826
void overrideGear(bool override)
Definition: DbwNode.cpp:1062
#define ROS_ERROR(...)
void recvCAN(const can_msgs::Frame::ConstPtr &msg)
Definition: DbwNode.cpp:158
void timerCallback(const ros::TimerEvent &event)
Definition: DbwNode.cpp:918
ros::Subscriber sub_can_
Definition: DbwNode.h:176
ros::Subscriber sub_disable_
Definition: DbwNode.h:175
void recvMiscCmd(const raptor_dbw_msgs::MiscCmd::ConstPtr &msg)
Definition: DbwNode.cpp:855


raptor_dbw_can
Author(s): Ryan Borchert
autogenerated on Sat Jan 9 2021 03:56:21