Autoware.Auto
vehicle_interface_node.hpp
Go to the documentation of this file.
1 // Copyright 2020-2021 the Autoware Foundation
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //    http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 // Co-developed by Tier IV, Inc. and Apex.AI, Inc.
18 #ifndef VEHICLE_INTERFACE__VEHICLE_INTERFACE_NODE_HPP_
19 #define VEHICLE_INTERFACE__VEHICLE_INTERFACE_NODE_HPP_
20 
23 #include <vehicle_interface/visibility_control.hpp>
24 
25 #include <mpark_variant_vendor/variant.hpp>
26 #include <rclcpp/rclcpp.hpp>
29 
30 #include <autoware_auto_control_msgs/msg/ackermann_control_command.hpp>
31 #include <autoware_auto_control_msgs/msg/high_level_control_command.hpp>
32 #include <autoware_auto_vehicle_msgs/msg/raw_control_command.hpp>
33 #include <autoware_auto_vehicle_msgs/msg/vehicle_control_command.hpp>
34 #include <autoware_auto_vehicle_msgs/msg/vehicle_odometry.hpp>
35 #include <autoware_auto_vehicle_msgs/msg/vehicle_state_command.hpp>
36 #include <autoware_auto_vehicle_msgs/msg/vehicle_state_report.hpp>
37 #include <autoware_auto_vehicle_msgs/srv/autonomy_mode_change.hpp>
38 
39 #include <experimental/optional>
40 #include <chrono>
41 #include <exception>
42 #include <memory>
43 #include <map>
44 #include <string>
45 #include <unordered_set>
46 
47 namespace autoware
48 {
49 namespace drivers
50 {
51 namespace vehicle_interface
52 {
53 
54 using Real = decltype(BasicControlCommand::long_accel_mps2);
55 using autoware_auto_vehicle_msgs::msg::HeadlightsCommand;
56 using autoware_auto_vehicle_msgs::msg::HeadlightsReport;
57 using autoware_auto_vehicle_msgs::msg::HornCommand;
58 using autoware_auto_vehicle_msgs::msg::HornReport;
59 using autoware_auto_vehicle_msgs::msg::WipersCommand;
60 using autoware_auto_vehicle_msgs::msg::WipersReport;
61 
64 {
65  std::string topic;
66 }; // struct TopicNumMatches
67 
70 {
71  std::string type;
73 }; // struct FilterConfig
74 
75 enum class ViFeature
76 {
77  GEAR,
78  HEADLIGHTS,
79  HORN,
80  WIPERS,
81 };
82 
85 class VEHICLE_INTERFACE_PUBLIC VehicleInterfaceNode : public ::rclcpp::Node
86 {
87 public:
93  const std::string & node_name,
94  const std::unordered_set<ViFeature> & features,
95  const rclcpp::NodeOptions & options);
96 
97 protected:
98  using ControllerBasePtr =
99  std::unique_ptr<common::reference_tracking_controller::ReferenceTrackerBase<Real>>;
100  using FilterBasePtr = std::unique_ptr<common::signal_filters::FilterBase<Real>>;
101  using ModeChangeRequest = autoware_auto_vehicle_msgs::srv::AutonomyModeChange_Request;
102  using ModeChangeResponse = autoware_auto_vehicle_msgs::srv::AutonomyModeChange_Response;
103 
105  {
110  };
112  void set_filter(VehicleFilter && filter) noexcept;
114  void set_reference_tracker(ControllerBasePtr && controller) noexcept;
116  void set_interface(std::unique_ptr<PlatformInterface> && interface) noexcept;
118  rclcpp::Logger logger() const noexcept;
120  const SafetyStateMachine get_state_machine() const noexcept;
121 
125  virtual void on_control_send_failure();
129  virtual void on_state_send_failure();
132  virtual void on_mode_change_failure();
136  virtual void on_read_timeout();
138  virtual void on_error(std::exception_ptr eptr);
139 
140 private:
141  // Helper function called in constructors
142  VEHICLE_INTERFACE_LOCAL void init(
143  const TopicNumMatches & control_command,
144  const TopicNumMatches & odometry,
145  const TopicNumMatches & state_report,
146  const std::experimental::optional<StateMachineConfig> & state_machine_config,
147  const FilterConfig & longitudinal_filter,
148  const FilterConfig & curvature_filter,
149  const FilterConfig & front_steer_filter,
150  const FilterConfig & rear_steer_filter,
151  const std::chrono::nanoseconds & cycle_time);
152 
153  // Run just before main loop, ensure that all invariants (possibly from child class) are enforced
154  VEHICLE_INTERFACE_LOCAL void check_invariants();
155 
156  // Send state command
157  VEHICLE_INTERFACE_LOCAL void send_state_command(const MaybeStateCommand & maybe_command);
158  // Read data from vehicle platform for time budget, publish data
159  VEHICLE_INTERFACE_LOCAL void read_and_publish();
160  // Core loop for different input commands. Specialized differently for each topic type
161  template<typename T>
162  VEHICLE_INTERFACE_LOCAL void on_command_message(const T & msg);
163  // Callback for requests to change autonomoy mode
164  VEHICLE_INTERFACE_LOCAL void on_mode_change_request(
165  ModeChangeRequest::SharedPtr request, ModeChangeResponse::SharedPtr response);
167  VEHICLE_INTERFACE_LOCAL void state_machine_report();
168 
169  rclcpp::TimerBase::SharedPtr m_read_timer{nullptr};
170  rclcpp::Publisher<autoware_auto_vehicle_msgs::msg::VehicleOdometry>::SharedPtr m_odom_pub{
171  nullptr};
172  rclcpp::Publisher<autoware_auto_vehicle_msgs::msg::VehicleStateReport>::SharedPtr m_state_pub{
173  nullptr};
174  rclcpp::Subscription<GearCommand>::SharedPtr m_gear_cmd_sub{nullptr};
175  rclcpp::Publisher<GearReport>::SharedPtr m_gear_rpt_pub{nullptr};
176  rclcpp::Publisher<HeadlightsReport>::SharedPtr m_headlights_rpt_pub{nullptr};
177  rclcpp::Subscription<HeadlightsCommand>::SharedPtr m_headlights_cmd_sub{nullptr};
178  rclcpp::Publisher<HornReport>::SharedPtr m_horn_rpt_pub{nullptr};
179  rclcpp::Subscription<HornCommand>::SharedPtr m_horn_cmd_sub{nullptr};
180  rclcpp::Publisher<WipersReport>::SharedPtr m_wipers_rpt_pub{nullptr};
181  rclcpp::Subscription<WipersCommand>::SharedPtr m_wipers_cmd_sub{nullptr};
182  rclcpp::Service<autoware_auto_vehicle_msgs::srv::AutonomyModeChange>::SharedPtr m_mode_service{
183  nullptr};
184 
185  using BasicSub = rclcpp::Subscription<BasicControlCommand>::SharedPtr;
186  using RawSub =
187  rclcpp::Subscription<autoware_auto_vehicle_msgs::msg::RawControlCommand>::SharedPtr;
188  using HighLevelSub =
189  rclcpp::Subscription<autoware_auto_control_msgs::msg::HighLevelControlCommand>::SharedPtr;
190  using AckermannSub =
191  rclcpp::Subscription<autoware_auto_control_msgs::msg::AckermannControlCommand>::SharedPtr;
192 
193  mpark::variant<RawSub, BasicSub, HighLevelSub, AckermannSub> m_command_sub{};
194 
195  std::unique_ptr<PlatformInterface> m_interface{nullptr};
196  VehicleFilter m_filter{nullptr, nullptr, nullptr, nullptr};
197  ControllerBasePtr m_controller{nullptr};
198  std::unique_ptr<SafetyStateMachine> m_state_machine{nullptr};
199  std::chrono::system_clock::time_point m_last_command_stamp{};
200  std::chrono::nanoseconds m_cycle_time{};
201  MaybeStateCommand m_last_state_command{};
202 
203  std::map<std::string, ViFeature> m_avail_features =
204  {
205  {"headlights", ViFeature::HEADLIGHTS},
206  {"horn", ViFeature::HORN},
207  {"wipers", ViFeature::WIPERS},
208  {"gear", ViFeature::GEAR},
209  };
210  std::unordered_set<ViFeature> m_enabled_features{};
211 }; // class VehicleInterfaceNode
212 
213 } // namespace vehicle_interface
214 } // namespace drivers
215 } // namespace autoware
216 
217 #endif // VEHICLE_INTERFACE__VEHICLE_INTERFACE_NODE_HPP_
autoware::drivers::vehicle_interface::VehicleInterfaceNode
Definition: vehicle_interface_node.hpp:85
autoware::drivers::vehicle_interface::VehicleInterfaceNode::FilterBasePtr
std::unique_ptr< common::signal_filters::FilterBase< Real > > FilterBasePtr
Definition: vehicle_interface_node.hpp:100
autoware::drivers::vehicle_interface::ViFeature::WIPERS
@ WIPERS
autoware::drivers::vehicle_interface::MaybeStateCommand
std::experimental::optional< autoware_auto_vehicle_msgs::msg::VehicleStateCommand > MaybeStateCommand
Definition: safety_state_machine.hpp:48
autoware::drivers::vehicle_interface::VehicleInterfaceNode::VehicleFilter::rear_steer
FilterBasePtr rear_steer
Definition: vehicle_interface_node.hpp:109
autoware::drivers::vehicle_interface::VehicleInterfaceNode::VehicleFilter
Definition: vehicle_interface_node.hpp:104
autoware::drivers::vehicle_interface::FilterConfig::type
std::string type
Definition: vehicle_interface_node.hpp:71
autoware::drivers::vehicle_interface::StateMachineConfig
Configuration class for SafetyStateMachine.
Definition: safety_state_machine.hpp:122
autoware::drivers::vehicle_interface::VehicleInterfaceNode::VehicleFilter::longitudinal
FilterBasePtr longitudinal
Definition: vehicle_interface_node.hpp:106
autoware::drivers::vehicle_interface::VehicleInterfaceNode::ModeChangeRequest
autoware_auto_vehicle_msgs::srv::AutonomyModeChange_Request ModeChangeRequest
Definition: vehicle_interface_node.hpp:101
autoware::drivers::vehicle_interface::SafetyStateMachine
Definition: safety_state_machine.hpp:180
autoware::drivers::vehicle_interface::ViFeature::HORN
@ HORN
autoware
This file defines the lanelet2_map_provider_node class.
Definition: quick_sort.hpp:24
VEHICLE_INTERFACE_LOCAL
#define VEHICLE_INTERFACE_LOCAL
Definition: drivers/vehicle_interface/include/vehicle_interface/visibility_control.hpp:45
platform_interface.hpp
Base class for vehicle "translator".
reference_tracking_controller.hpp
This class defines an interface for simple reference tracking controllers.
autoware::drivers::vehicle_interface::TopicNumMatches::topic
std::string topic
Definition: vehicle_interface_node.hpp:65
autoware::drivers::vehicle_interface::ViFeature
ViFeature
Definition: vehicle_interface_node.hpp:75
autoware::drivers::vehicle_interface::FilterConfig::cutoff_frequency
Real cutoff_frequency
Definition: vehicle_interface_node.hpp:72
signal_filter.hpp
Interface definition for signal processing filters.
autoware::drivers::vehicle_interface::Real
decltype(BasicControlCommand::long_accel_mps2) Real
Definition: vehicle_interface_node.hpp:54
autoware::drivers::vehicle_interface::TopicNumMatches
Convenience struct for construction.
Definition: vehicle_interface_node.hpp:63
autoware::drivers::vehicle_interface::ViFeature::HEADLIGHTS
@ HEADLIGHTS
autoware::drivers::vehicle_interface::ViFeature::GEAR
@ GEAR
autoware::drivers::vehicle_interface::VehicleInterfaceNode::VehicleFilter::curvature
FilterBasePtr curvature
Definition: vehicle_interface_node.hpp:107
autoware::drivers::vehicle_interface::VehicleInterfaceNode::ModeChangeResponse
autoware_auto_vehicle_msgs::srv::AutonomyModeChange_Response ModeChangeResponse
Definition: vehicle_interface_node.hpp:102
autoware::drivers::vehicle_interface::FilterConfig
Convenience struct to construct filters.
Definition: vehicle_interface_node.hpp:69
autoware::drivers::vehicle_interface::VehicleInterfaceNode::ControllerBasePtr
std::unique_ptr< common::reference_tracking_controller::ReferenceTrackerBase< Real > > ControllerBasePtr
Definition: vehicle_interface_node.hpp:99
autoware::drivers::vehicle_interface::VehicleInterfaceNode::VehicleFilter::front_steer
FilterBasePtr front_steer
Definition: vehicle_interface_node.hpp:108
safety_state_machine.hpp
Input validation state machine.
VEHICLE_INTERFACE_PUBLIC
#define VEHICLE_INTERFACE_PUBLIC
Definition: drivers/vehicle_interface/include/vehicle_interface/visibility_control.hpp:44