81 const std::string& description,
82 const bool add_to_auto_reconfigurable_params,
83 const bool is_required,
85 const std::optional<double>& from_value,
86 const std::optional<double>& to_value,
87 const std::optional<double>& step_value,
88 const std::string& additional_constraints) {
89 rcl_interfaces::msg::ParameterDescriptor param_desc;
90 param_desc.description = description;
91 param_desc.additional_constraints = additional_constraints;
92 param_desc.read_only = read_only;
94 auto type = rclcpp::ParameterValue(param).get_type();
96 if (from_value.has_value() && to_value.has_value()) {
97 if constexpr (std::is_integral_v<T>) {
98 rcl_interfaces::msg::IntegerRange range;
99 range.set__from_value(
static_cast<T
>(from_value.value())).set__to_value(
static_cast<T
>(to_value.value()));
100 if (step_value.has_value()) range.set__step(
static_cast<T
>(step_value.value()));
101 param_desc.integer_range = {range};
102 }
else if constexpr (std::is_floating_point_v<T>) {
103 rcl_interfaces::msg::FloatingPointRange range;
104 range.set__from_value(
static_cast<T
>(from_value.value())).set__to_value(
static_cast<T
>(to_value.value()));
105 if (step_value.has_value()) range.set__step(
static_cast<T
>(step_value.value()));
106 param_desc.floating_point_range = {range};
108 RCLCPP_WARN(this->get_logger(),
"Parameter type of parameter '%s' does not support specifying a range", name.c_str());
112 this->declare_parameter(name, type, param_desc);
115 param = this->get_parameter(name).get_value<T>();
116 std::stringstream ss;
117 ss <<
"Loaded parameter '" << name <<
"': ";
120 for (
const auto& element : param) ss << element << (&element != ¶m.back() ?
", " :
"");
125 RCLCPP_INFO_STREAM(this->get_logger(), ss.str());
126 }
catch (rclcpp::exceptions::ParameterUninitializedException&) {
128 RCLCPP_FATAL_STREAM(this->get_logger(),
"Missing required parameter '" << name <<
"', exiting");
131 std::stringstream ss;
132 ss <<
"Missing parameter '" << name <<
"', using default value: ";
135 for (
const auto& element : param) ss << element << (&element != ¶m.back() ?
", " :
"");
140 RCLCPP_WARN_STREAM(this->get_logger(), ss.str());
141 this->set_parameters({rclcpp::Parameter(name, rclcpp::ParameterValue(param))});
145 if (add_to_auto_reconfigurable_params) {
146 std::function<void(
const rclcpp::Parameter&)> setter = [¶m](
const rclcpp::Parameter& p) { param = p.get_value<T>(); };
158 const std::vector<rclcpp::Parameter>& parameters) {
159 for (
const auto& param : parameters) {
161 if (param.get_name() == std::get<0>(auto_reconfigurable_param)) {
162 std::get<1>(auto_reconfigurable_param)(param);
163 RCLCPP_INFO(this->get_logger(),
"Reconfigured parameter '%s' to: %s", param.get_name().c_str(),
164 param.value_to_string().c_str());
168 if (param.get_name() ==
"publish_frequency") {
173 rcl_interfaces::msg::SetParametersResult result;
174 result.successful =
true;
218 perception_msgs::msg::EgoData::UniquePtr egodata = std::make_unique<perception_msgs::msg::EgoData>();
220 perception_msgs::object_access::initializeState(*egodata, perception_msgs::msg::EGO::MODEL_ID);
221 perception_msgs::object_access::setVelLon(*egodata,
ego_vel_lon_);
222 perception_msgs::object_access::setAccLon(*egodata,
ego_acc_lon_);
225 perception_msgs::object_access::initializeState(*egodata, perception_msgs::msg::EGORWS::MODEL_ID);
226 perception_msgs::object_access::setVelLon(*egodata,
ego_vel_lon_);
227 perception_msgs::object_access::setVelLat(*egodata, 0.0);
228 perception_msgs::object_access::setAccLon(*egodata,
ego_acc_lon_);
229 perception_msgs::object_access::setAccLat(*egodata, 0.0);
233 RCLCPP_FATAL(this->get_logger(),
"Invalid ego_state_model '%s'. Valid values are 'ackermann' and 'rws'.",
243 egodata->header.stamp = this->now();
249 trajectory_planning_msgs::msg::Trajectory::UniquePtr trajectory = std::make_unique<trajectory_planning_msgs::msg::Trajectory>();
250 trajectory_planning_msgs::trajectory_access::initializeTrajectory(
253 trajectory->header.stamp = this->now();
263 std::vector<double> state0 = {t, x, y, v};
264 trajectory_planning_msgs::trajectory_access::setState(*trajectory, state0, 0);
267 double theta_rad = theta * M_PI / 180.0;
268 double vx = v * std::cos(theta_rad);
269 double vy = v * std::sin(theta_rad);
274 x = x + vx * dt + 0.5 * ax * dt * dt;
275 y = y + vy * dt + 0.5 * ay * dt * dt;
278 v = std::sqrt(vx * vx + vy * vy);
280 theta = theta_rad * 180.0 / M_PI;
282 std::vector<double> state = {t, x, y, v};
283 trajectory_planning_msgs::trajectory_access::setState(*trajectory, state, i);
287 RCLCPP_DEBUG(this->get_logger(),
"Published trajectory");
291 perception_msgs::msg::ObjectList::UniquePtr object_list = std::make_unique<perception_msgs::msg::ObjectList>();
292 object_list->header.stamp = this->now();
296 perception_msgs::msg::Object obj;
297 perception_msgs::object_access::initializeState(obj, perception_msgs::msg::ISCACTR::MODEL_ID);
302 perception_msgs::object_access::setX(obj, x);
303 perception_msgs::object_access::setY(obj, y);
304 perception_msgs::object_access::setZ(obj, z);
305 perception_msgs::object_access::setYaw(obj,
object_yaw_);
307 perception_msgs::object_access::setWidth(obj,
object_width_);
308 perception_msgs::object_access::setHeight(obj, h);
309 object_list->objects.push_back(obj);