-
Notifications
You must be signed in to change notification settings - Fork 706
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(aw_pose_covariance_modifier_node): add aw_pose_covariance_modifier for using NDT and GNSS together #6477
Changes from all commits
d033fff
569a35b
ca65b0f
4beaa63
2a9d376
43c4f29
9f0e647
f62a230
99524bd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
cmake_minimum_required(VERSION 3.14) | ||
project(aw_pose_covariance_modifier_node) | ||
|
||
find_package(autoware_cmake REQUIRED) | ||
autoware_package() | ||
find_package(rclcpp REQUIRED) | ||
find_package(geometry_msgs REQUIRED) | ||
find_package(rcl_interfaces REQUIRED) | ||
set(NODE_NAME ${PROJECT_NAME}) | ||
set(EXEC_NAME ${PROJECT_NAME}_exe) | ||
|
||
add_executable(${PROJECT_NAME} src/aw_pose_covariance_modifier_node.cpp) | ||
|
||
ament_target_dependencies(${PROJECT_NAME} rclcpp geometry_msgs rcl_interfaces) | ||
|
||
install(TARGETS | ||
${PROJECT_NAME} | ||
DESTINATION lib/${PROJECT_NAME} | ||
) | ||
include_directories(src/include/) | ||
|
||
#ament_auto_add_library(${NODE_NAME} | ||
# src/include/aw_pose_covariance_modifier_node.hpp | ||
# src/aw_pose_covariance_modifier_node.cpp) | ||
|
||
#rclcpp_components_register_node(${NODE_NAME} | ||
# PLUGIN "aw_pose_covariance_modifier_node::AWPoseCovarianceModifierNode" | ||
# EXECUTABLE ${EXEC_NAME}) | ||
|
||
|
||
ament_auto_package(INSTALL_TO_SHARE | ||
launch) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
# aw_pose_covariance_modifier |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<launch> | ||
<arg name="input_trusted_pose_with_cov_topic" default="/sensing/gnss/pose_with_covariance" description="Trusted pose input .. "/> | ||
<arg name="output_pose_with_covariance_topic" default="/localization/pose_estimator/pose_with_covariance" description="Estimated self position with covariance"/> | ||
|
||
<node pkg="aw_pose_covariance_modifier_node" exec="aw_pose_covariance_modifier_node" name="aw_pose_covariance_modifier_node" output="screen"> | ||
<remap from="input_trusted_pose_with_cov_topic" to="$(var input_trusted_pose_with_cov_topic)"/> | ||
<remap from="output_pose_with_covariance_topic" to="$(var output_pose_with_covariance_topic)"/> | ||
</node> | ||
</launch> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
<?xml version="1.0"?> | ||
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?> | ||
<package format="3"> | ||
<name>aw_pose_covariance_modifier_node</name> | ||
<version>1.0.0</version> | ||
<description>Converts an autoware_msgs message to autoware_auto_msgs version and publishes it.</description> | ||
|
||
<maintainer email="melike@leodrive.ai">Melike Tanrikulu</maintainer> | ||
|
||
<license>Apache License 2.0</license> | ||
|
||
<buildtool_depend>ament_cmake_auto</buildtool_depend> | ||
<buildtool_depend>autoware_cmake</buildtool_depend> | ||
|
||
<build_depend>rosidl_default_generators</build_depend> | ||
|
||
<depend>geometry_msgs</depend> | ||
<depend>rcl_interfaces</depend> | ||
<depend>rclcpp</depend> | ||
<depend>rclcpp_components</depend> | ||
|
||
<export> | ||
<build_type>ament_cmake</build_type> | ||
</export> | ||
</package> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
// Copyright 2024 The Autoware Foundation | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
#include "include/aw_pose_covariance_modifier_node.hpp" | ||
|
||
#include <rclcpp/rclcpp.hpp> | ||
|
||
AWPoseCovarianceModifierNode::AWPoseCovarianceModifierNode() : Node("AWPoseCovarianceModifierNode") | ||
Check warning on line 19 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
{ | ||
trusted_pose_with_cov_sub_ = | ||
this->create_subscription<geometry_msgs::msg::PoseWithCovarianceStamped>( | ||
Check warning on line 22 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
"input_trusted_pose_with_cov_topic", 10000, | ||
std::bind( | ||
Check warning on line 24 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
&AWPoseCovarianceModifierNode::trusted_pose_with_cov_callback, this, | ||
std::placeholders::_1)); | ||
|
||
new_pose_estimator_pub_ = this->create_publisher<geometry_msgs::msg::PoseWithCovarianceStamped>( | ||
Check warning on line 28 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
"output_pose_with_covariance_topic", 10); | ||
|
||
client_ = this->create_client<rcl_interfaces::srv::SetParameters>( | ||
Check warning on line 31 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
"/localization/pose_estimator/ndt_scan_matcher/set_parameters"); | ||
|
||
while (!client_->wait_for_service(std::chrono::seconds(1)) && rclcpp::ok()) { | ||
RCLCPP_INFO(this->get_logger(), "Waiting for aw_pose_covariance_modifier_node service..."); | ||
Check warning on line 35 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
} | ||
|
||
activateNDTCovModifier = AWPoseCovarianceModifierNode::callNDTCovarianceModifier(); | ||
if (activateNDTCovModifier == 1) { | ||
RCLCPP_INFO(get_logger(), "NDT pose covariance modifier activated ..."); | ||
Check warning on line 40 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
} else { | ||
RCLCPP_WARN(get_logger(), "Failed to enable NDT pose covariance modifier ..."); | ||
Check warning on line 42 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
} | ||
} | ||
Check warning on line 44 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
|
||
bool AWPoseCovarianceModifierNode::callNDTCovarianceModifier() | ||
Check warning on line 46 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
{ | ||
auto request = std::make_shared<rcl_interfaces::srv::SetParameters::Request>(); | ||
|
||
rcl_interfaces::msg::Parameter parameter; | ||
Check warning on line 50 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
parameter.name = "aw_pose_covariance_modifier.enable"; | ||
parameter.value.type = rcl_interfaces::msg::ParameterType::PARAMETER_BOOL; | ||
parameter.value.bool_value = true; | ||
Check warning on line 53 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
|
||
request->parameters.push_back(parameter); | ||
Check warning on line 55 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
|
||
client_->async_send_request( | ||
request, [this](rclcpp::Client<rcl_interfaces::srv::SetParameters>::SharedFuture result_) { | ||
auto result_status = result_.wait_for(std::chrono::seconds(1)); | ||
Check warning on line 59 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
|
||
if (result_status == std::future_status::ready) { | ||
Check warning on line 61 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
auto response = result_.get(); | ||
|
||
if (response && response->results.data()) { | ||
RCLCPP_INFO( | ||
Check warning on line 65 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
this->get_logger(), "aw_pose_covariance_modifier.enable parameter set successfully."); | ||
return true; | ||
Check warning on line 67 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
} else { | ||
RCLCPP_ERROR( | ||
Check warning on line 69 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
this->get_logger(), | ||
"An error occurred while setting the aw_pose_covariance_modifier.enable parameter."); | ||
return false; | ||
Check warning on line 72 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
} | ||
} else { | ||
RCLCPP_ERROR( | ||
Check warning on line 75 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
this->get_logger(), "The request was not completed within the specified time."); | ||
return false; | ||
Check warning on line 77 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
} | ||
}); | ||
return true; | ||
} | ||
Check warning on line 81 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
|
||
void AWPoseCovarianceModifierNode::trusted_pose_with_cov_callback( | ||
Check warning on line 83 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
const geometry_msgs::msg::PoseWithCovarianceStamped::ConstSharedPtr & msg) | ||
{ | ||
geometry_msgs::msg::PoseWithCovarianceStamped pose_estimator_pose = *msg; | ||
Check warning on line 86 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
|
||
trusted_pose_rmse_ = (std::sqrt(pose_estimator_pose.pose.covariance[0]) + | ||
std::sqrt(pose_estimator_pose.pose.covariance[7])) / | ||
Check warning on line 89 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
2; | ||
trusted_pose_yaw_rmse_in_degrees_ = | ||
std::sqrt(pose_estimator_pose.pose.covariance[35]) * 180 / M_PI; | ||
Check warning on line 92 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
|
||
if (trusted_pose_rmse_ > 0.25) { | ||
RCLCPP_INFO( | ||
Check warning on line 95 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
this->get_logger(), | ||
"Trusted Pose RMSE is under the threshold. It will not be used as a pose source."); | ||
} else { | ||
if (trusted_pose_yaw_rmse_in_degrees_ >= 0.3) { | ||
pose_estimator_pose.pose.covariance[35] = 1000000; | ||
Check warning on line 100 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
} | ||
|
||
new_pose_estimator_pub_->publish(pose_estimator_pose); | ||
Check warning on line 103 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
} | ||
} | ||
int main(int argc, char * argv[]) | ||
Check warning on line 106 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
{ | ||
rclcpp::init(argc, argv); | ||
rclcpp::spin(std::make_shared<AWPoseCovarianceModifierNode>()); | ||
rclcpp::shutdown(); | ||
Check warning on line 110 in localization/aw_pose_covariance_modifier_node/src/aw_pose_covariance_modifier_node.cpp
|
||
return 0; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
// Copyright 2024 The Autoware Foundation | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
#ifndef AW_POSE_COVARIANCE_MODIFIER_NODE_HPP_ | ||
#define AW_POSE_COVARIANCE_MODIFIER_NODE_HPP_ | ||
|
||
#include <rcl_interfaces/srv/set_parameters.hpp> | ||
#include <rclcpp/rclcpp.hpp> | ||
|
||
#include <geometry_msgs/msg/pose_with_covariance_stamped.hpp> | ||
|
||
#include <string> | ||
|
||
class AWPoseCovarianceModifierNode : public rclcpp::Node | ||
{ | ||
public: | ||
AWPoseCovarianceModifierNode(); | ||
|
||
rclcpp::Subscription<geometry_msgs::msg::PoseWithCovarianceStamped>::SharedPtr | ||
trusted_pose_with_cov_sub_; | ||
rclcpp::Publisher<geometry_msgs::msg::PoseWithCovarianceStamped>::SharedPtr | ||
new_pose_estimator_pub_; | ||
rclcpp::Client<rcl_interfaces::srv::SetParameters>::SharedPtr client_; | ||
|
||
void trusted_pose_with_cov_callback( | ||
const geometry_msgs::msg::PoseWithCovarianceStamped::ConstSharedPtr & msg); | ||
bool callNDTCovarianceModifier(); | ||
|
||
private: | ||
double trusted_pose_rmse_; | ||
double trusted_pose_yaw_rmse_in_degrees_; | ||
bool activateNDTCovModifier = 0; | ||
}; | ||
|
||
#endif // AW_POSE_COVARIANCE_MODIFIER_NODE_HPP_ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.