Skip to content

Commit c89cd08

Browse files
authored
feat(vehicle_cmd_gate): use polling subscriber (autowarefoundation#7418)
* change to polling subscriber Signed-off-by: Go Sakayori <go.sakayori@tier4.jp> * fix Signed-off-by: Go Sakayori <go.sakayori@tier4.jp> --------- Signed-off-by: Go Sakayori <go.sakayori@tier4.jp>
1 parent 0e6528b commit c89cd08

File tree

2 files changed

+118
-99
lines changed

2 files changed

+118
-99
lines changed

control/autoware_vehicle_cmd_gate/src/vehicle_cmd_gate.cpp

+75-74
Original file line numberDiff line numberDiff line change
@@ -87,69 +87,6 @@ VehicleCmdGate::VehicleCmdGate(const rclcpp::NodeOptions & node_options)
8787
external_emergency_stop_heartbeat_sub_ = create_subscription<Heartbeat>(
8888
"input/external_emergency_stop_heartbeat", 1,
8989
std::bind(&VehicleCmdGate::onExternalEmergencyStopHeartbeat, this, _1));
90-
gate_mode_sub_ = create_subscription<GateMode>(
91-
"input/gate_mode", 1, std::bind(&VehicleCmdGate::onGateMode, this, _1));
92-
engage_sub_ = create_subscription<EngageMsg>(
93-
"input/engage", 1, std::bind(&VehicleCmdGate::onEngage, this, _1));
94-
kinematics_sub_ = create_subscription<Odometry>(
95-
"/localization/kinematic_state", 1,
96-
[this](Odometry::SharedPtr msg) { current_kinematics_ = *msg; });
97-
acc_sub_ = create_subscription<AccelWithCovarianceStamped>(
98-
"input/acceleration", 1, [this](AccelWithCovarianceStamped::SharedPtr msg) {
99-
current_acceleration_ = msg->accel.accel.linear.x;
100-
});
101-
steer_sub_ = create_subscription<SteeringReport>(
102-
"input/steering", 1,
103-
[this](SteeringReport::SharedPtr msg) { current_steer_ = msg->steering_tire_angle; });
104-
operation_mode_sub_ = create_subscription<OperationModeState>(
105-
"input/operation_mode", rclcpp::QoS(1).transient_local(),
106-
[this](const OperationModeState::SharedPtr msg) { current_operation_mode_ = *msg; });
107-
mrm_state_sub_ = create_subscription<MrmState>(
108-
"input/mrm_state", 1, std::bind(&VehicleCmdGate::onMrmState, this, _1));
109-
110-
// Subscriber for auto
111-
auto_control_cmd_sub_ = create_subscription<Control>(
112-
"input/auto/control_cmd", 1, std::bind(&VehicleCmdGate::onAutoCtrlCmd, this, _1));
113-
114-
auto_turn_indicator_cmd_sub_ = create_subscription<TurnIndicatorsCommand>(
115-
"input/auto/turn_indicators_cmd", 1,
116-
[this](TurnIndicatorsCommand::ConstSharedPtr msg) { auto_commands_.turn_indicator = *msg; });
117-
118-
auto_hazard_light_cmd_sub_ = create_subscription<HazardLightsCommand>(
119-
"input/auto/hazard_lights_cmd", 1,
120-
[this](HazardLightsCommand::ConstSharedPtr msg) { auto_commands_.hazard_light = *msg; });
121-
122-
auto_gear_cmd_sub_ = create_subscription<GearCommand>(
123-
"input/auto/gear_cmd", 1,
124-
[this](GearCommand::ConstSharedPtr msg) { auto_commands_.gear = *msg; });
125-
126-
// Subscriber for external
127-
remote_control_cmd_sub_ = create_subscription<Control>(
128-
"input/external/control_cmd", 1, std::bind(&VehicleCmdGate::onRemoteCtrlCmd, this, _1));
129-
130-
remote_turn_indicator_cmd_sub_ = create_subscription<TurnIndicatorsCommand>(
131-
"input/external/turn_indicators_cmd", 1,
132-
[this](TurnIndicatorsCommand::ConstSharedPtr msg) { remote_commands_.turn_indicator = *msg; });
133-
134-
remote_hazard_light_cmd_sub_ = create_subscription<HazardLightsCommand>(
135-
"input/external/hazard_lights_cmd", 1,
136-
[this](HazardLightsCommand::ConstSharedPtr msg) { remote_commands_.hazard_light = *msg; });
137-
138-
remote_gear_cmd_sub_ = create_subscription<GearCommand>(
139-
"input/external/gear_cmd", 1,
140-
[this](GearCommand::ConstSharedPtr msg) { remote_commands_.gear = *msg; });
141-
142-
// Subscriber for emergency
143-
emergency_control_cmd_sub_ = create_subscription<Control>(
144-
"input/emergency/control_cmd", 1, std::bind(&VehicleCmdGate::onEmergencyCtrlCmd, this, _1));
145-
146-
emergency_hazard_light_cmd_sub_ = create_subscription<HazardLightsCommand>(
147-
"input/emergency/hazard_lights_cmd", 1,
148-
[this](HazardLightsCommand::ConstSharedPtr msg) { emergency_commands_.hazard_light = *msg; });
149-
150-
emergency_gear_cmd_sub_ = create_subscription<GearCommand>(
151-
"input/emergency/gear_cmd", 1,
152-
[this](GearCommand::ConstSharedPtr msg) { emergency_commands_.gear = *msg; });
15390

15491
// Parameter
15592
use_emergency_handling_ = declare_parameter<bool>("use_emergency_handling");
@@ -354,29 +291,32 @@ bool VehicleCmdGate::isDataReady()
354291
}
355292

356293
// for auto
357-
void VehicleCmdGate::onAutoCtrlCmd(Control::ConstSharedPtr msg)
294+
void VehicleCmdGate::onAutoCtrlCmd()
358295
{
359-
auto_commands_.control = *msg;
296+
const auto msg = auto_control_cmd_sub_.takeData();
297+
if (msg) auto_commands_.control = *msg;
360298

361299
if (current_gate_mode_.data == GateMode::AUTO) {
362300
publishControlCommands(auto_commands_);
363301
}
364302
}
365303

366304
// for remote
367-
void VehicleCmdGate::onRemoteCtrlCmd(Control::ConstSharedPtr msg)
305+
void VehicleCmdGate::onRemoteCtrlCmd()
368306
{
369-
remote_commands_.control = *msg;
307+
const auto msg = remote_control_cmd_sub_.takeData();
308+
if (msg) remote_commands_.control = *msg;
370309

371310
if (current_gate_mode_.data == GateMode::EXTERNAL) {
372311
publishControlCommands(remote_commands_);
373312
}
374313
}
375314

376315
// for emergency
377-
void VehicleCmdGate::onEmergencyCtrlCmd(Control::ConstSharedPtr msg)
316+
void VehicleCmdGate::onEmergencyCtrlCmd()
378317
{
379-
emergency_commands_.control = *msg;
318+
const auto msg = emergency_control_cmd_sub_.takeData();
319+
if (msg) emergency_commands_.control = *msg;
380320

381321
if (use_emergency_handling_ && is_system_emergency_) {
382322
publishControlCommands(emergency_commands_);
@@ -385,6 +325,61 @@ void VehicleCmdGate::onEmergencyCtrlCmd(Control::ConstSharedPtr msg)
385325

386326
void VehicleCmdGate::onTimer()
387327
{
328+
onGateMode();
329+
330+
const auto msg_kinematics = kinematics_sub_.takeData();
331+
if (msg_kinematics) current_kinematics_ = *msg_kinematics;
332+
333+
const auto msg_acceleration = acc_sub_.takeData();
334+
if (msg_acceleration) current_acceleration_ = msg_acceleration->accel.accel.linear.x;
335+
336+
const auto msg_steer = steer_sub_.takeData();
337+
if (msg_steer) current_steer_ = msg_steer->steering_tire_angle;
338+
339+
const auto msg_operation_mode = operation_mode_sub_.takeData();
340+
if (msg_operation_mode) current_operation_mode_ = *msg_operation_mode;
341+
342+
onMrmState();
343+
344+
// Subscriber for auto
345+
onAutoCtrlCmd();
346+
347+
const auto msg_auto_command_turn_indicator = auto_turn_indicator_cmd_sub_.takeData();
348+
if (msg_auto_command_turn_indicator)
349+
auto_commands_.turn_indicator = *msg_auto_command_turn_indicator;
350+
351+
const auto msg_auto_command_hazard_light = auto_hazard_light_cmd_sub_.takeData();
352+
if (msg_auto_command_hazard_light) auto_commands_.hazard_light = *msg_auto_command_hazard_light;
353+
354+
const auto msg_auto_command_gear = auto_gear_cmd_sub_.takeData();
355+
if (msg_auto_command_gear) auto_commands_.gear = *msg_auto_command_gear;
356+
357+
// Subscribe for external
358+
onRemoteCtrlCmd();
359+
360+
const auto msg_remote_command_turn_indicator = remote_turn_indicator_cmd_sub_.takeData();
361+
if (msg_remote_command_turn_indicator)
362+
remote_commands_.turn_indicator = *msg_remote_command_turn_indicator;
363+
364+
const auto msg_remote_command_hazard_light = remote_hazard_light_cmd_sub_.takeData();
365+
if (msg_remote_command_hazard_light)
366+
remote_commands_.hazard_light = *msg_remote_command_hazard_light;
367+
368+
const auto msg_remote_command_gear = remote_gear_cmd_sub_.takeData();
369+
if (msg_remote_command_gear) remote_commands_.gear = *msg_remote_command_gear;
370+
371+
// Subscribe for emergency
372+
onEmergencyCtrlCmd();
373+
374+
const auto msg_emergency_command_hazard_light = emergency_hazard_light_cmd_sub_.takeData();
375+
if (msg_emergency_command_hazard_light)
376+
emergency_commands_.hazard_light = *msg_emergency_command_hazard_light;
377+
378+
const auto msg_emergency_command_gear = emergency_gear_cmd_sub_.takeData();
379+
if (msg_emergency_command_gear) emergency_commands_.gear = *msg_emergency_command_gear;
380+
381+
onEngage();
382+
388383
updater_.force_update();
389384

390385
if (!isDataReady()) {
@@ -710,10 +705,12 @@ void VehicleCmdGate::onExternalEmergencyStopHeartbeat(
710705
external_emergency_stop_heartbeat_received_time_ = std::make_shared<rclcpp::Time>(this->now());
711706
}
712707

713-
void VehicleCmdGate::onGateMode(GateMode::ConstSharedPtr msg)
708+
void VehicleCmdGate::onGateMode()
714709
{
710+
const auto msg = gate_mode_sub_.takeData();
711+
if (!msg) return;
712+
715713
const auto prev_gate_mode = current_gate_mode_;
716-
current_gate_mode_ = *msg;
717714

718715
if (current_gate_mode_.data != prev_gate_mode.data) {
719716
RCLCPP_INFO(
@@ -722,9 +719,10 @@ void VehicleCmdGate::onGateMode(GateMode::ConstSharedPtr msg)
722719
}
723720
}
724721

725-
void VehicleCmdGate::onEngage(EngageMsg::ConstSharedPtr msg)
722+
void VehicleCmdGate::onEngage()
726723
{
727-
is_engaged_ = msg->engage;
724+
const auto msg = engage_sub_.takeData();
725+
if (msg) is_engaged_ = msg->engage;
728726
}
729727

730728
void VehicleCmdGate::onEngageService(
@@ -734,8 +732,11 @@ void VehicleCmdGate::onEngageService(
734732
response->status = tier4_api_utils::response_success();
735733
}
736734

737-
void VehicleCmdGate::onMrmState(MrmState::ConstSharedPtr msg)
735+
void VehicleCmdGate::onMrmState()
738736
{
737+
const auto msg = mrm_state_sub_.takeData();
738+
if (!msg) return;
739+
739740
is_system_emergency_ =
740741
(msg->state == MrmState::MRM_OPERATING || msg->state == MrmState::MRM_SUCCEEDED ||
741742
msg->state == MrmState::MRM_FAILED) &&

control/autoware_vehicle_cmd_gate/src/vehicle_cmd_gate.hpp

+43-25
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <diagnostic_updater/diagnostic_updater.hpp>
2626
#include <motion_utils/vehicle/vehicle_state_checker.hpp>
2727
#include <rclcpp/rclcpp.hpp>
28+
#include <tier4_autoware_utils/ros/polling_subscriber.hpp>
2829
#include <tier4_autoware_utils/ros/published_time_publisher.hpp>
2930

3031
#include <autoware_adapi_v1_msgs/msg/mrm_state.hpp>
@@ -118,16 +119,22 @@ class VehicleCmdGate : public rclcpp::Node
118119
const std::vector<rclcpp::Parameter> & parameters);
119120
// Subscription
120121
rclcpp::Subscription<Heartbeat>::SharedPtr external_emergency_stop_heartbeat_sub_;
121-
rclcpp::Subscription<GateMode>::SharedPtr gate_mode_sub_;
122-
rclcpp::Subscription<OperationModeState>::SharedPtr operation_mode_sub_;
123-
rclcpp::Subscription<MrmState>::SharedPtr mrm_state_sub_;
124-
rclcpp::Subscription<Odometry>::SharedPtr kinematics_sub_; // for filter
125-
rclcpp::Subscription<AccelWithCovarianceStamped>::SharedPtr acc_sub_; // for filter
126-
rclcpp::Subscription<SteeringReport>::SharedPtr steer_sub_; // for filter
127-
128-
void onGateMode(GateMode::ConstSharedPtr msg);
122+
tier4_autoware_utils::InterProcessPollingSubscriber<GateMode> gate_mode_sub_{
123+
this, "input/gate_mode"};
124+
tier4_autoware_utils::InterProcessPollingSubscriber<OperationModeState> operation_mode_sub_{
125+
this, "input/operation_mode", rclcpp::QoS(1).transient_local()};
126+
tier4_autoware_utils::InterProcessPollingSubscriber<MrmState> mrm_state_sub_{
127+
this, "input/mrm_state"};
128+
tier4_autoware_utils::InterProcessPollingSubscriber<Odometry> kinematics_sub_{
129+
this, "/localization/kinematic_state"}; // for filter
130+
tier4_autoware_utils::InterProcessPollingSubscriber<AccelWithCovarianceStamped> acc_sub_{
131+
this, "input/acceleration"}; // for filter
132+
tier4_autoware_utils::InterProcessPollingSubscriber<SteeringReport> steer_sub_{
133+
this, "input/steering"}; // for filter
134+
135+
void onGateMode();
129136
void onExternalEmergencyStopHeartbeat(Heartbeat::ConstSharedPtr msg);
130-
void onMrmState(MrmState::ConstSharedPtr msg);
137+
void onMrmState();
131138

132139
bool is_engaged_;
133140
bool is_system_emergency_ = false;
@@ -153,26 +160,37 @@ class VehicleCmdGate : public rclcpp::Node
153160

154161
// Subscriber for auto
155162
Commands auto_commands_;
156-
rclcpp::Subscription<Control>::SharedPtr auto_control_cmd_sub_;
157-
rclcpp::Subscription<TurnIndicatorsCommand>::SharedPtr auto_turn_indicator_cmd_sub_;
158-
rclcpp::Subscription<HazardLightsCommand>::SharedPtr auto_hazard_light_cmd_sub_;
159-
rclcpp::Subscription<GearCommand>::SharedPtr auto_gear_cmd_sub_;
160-
void onAutoCtrlCmd(Control::ConstSharedPtr msg);
163+
tier4_autoware_utils::InterProcessPollingSubscriber<Control> auto_control_cmd_sub_{
164+
this, "input/auto/control_cmd"};
165+
tier4_autoware_utils::InterProcessPollingSubscriber<TurnIndicatorsCommand>
166+
auto_turn_indicator_cmd_sub_{this, "input/auto/turn_indicators_cmd"};
167+
tier4_autoware_utils::InterProcessPollingSubscriber<HazardLightsCommand>
168+
auto_hazard_light_cmd_sub_{this, "input/auto/hazard_lights_cmd"};
169+
tier4_autoware_utils::InterProcessPollingSubscriber<GearCommand> auto_gear_cmd_sub_{
170+
this, "input/auto/gear_cmd"};
171+
void onAutoCtrlCmd();
161172

162173
// Subscription for external
163174
Commands remote_commands_;
164-
rclcpp::Subscription<Control>::SharedPtr remote_control_cmd_sub_;
165-
rclcpp::Subscription<TurnIndicatorsCommand>::SharedPtr remote_turn_indicator_cmd_sub_;
166-
rclcpp::Subscription<HazardLightsCommand>::SharedPtr remote_hazard_light_cmd_sub_;
167-
rclcpp::Subscription<GearCommand>::SharedPtr remote_gear_cmd_sub_;
168-
void onRemoteCtrlCmd(Control::ConstSharedPtr msg);
175+
tier4_autoware_utils::InterProcessPollingSubscriber<Control> remote_control_cmd_sub_{
176+
this, "input/external/control_cmd"};
177+
tier4_autoware_utils::InterProcessPollingSubscriber<TurnIndicatorsCommand>
178+
remote_turn_indicator_cmd_sub_{this, "input/external/turn_indicators_cmd"};
179+
tier4_autoware_utils::InterProcessPollingSubscriber<HazardLightsCommand>
180+
remote_hazard_light_cmd_sub_{this, "input/external/hazard_lights_cmd"};
181+
tier4_autoware_utils::InterProcessPollingSubscriber<GearCommand> remote_gear_cmd_sub_{
182+
this, "input/external/gear_cmd"};
183+
void onRemoteCtrlCmd();
169184

170185
// Subscription for emergency
171186
Commands emergency_commands_;
172-
rclcpp::Subscription<Control>::SharedPtr emergency_control_cmd_sub_;
173-
rclcpp::Subscription<HazardLightsCommand>::SharedPtr emergency_hazard_light_cmd_sub_;
174-
rclcpp::Subscription<GearCommand>::SharedPtr emergency_gear_cmd_sub_;
175-
void onEmergencyCtrlCmd(Control::ConstSharedPtr msg);
187+
tier4_autoware_utils::InterProcessPollingSubscriber<Control> emergency_control_cmd_sub_{
188+
this, "input/emergency/control_cmd"};
189+
tier4_autoware_utils::InterProcessPollingSubscriber<HazardLightsCommand>
190+
emergency_hazard_light_cmd_sub_{this, "input/emergency/hazard_lights_cmd"};
191+
tier4_autoware_utils::InterProcessPollingSubscriber<GearCommand> emergency_gear_cmd_sub_{
192+
this, "input/emergency/gear_cmd"};
193+
void onEmergencyCtrlCmd();
176194

177195
// Parameter
178196
bool use_emergency_handling_;
@@ -198,10 +216,10 @@ class VehicleCmdGate : public rclcpp::Node
198216
const SetEmergency::Response::SharedPtr response);
199217

200218
// TODO(Takagi, Isamu): deprecated
201-
rclcpp::Subscription<EngageMsg>::SharedPtr engage_sub_;
219+
tier4_autoware_utils::InterProcessPollingSubscriber<EngageMsg> engage_sub_{this, "input/engage"};
202220
rclcpp::Service<Trigger>::SharedPtr srv_external_emergency_stop_;
203221
rclcpp::Service<Trigger>::SharedPtr srv_clear_external_emergency_stop_;
204-
void onEngage(EngageMsg::ConstSharedPtr msg);
222+
void onEngage();
205223
bool onSetExternalEmergencyStopService(
206224
const std::shared_ptr<rmw_request_id_t> req_header, const Trigger::Request::SharedPtr req,
207225
const Trigger::Response::SharedPtr res);

0 commit comments

Comments
 (0)