@@ -24,18 +24,50 @@ VehicleDoorNode::VehicleDoorNode(const rclcpp::NodeOptions & options)
24
24
{
25
25
const auto adaptor = autoware::component_interface_utils::NodeAdaptor (this );
26
26
group_cli_ = create_callback_group (rclcpp::CallbackGroupType::MutuallyExclusive);
27
- adaptor.relay_service (cli_command_, srv_command_, group_cli_, 3.0 );
28
- adaptor.relay_service (cli_layout_, srv_layout_, group_cli_, 3.0 );
27
+ adaptor.relay_service (cli_layout_, srv_layout_, group_cli_);
28
+ adaptor.init_cli (cli_command_, group_cli_);
29
+ adaptor.init_srv (srv_command_, this , &VehicleDoorNode::on_command);
29
30
adaptor.init_pub (pub_status_);
30
31
adaptor.init_sub (sub_status_, this , &VehicleDoorNode::on_status);
32
+ adaptor.init_sub (sub_operation_mode_, this , &VehicleDoorNode::on_operation_mode);
33
+
34
+ check_autoware_control_ = declare_parameter<bool >(" check_autoware_control" );
35
+ is_autoware_control_ = false ;
36
+ is_stop_mode_ = false ;
37
+ }
38
+
39
+ void VehicleDoorNode::on_operation_mode (const OperationModeState::Message::ConstSharedPtr msg)
40
+ {
41
+ is_autoware_control_ = msg->is_autoware_control_enabled ;
42
+ is_stop_mode_ = msg->mode == OperationModeState::Message::STOP;
43
+ }
44
+ void VehicleDoorNode::on_status (InternalDoorStatus::Message::ConstSharedPtr msg)
45
+ {
46
+ utils::notify (pub_status_, status_, *msg, utils::ignore_stamp<InternalDoorStatus::Message>);
31
47
}
32
48
33
- void VehicleDoorNode::on_status (
34
- autoware::component_interface_specs::vehicle::DoorStatus::Message::ConstSharedPtr msg)
49
+ void VehicleDoorNode::on_command (
50
+ const ExternalDoorCommand::Service::Request::SharedPtr req,
51
+ const ExternalDoorCommand::Service::Response::SharedPtr res)
35
52
{
36
- utils::notify (
37
- pub_status_, status_, *msg,
38
- utils::ignore_stamp<autoware::component_interface_specs::vehicle::DoorStatus::Message>);
53
+ // For safety, do not open the door if the vehicle is not stopped.
54
+ // https://autowarefoundation.github.io/autoware-documentation/main/design/autoware-interfaces/ad-api/list/api/vehicle/doors/command/
55
+ if (!is_stop_mode_ || (!is_autoware_control_ && check_autoware_control_)) {
56
+ bool is_open = false ;
57
+ for (const auto & door : req->doors ) {
58
+ if (door.command == autoware_adapi_v1_msgs::msg::DoorCommand::OPEN) {
59
+ is_open = true ;
60
+ break ;
61
+ }
62
+ }
63
+ if (is_open) {
64
+ res->status .success = false ;
65
+ res->status .code = autoware_adapi_v1_msgs::msg::ResponseStatus::UNKNOWN;
66
+ res->status .message = " Doors cannot be opened if the vehicle is not stopped." ;
67
+ return ;
68
+ }
69
+ }
70
+ autoware::component_interface_utils::status::copy (cli_command_->call (req), res);
39
71
}
40
72
41
73
} // namespace autoware::default_adapi
0 commit comments