21 namespace std_ph = std::placeholders;
37 auto error_double = update_params<double>({
43 rcl_interfaces::msg::SetParametersResult result;
45 result.successful = !error_double;
66 rclcpp::SubscriptionOptions intra_proc_disabled;
67 intra_proc_disabled.use_intra_process_comm = rclcpp::IntraProcessSetting::Disable;
69 auto sub_qos_transient_local = rclcpp::QoS(rclcpp::KeepAll());
70 sub_qos_transient_local.transient_local();
72 control_cmd_sub_ = create_subscription<autoware_auto_msgs::msg::AckermannControlCommand>(
"trajectory_follower/control_cmd", sub_qos_transient_local,
76 autoware_traj_pub_ = create_publisher<autoware_auto_msgs::msg::Trajectory>(
"trajectory_follower/reference_trajectory", 10);
77 autoware_state_pub_ = create_publisher<autoware_auto_msgs::msg::VehicleKinematicState>(
"trajectory_follower/current_kinematic_state", 10);
82 std::chrono::milliseconds(33),
86 return CallbackReturn::SUCCESS;
92 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"trajectory_follower_wrapper"),
"In autoware info timer callback");
112 if (std::abs(twist.twist.linear.x) <
EPSILON )
118 return steering_angle;
123 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"trajectory_follower_wrapper"),
"In ackermann control callback");
130 autoware_auto_msgs::msg::VehicleKinematicState state;
131 state.header = pose.header;
132 state.header.frame_id =
"map";
133 state.state.x = pose.pose.position.x;
134 state.state.y = pose.pose.position.y;
135 state.state.z = pose.pose.position.z;
136 state.state.heading.real = pose.pose.orientation.w;
137 state.state.heading.imag = pose.pose.orientation.z;
140 state.state.longitudinal_velocity_mps = twist.twist.linear.x;
141 state.state.lateral_velocity_mps = twist.twist.linear.y;
142 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"trajectory_follower_wrapper"),
"front_wheel_angle_rad: " << state.state.front_wheel_angle_rad);
151 autoware_msgs::msg::ControlCommandStamped return_cmd;
152 return_cmd.header.stamp = cmd.stamp;
154 return_cmd.cmd.linear_acceleration = cmd.longitudinal.acceleration;
155 return_cmd.cmd.linear_velocity = cmd.longitudinal.speed;
156 return_cmd.cmd.steering_angle = cmd.lateral.steering_tire_angle;
158 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"trajectory_follower_wrapper"),
"generated command cmd.stamp: " <<
std::to_string(rclcpp::Time(cmd.stamp).seconds()));
159 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"trajectory_follower_wrapper"),
"generated command cmd.longitudinal.acceleration: " << cmd.longitudinal.acceleration);
160 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"trajectory_follower_wrapper"),
"generated command cmd.longitudinal.speed: " << cmd.longitudinal.speed);
161 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"trajectory_follower_wrapper"),
"generated command cmd.lateral.steering_tire_angle: " << cmd.lateral.steering_tire_angle);
162 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"trajectory_follower_wrapper"),
"generated command cmd.lateral.steering_tire_rotation_rate: " << cmd.lateral.steering_tire_rotation_rate);
170 autoware_msgs::msg::ControlCommandStamped converted_cmd;
174 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"trajectory_follower_wrapper"),
"Insufficient data, empty control command generated");
175 return converted_cmd;
181 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"trajectory_follower_wrapper"),
"Control Command is old, empty control command generated");
182 return converted_cmd;
187 return converted_cmd;
192 double difference = std::abs(this->now().seconds() - rclcpp::Time(cmd.stamp).seconds());
215#include "rclcpp_components/register_node_macro.hpp"
boost::optional< geometry_msgs::msg::TwistStamped > current_twist_
The most recent velocity message received by this node.
boost::optional< carma_planning_msgs::msg::TrajectoryPlan > current_trajectory_
The most recent trajectory received by this plugin.
boost::optional< geometry_msgs::msg::PoseStamped > current_pose_
The most recent pose message received by this node.
bool isControlCommandOld(const autoware_auto_msgs::msg::AckermannControlCommand &cmd) const
Check to see if the received control command recent or old.
rclcpp::TimerBase::SharedPtr autoware_info_timer_
autoware_msgs::msg::ControlCommandStamped convert_cmd(const autoware_auto_msgs::msg::AckermannControlCommand &cmd) const
convert autoware Ackermann control command to autoware stamped control command
carma_ros2_utils::PubPtr< autoware_auto_msgs::msg::Trajectory > autoware_traj_pub_
carma_ros2_utils::PubPtr< autoware_auto_msgs::msg::VehicleKinematicState > autoware_state_pub_
double get_wheel_angle_rad_from_twist(const geometry_msgs::msg::TwistStamped &twist) const
calculate wheel angle in rad from angular velocity in twist message
carma_ros2_utils::SubPtr< autoware_auto_msgs::msg::AckermannControlCommand > control_cmd_sub_
void ackermann_control_cb(const autoware_auto_msgs::msg::AckermannControlCommand::SharedPtr msg)
autoware's control subscription callback
void autoware_info_timer_callback()
Timer callback to spin at 30 hz and frequently publish autoware kinematic state and trajectory.
TrajectoryFollowerWrapperNode(const rclcpp::NodeOptions &options)
Node constructor.
rcl_interfaces::msg::SetParametersResult parameter_update_callback(const std::vector< rclcpp::Parameter > ¶meters)
Callback for dynamic parameter updates.
autoware_auto_msgs::msg::VehicleKinematicState convert_state(const geometry_msgs::msg::PoseStamped &pose, const geometry_msgs::msg::TwistStamped &twist) const
convert vehicle's pose and twist messages to autoware kinematic state
bool get_availability() override
Get the availability status of this plugin based on the current operating environment....
TrajectoryFollowerWrapperConfig config_
std::optional< autoware_auto_msgs::msg::AckermannControlCommand > received_ctrl_command_
autoware_msgs::msg::ControlCommandStamped generate_command() override
Extending class provided method which should generate a command message which will be published to th...
std::string get_version_id() override
Returns the version id of this plugin.
carma_ros2_utils::CallbackReturn on_configure_plugin() override
This method should be used to load parameters and will be called on the configure state transition.
autoware_auto_msgs::msg::Trajectory process_trajectory_plan(const carma_planning_msgs::msg::TrajectoryPlan &tp, double vehicle_response_lag)
Given a carma type of trajectory_plan, generate autoware type of trajectory accounting for speed_lag ...
void set_logger(rclcpp::Logger logger)
Replace the module-level logger used by all basic_autonomy functions.
rclcpp::Logger get_logger()
Return the module-level logger used by all basic_autonomy functions.
auto to_string(const UtmZone &zone) -> std::string
Stuct containing the algorithm configuration values for trajectory_follower_wrapper.
double vehicle_response_lag
double incoming_cmd_time_threshold
double vehicle_wheel_base