1 #include <gtest/gtest.h> 4 #include <std_msgs/Bool.h> 5 #include <geometry_msgs/TwistStamped.h> 6 #include <dataspeed_ulc_msgs/UlcCmd.h> 7 #include <dataspeed_ulc_msgs/UlcReport.h> 9 #include <can_msgs/Frame.h> 51 void recvCan(
const can_msgs::FrameConstPtr& msg)
53 if (!msg->is_rtr && !msg->is_error && !msg->is_extended) {
65 void recvReport(
const dataspeed_ulc_msgs::UlcReportConstPtr& msg)
108 g_pub_ulc_cmd.
publish(g_ulc_cmd);
125 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
126 g_ulc_cmd.linear_accel = 1.0;
127 g_ulc_cmd.linear_decel = 1.0;
128 g_ulc_cmd.jerk_limit_throttle = 10.0;
129 g_ulc_cmd.jerk_limit_brake = 10.0;
130 g_ulc_cmd.lateral_accel = 1.0;
131 g_ulc_cmd.angular_accel = 1.0;
140 g_pub_ulc_cmd.
publish(g_ulc_cmd);
143 if (!stamp_new.
isZero()) {
144 if (!stamp_old.
isZero() && (stamp_old != stamp_new)) {
148 stamp_old = stamp_new;
154 g_ulc_cmd.linear_accel = 2.0;
156 g_ulc_cmd.linear_decel = 2.0;
158 g_ulc_cmd.jerk_limit_throttle = 5.0;
160 g_ulc_cmd.jerk_limit_brake = 5.0;
162 g_ulc_cmd.lateral_accel = 2.0;
164 g_ulc_cmd.angular_accel = 2.0;
168 TEST(ULCNode, cmdRangeSaturation)
170 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
173 g_ulc_cmd.enable_pedals =
true;
174 g_ulc_cmd.enable_steering =
true;
176 g_ulc_cmd.accel_cmd = 0.0;
177 g_ulc_cmd.pedals_mode = dataspeed_ulc_msgs::UlcCmd::SPEED_MODE;
178 g_ulc_cmd.coast_decel = 0;
179 g_ulc_cmd.linear_accel = -1.0;
180 g_ulc_cmd.linear_decel = -1.0;
181 g_ulc_cmd.jerk_limit_throttle = -1.0;
182 g_ulc_cmd.jerk_limit_brake = -1.0;
183 g_ulc_cmd.lateral_accel = -1.0;
184 g_ulc_cmd.angular_accel = -1.0;
188 g_ulc_cmd.steering_mode = dataspeed_ulc_msgs::UlcCmd::YAW_RATE_MODE;
191 g_pub_ulc_cmd.
publish(g_ulc_cmd);
205 g_ulc_cmd.steering_mode = dataspeed_ulc_msgs::UlcCmd::CURVATURE_MODE;
208 g_pub_ulc_cmd.
publish(g_ulc_cmd);
214 g_ulc_cmd.enable_pedals =
true;
215 g_ulc_cmd.enable_steering =
true;
217 g_ulc_cmd.pedals_mode = dataspeed_ulc_msgs::UlcCmd::SPEED_MODE;
218 g_ulc_cmd.coast_decel = 0;
219 g_ulc_cmd.linear_accel = 100.0;
220 g_ulc_cmd.linear_decel = 100.0;
221 g_ulc_cmd.jerk_limit_throttle = 100.0;
222 g_ulc_cmd.jerk_limit_brake = 100.0;
223 g_ulc_cmd.lateral_accel = 100.0;
224 g_ulc_cmd.angular_accel = 100.0;
228 g_ulc_cmd.steering_mode = dataspeed_ulc_msgs::UlcCmd::YAW_RATE_MODE;
231 g_pub_ulc_cmd.
publish(g_ulc_cmd);
238 EXPECT_EQ(UINT8_MAX,
g_msg_ulc_cfg.get().jerk_limit_throttle);
245 g_ulc_cmd.steering_mode = dataspeed_ulc_msgs::UlcCmd::CURVATURE_MODE;
248 g_pub_ulc_cmd.
publish(g_ulc_cmd);
254 g_ulc_cmd.enable_pedals =
true;
255 g_ulc_cmd.enable_steering =
true;
256 g_ulc_cmd.linear_velocity = INFINITY;
257 g_ulc_cmd.accel_cmd = INFINITY;
258 g_ulc_cmd.linear_accel = INFINITY;
259 g_ulc_cmd.linear_decel = INFINITY;
260 g_ulc_cmd.jerk_limit_throttle = INFINITY;
261 g_ulc_cmd.jerk_limit_brake = INFINITY;
262 g_ulc_cmd.lateral_accel = INFINITY;
263 g_ulc_cmd.angular_accel = INFINITY;
266 g_ulc_cmd.yaw_command = INFINITY;
267 g_ulc_cmd.steering_mode = dataspeed_ulc_msgs::UlcCmd::YAW_RATE_MODE;
270 g_pub_ulc_cmd.
publish(g_ulc_cmd);
277 EXPECT_EQ(UINT8_MAX,
g_msg_ulc_cfg.get().jerk_limit_throttle);
283 g_ulc_cmd.yaw_command = INFINITY;
284 g_ulc_cmd.steering_mode = dataspeed_ulc_msgs::UlcCmd::CURVATURE_MODE;
287 g_pub_ulc_cmd.
publish(g_ulc_cmd);
293 g_ulc_cmd.enable_pedals =
true;
294 g_ulc_cmd.enable_steering =
true;
295 g_ulc_cmd.linear_accel = -INFINITY;
296 g_ulc_cmd.linear_velocity = -INFINITY;
297 g_ulc_cmd.accel_cmd = 0.0;
298 g_ulc_cmd.linear_accel = -INFINITY;
299 g_ulc_cmd.linear_decel = -INFINITY;
300 g_ulc_cmd.pedals_mode = dataspeed_ulc_msgs::UlcCmd::SPEED_MODE;
301 g_ulc_cmd.jerk_limit_throttle = -INFINITY;
302 g_ulc_cmd.jerk_limit_brake = -INFINITY;
303 g_ulc_cmd.lateral_accel = -INFINITY;
304 g_ulc_cmd.angular_accel = -INFINITY;
307 g_ulc_cmd.yaw_command = -INFINITY;
308 g_ulc_cmd.steering_mode = dataspeed_ulc_msgs::UlcCmd::YAW_RATE_MODE;
311 g_pub_ulc_cmd.
publish(g_ulc_cmd);
324 g_ulc_cmd.yaw_command = -INFINITY;
325 g_ulc_cmd.steering_mode = dataspeed_ulc_msgs::UlcCmd::CURVATURE_MODE;
328 g_pub_ulc_cmd.
publish(g_ulc_cmd);
334 TEST(ULCNode, outOfBoundsInputs)
339 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
340 g_ulc_cmd.linear_velocity = NAN;
341 g_ulc_cmd.accel_cmd = 0.0;
342 g_ulc_cmd.pedals_mode = dataspeed_ulc_msgs::UlcCmd::SPEED_MODE;
344 g_pub_ulc_cmd.
publish(g_ulc_cmd);
347 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
348 g_ulc_cmd.linear_velocity = 0.0;
349 g_ulc_cmd.accel_cmd = NAN;
350 g_ulc_cmd.pedals_mode = dataspeed_ulc_msgs::UlcCmd::ACCEL_MODE;
352 g_pub_ulc_cmd.
publish(g_ulc_cmd);
356 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
357 g_ulc_cmd.yaw_command = NAN;
359 g_pub_ulc_cmd.
publish(g_ulc_cmd);
363 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
364 g_ulc_cmd.linear_accel = NAN;
366 g_pub_ulc_cmd.
publish(g_ulc_cmd);
370 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
371 g_ulc_cmd.linear_decel = NAN;
373 g_pub_ulc_cmd.
publish(g_ulc_cmd);
377 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
378 g_ulc_cmd.jerk_limit_throttle = NAN;
380 g_pub_ulc_cmd.
publish(g_ulc_cmd);
384 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
385 g_ulc_cmd.jerk_limit_brake = NAN;
387 g_pub_ulc_cmd.
publish(g_ulc_cmd);
391 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
392 g_ulc_cmd.lateral_accel = NAN;
394 g_pub_ulc_cmd.
publish(g_ulc_cmd);
398 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
399 g_ulc_cmd.angular_accel = NAN;
401 g_pub_ulc_cmd.
publish(g_ulc_cmd);
405 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
406 g_ulc_cmd.steering_mode = 3;
408 g_pub_ulc_cmd.
publish(g_ulc_cmd);
412 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
413 g_ulc_cmd.pedals_mode = 3;
415 g_pub_ulc_cmd.
publish(g_ulc_cmd);
424 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
425 g_ulc_cmd.linear_accel = 1.23;
426 g_ulc_cmd.linear_decel = 3.45;
427 g_ulc_cmd.jerk_limit_throttle = 7.89;
428 g_ulc_cmd.jerk_limit_brake = 10.10;
429 g_ulc_cmd.lateral_accel = 5.43;
430 g_ulc_cmd.angular_accel = 3.21;
433 g_ulc_cmd.linear_velocity = 22.3;
434 g_ulc_cmd.accel_cmd = 0.0;
435 g_ulc_cmd.pedals_mode = dataspeed_ulc_msgs::UlcCmd::SPEED_MODE;
438 g_pub_ulc_cmd.
publish(g_ulc_cmd);
441 EXPECT_EQ((int16_t)(g_ulc_cmd.linear_velocity / LIN_VEL_SCALE_FACTOR),
g_msg_ulc_cmd.get().lon_command);
442 EXPECT_EQ((int16_t)(g_ulc_cmd.linear_accel / LINEAR_ACCEL_SCALE_FACTOR),
g_msg_ulc_cfg.get().linear_accel);
443 EXPECT_EQ((int16_t)(g_ulc_cmd.linear_decel / LINEAR_DECEL_SCALE_FACTOR),
g_msg_ulc_cfg.get().linear_decel);
444 EXPECT_EQ((int16_t)(g_ulc_cmd.jerk_limit_throttle / JERK_LIMIT_THROTTLE_SCALE_FACTOR),
g_msg_ulc_cfg.get().jerk_limit_throttle);
445 EXPECT_EQ((int16_t)(g_ulc_cmd.jerk_limit_brake / JERK_LIMIT_BRAKE_SCALE_FACTOR),
g_msg_ulc_cfg.get().jerk_limit_brake);
446 EXPECT_EQ((int16_t)(g_ulc_cmd.lateral_accel / LATERAL_ACCEL_SCALE_FACTOR),
g_msg_ulc_cfg.get().lateral_accel);
447 EXPECT_EQ((int16_t)(g_ulc_cmd.angular_accel / ANGULAR_ACCEL_SCALE_FACTOR),
g_msg_ulc_cfg.get().angular_accel);
450 g_ulc_cmd.linear_velocity = 0.0;
451 g_ulc_cmd.accel_cmd = 2.123;
452 g_ulc_cmd.pedals_mode = dataspeed_ulc_msgs::UlcCmd::ACCEL_MODE;
454 g_pub_ulc_cmd.
publish(g_ulc_cmd);
456 EXPECT_EQ((int16_t)(g_ulc_cmd.accel_cmd / ACCEL_CMD_SCALE_FACTOR),
g_msg_ulc_cmd.get().lon_command);
459 g_ulc_cmd.yaw_command = 0.567;
460 g_ulc_cmd.steering_mode = dataspeed_ulc_msgs::UlcCmd::YAW_RATE_MODE;
462 g_pub_ulc_cmd.
publish(g_ulc_cmd);
464 EXPECT_EQ((int16_t)(g_ulc_cmd.yaw_command / YAW_RATE_SCALE_FACTOR),
g_msg_ulc_cmd.get().yaw_command);
467 g_ulc_cmd.yaw_command = 0.0789;
468 g_ulc_cmd.steering_mode = dataspeed_ulc_msgs::UlcCmd::CURVATURE_MODE;
470 g_pub_ulc_cmd.
publish(g_ulc_cmd);
472 EXPECT_EQ((int16_t)(g_ulc_cmd.yaw_command / CURVATURE_SCALE_FACTOR),
g_msg_ulc_cmd.get().yaw_command);
477 std_msgs::Bool dbw_enabled_msg;
479 g_ulc_cmd = dataspeed_ulc_msgs::UlcCmd();
480 g_ulc_cmd.enable_pedals =
true;
481 g_ulc_cmd.enable_steering =
true;
482 g_ulc_cmd.enable_shifting =
true;
483 g_ulc_cmd.shift_from_park =
true;
487 g_pub_ulc_cmd.
publish(g_ulc_cmd);
495 dbw_enabled_msg.data =
true;
496 g_pub_enable.
publish(dbw_enabled_msg);
501 g_pub_ulc_cmd.
publish(g_ulc_cmd);
509 dbw_enabled_msg.data =
false;
510 g_pub_enable.
publish(dbw_enabled_msg);
513 g_pub_ulc_cmd.
publish(g_ulc_cmd);
523 geometry_msgs::Twist twist_cmd;
524 twist_cmd.linear.x = 22.0;
525 twist_cmd.angular.z = 0.2;
530 g_pub_twist.
publish(twist_cmd);
533 EXPECT_EQ((int16_t)(twist_cmd.linear.x / LIN_VEL_SCALE_FACTOR),
g_msg_ulc_cmd.get().lon_command);
534 EXPECT_EQ((int16_t)(twist_cmd.angular.z / YAW_RATE_SCALE_FACTOR),
g_msg_ulc_cmd.get().yaw_command);
537 geometry_msgs::TwistStamped twist_stamped_cmd;
538 twist_stamped_cmd.twist = twist_cmd;
541 g_pub_twist_stamped.
publish(twist_stamped_cmd);
544 EXPECT_EQ((int16_t)(twist_cmd.linear.x / LIN_VEL_SCALE_FACTOR),
g_msg_ulc_cmd.get().lon_command);
545 EXPECT_EQ((int16_t)(twist_cmd.angular.z / YAW_RATE_SCALE_FACTOR),
g_msg_ulc_cmd.get().yaw_command);
551 can_msgs::Frame report_out;
553 report_out.is_extended =
false;
557 msg_report_ptr->
timeout =
false;
592 int main(
int argc,
char **argv) {
593 testing::InitGoogleTest(&argc, argv);
601 g_pub_ulc_cmd = n->
advertise<dataspeed_ulc_msgs::UlcCmd>(
"ulc_cmd", 2);
602 g_pub_enable = n->
advertise<std_msgs::Bool>(
"dbw_enabled", 2);
603 g_pub_twist = n->
advertise<geometry_msgs::Twist>(
"cmd_vel", 2);
604 g_pub_twist_stamped = n->
advertise<geometry_msgs::TwistStamped>(
"cmd_vel_stamped", 2);
605 g_pub_can = n->
advertise<can_msgs::Frame>(
"can_rx", 100);
606 pn->
param(
"config_frequency", g_cfg_freq, 5.0);
613 int result = RUN_ALL_TESTS();
ros::Publisher g_pub_enable
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
ros::Subscriber g_sub_can
const double ANGULAR_ACCEL_SCALE_FACTOR
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
uint32_t getNumPublishers() const
bool fresh(ros::WallDuration delta) const
MsgRx< MsgUlcCfg > g_msg_ulc_cfg(ros::WallDuration(0.05))
const double ACCEL_REPORT_SCALE_FACTOR
const double ACCEL_CMD_SCALE_FACTOR
static bool waitForTopics(ros::WallDuration dur)
const double MAX_RATE_SCALE_FACTOR
uint16_t steering_enabled
TransportHints & tcpNoDelay(bool nodelay=true)
const double MAX_ANGLE_SCALE_FACTOR
int main(int argc, char **argv)
const double JERK_LIMIT_THROTTLE_SCALE_FACTOR
bool param(const std::string ¶m_name, T ¶m_val, const T &default_val) const
void publish(const boost::shared_ptr< M > &message) const
static bool waitForMsg(ros::WallDuration dur, const MsgRx< T > &msg_rx)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
uint8_t steering_preempted
void recvReport(const dataspeed_ulc_msgs::UlcReportConstPtr &msg)
const double LIN_VEL_SCALE_FACTOR
const double JERK_LIMIT_BRAKE_SCALE_FACTOR
static void checkImmediateCfg()
ros::Publisher g_pub_twist
ros::Subscriber g_sub_report
MsgRx< dataspeed_ulc_msgs::UlcReport > g_msg_ulc_report(ros::WallDuration(0.05))
const double CURVATURE_SCALE_FACTOR
uint8_t max_steering_angle
const double LATERAL_ACCEL_SCALE_FACTOR
const double LINEAR_ACCEL_SCALE_FACTOR
const double SPEED_REPORT_SCALE_FACTOR
const double LINEAR_DECEL_SCALE_FACTOR
ros::Publisher g_pub_twist_stamped
uint32_t getNumSubscribers() const
ros::Publisher g_pub_ulc_cmd
MsgRx< MsgUlcCmd > g_msg_ulc_cmd(ros::WallDuration(0.05))
dataspeed_ulc_msgs::UlcCmd g_ulc_cmd
const double YAW_RATE_SCALE_FACTOR
static void dispatchAssertSizes()
void recvCan(const can_msgs::FrameConstPtr &msg)