19#include "modules/common_msgs/transform_msgs/transform.pb.h"
29namespace localization {
37 AERROR <<
"Init Config falseed.";
42 AERROR <<
"Init Interval falseed.";
47 if (!GetLocalizationToImuTF()) {
48 AERROR <<
"Get IMU to Localization tranform failed.";
55bool RTKLocalizationComponent::InitConfig() {
61 AINFO <<
"Rtk localization config: " << rtk_config.DebugString();
72 localization_->InitConfig(rtk_config);
77bool RTKLocalizationComponent::InitIO() {
78 corrected_imu_listener_ =
node_->CreateReader<localization::CorrectedImu>(
80 std::placeholders::_1));
81 ACHECK(corrected_imu_listener_);
83 gps_status_listener_ =
node_->CreateReader<drivers::gnss::InsStat>(
85 localization_.get(), std::placeholders::_1));
86 ACHECK(gps_status_listener_);
88 localization_talker_ =
89 node_->CreateWriter<LocalizationEstimate>(localization_topic_);
90 ACHECK(localization_talker_);
92 localization_status_talker_ =
93 node_->CreateWriter<LocalizationStatus>(localization_status_topic_);
94 ACHECK(localization_status_talker_);
98bool RTKLocalizationComponent::GetLocalizationToImuTF() {
99 transform::Buffer* tf2_buffer = transform::Buffer::Instance();
100 transform::TransformStamped tf;
101 cyber::Duration duration(1.0);
102 for (uint8_t i = 0; i < 10; ++i) {
104 tf = tf2_buffer->lookupTransform(
105 imu_frame_id_, broadcast_tf_child_frame_id_, cyber::Time(0));
106 }
catch (std::exception& ex) {
111 AINFO <<
"read localization to imu transform: " << tf.DebugString();
112 auto& rotation = tf.transform().rotation();
113 imu_localization_quat_.reset(
new Eigen::Quaterniond(
114 rotation.qw(), rotation.qx(), rotation.qy(), rotation.qz()));
115 auto& translation = tf.transform().translation();
116 imu_localization_translation_.reset(
117 new Eigen::Vector3d(translation.x(), translation.y(), translation.z()));
123void RTKLocalizationComponent::CompensateImuLocalizationExtrinsic(
124 LocalizationEstimate* localization) {
125 CHECK_NOTNULL(localization);
129 const Eigen::Quaterniond quaternion(orientation.
qw(), orientation.
qx(),
130 orientation.
qy(), orientation.
qz());
131 Eigen::Quaterniond quat_vehicle_world =
132 quaternion * (*imu_localization_quat_);
136 quat_vehicle_world.w(), quat_vehicle_world.x(), quat_vehicle_world.y(),
137 quat_vehicle_world.z()));
142 quat_vehicle_world.w(), quat_vehicle_world.x(), quat_vehicle_world.y(),
143 quat_vehicle_world.z());
144 eulerangles->set_x(euler_angle.pitch());
145 eulerangles->set_y(euler_angle.roll());
146 eulerangles->set_z(euler_angle.yaw());
150 Eigen::Vector3d compensated_position =
151 quat_vehicle_world.toRotationMatrix() * (*imu_localization_translation_);
152 position->set_x(position->
x() + compensated_position[0]);
153 position->set_y(position->
y() + compensated_position[1]);
154 position->set_z(position->
z() + compensated_position[2]);
158 const std::shared_ptr<localization::Gps>& gps_msg) {
159 localization_->GpsCallback(gps_msg);
161 if (localization_->IsServiceStarted()) {
163 localization_->GetLocalization(&localization);
165 localization_->GetLocalizationStatus(&localization_status);
168 CompensateImuLocalizationExtrinsic(&localization);
171 PublishPoseBroadcastTopic(localization);
172 PublishPoseBroadcastTF(localization);
173 PublishLocalizationStatus(localization_status);
174 ADEBUG <<
"[OnTimer]: Localization message publish success!";
180void RTKLocalizationComponent::PublishPoseBroadcastTF(
185 auto mutable_head = tf2_msg.mutable_header();
187 mutable_head->set_frame_id(broadcast_tf_frame_id_);
188 tf2_msg.set_child_frame_id(broadcast_tf_child_frame_id_);
190 auto mutable_translation = tf2_msg.mutable_transform()->mutable_translation();
191 mutable_translation->set_x(localization.
pose().
position().
x());
192 mutable_translation->set_y(localization.
pose().
position().
y());
193 mutable_translation->set_z(localization.
pose().
position().
z());
195 auto mutable_rotation = tf2_msg.mutable_transform()->mutable_rotation();
201 tf2_broadcaster_->SendTransform(tf2_msg);
204void RTKLocalizationComponent::PublishPoseBroadcastTopic(
205 const LocalizationEstimate& localization) {
206 localization_talker_->Write(localization);
209void RTKLocalizationComponent::PublishLocalizationStatus(
210 const LocalizationStatus& localization_status) {
211 localization_status_talker_->Write(localization_status);
std::shared_ptr< Node > node_
std::string config_file_path_
RTKLocalizationComponent()
bool Proc(const std::shared_ptr< localization::Gps > &gps_msg) override
void GpsStatusCallback(const std::shared_ptr< drivers::gnss::InsStat > &status_msg)
void ImuCallback(const std::shared_ptr< localization::CorrectedImu > &imu_msg)
Defines the EulerAnglesZXY class.
Math-related util functions.
EulerAnglesZXY< double > EulerAnglesZXYd
double QuaternionToHeading(const double qw, const double qx, const double qy, const double qz)
bool GetProtoFromFile(const std::string &file_name, google::protobuf::Message *message)
Parses the content of the file specified by the file_name as a representation of protobufs,...
Contains a number of helper functions related to quaternions.
optional apollo::localization::Pose pose
optional double measurement_time
optional apollo::common::Quaternion orientation
optional apollo::common::PointENU position
optional string broadcast_tf_child_frame_id
optional string broadcast_tf_frame_id
optional string imu_frame_id
optional string imu_topic
optional string localization_status_topic
optional string localization_topic
optional string gps_topic
optional string gps_status_topic