Apollo 11.0
自动驾驶开放平台
apollo::perception::onboard::TransformWrapper类 参考

#include <transform_wrapper.h>

apollo::perception::onboard::TransformWrapper 的协作图:

Public 成员函数

 TransformWrapper ()
 
 ~TransformWrapper ()=default
 
void Init (const std::string &sensor2novatel_tf2_child_frame_id)
 
void Init (const std::string &sensor2novatel_tf2_frame_id, const std::string &sensor2novatel_tf2_child_frame_id, const std::string &novatel2world_tf2_frame_id, const std::string &novatel2world_tf2_child_frame_id)
 
bool GetSensor2worldTrans (double timestamp, Eigen::Affine3d *sensor2world_trans, Eigen::Affine3d *novatel2world_trans=nullptr)
 
bool GetExtrinsics (Eigen::Affine3d *trans)
 
bool GetExtrinsics (double timestamp, Eigen::Affine3d *trans)
 
bool GetTrans (double timestamp, Eigen::Affine3d *trans, const std::string &frame_id, const std::string &child_frame_id)
 
bool GetExtrinsicsBySensorId (const std::string &from_sensor_id, const std::string &to_sensor_id, Eigen::Affine3d *trans)
 

Protected 成员函数

bool QueryTrans (double timestamp, StampedTransform *trans, const std::string &frame_id, const std::string &child_frame_id)
 

详细描述

在文件 transform_wrapper.h65 行定义.

构造及析构函数说明

◆ TransformWrapper()

apollo::perception::onboard::TransformWrapper::TransformWrapper ( )
inline

在文件 transform_wrapper.h67 行定义.

67{}

◆ ~TransformWrapper()

apollo::perception::onboard::TransformWrapper::~TransformWrapper ( )
default

成员函数说明

◆ GetExtrinsics() [1/2]

bool apollo::perception::onboard::TransformWrapper::GetExtrinsics ( double  timestamp,
Eigen::Affine3d *  trans 
)

在文件 transform_wrapper.cc226 行定义.

226 {
227 if (sensor2novatel_extrinsics_ == nullptr) {
228 StampedTransform trans_sensor2novatel;
229 if (!QueryTrans(timestamp, &trans_sensor2novatel,
230 sensor2novatel_tf2_frame_id_,
231 sensor2novatel_tf2_child_frame_id_)) {
232 return false;
233 }
234 sensor2novatel_extrinsics_.reset(new Eigen::Affine3d);
235 *sensor2novatel_extrinsics_ =
236 trans_sensor2novatel.translation * trans_sensor2novatel.rotation;
237 AINFO << "Get sensor2novatel extrinsics successfully.";
238 }
239 if (!inited_ || trans == nullptr || sensor2novatel_extrinsics_ == nullptr) {
240 AERROR << "TransformWrapper get extrinsics failed";
241 return false;
242 }
243 *trans = *sensor2novatel_extrinsics_;
244 return true;
245}
bool QueryTrans(double timestamp, StampedTransform *trans, const std::string &frame_id, const std::string &child_frame_id)
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42

◆ GetExtrinsics() [2/2]

bool apollo::perception::onboard::TransformWrapper::GetExtrinsics ( Eigen::Affine3d *  trans)

在文件 transform_wrapper.cc217 行定义.

217 {
218 if (!inited_ || trans == nullptr || sensor2novatel_extrinsics_ == nullptr) {
219 AERROR << "TransformWrapper get extrinsics failed";
220 return false;
221 }
222 *trans = *sensor2novatel_extrinsics_;
223 return true;
224}

◆ GetExtrinsicsBySensorId()

bool apollo::perception::onboard::TransformWrapper::GetExtrinsicsBySensorId ( const std::string &  from_sensor_id,
const std::string &  to_sensor_id,
Eigen::Affine3d *  trans 
)

在文件 transform_wrapper.cc326 行定义.

328 {
329 if (trans == nullptr) {
330 AERROR << "TransformWrapper get extrinsics failed";
331 return false;
332 }
333
334 algorithm::SensorManager* sensor_manager =
335 algorithm::SensorManager::Instance();
336 std::string frame_id = sensor_manager->GetFrameId(to_sensor_id);
337 std::string child_frame_id = sensor_manager->GetFrameId(from_sensor_id);
338
339 StampedTransform transform;
340 bool status = QueryTrans(0.0, &transform, frame_id, child_frame_id);
341 if (status) {
342 *trans = transform.translation * transform.rotation;
343 }
344 return status;
345}
std::string frame_id
Point cloud frame id

◆ GetSensor2worldTrans()

bool apollo::perception::onboard::TransformWrapper::GetSensor2worldTrans ( double  timestamp,
Eigen::Affine3d *  sensor2world_trans,
Eigen::Affine3d *  novatel2world_trans = nullptr 
)

在文件 transform_wrapper.cc165 行定义.

167 {
168 if (!inited_) {
169 AERROR << "TransformWrapper not Initialized,"
170 << " unable to call GetSensor2worldTrans.";
171 return false;
172 }
173
174 if (sensor2novatel_extrinsics_ == nullptr) {
175 StampedTransform trans_sensor2novatel;
176 if (!QueryTrans(timestamp, &trans_sensor2novatel,
177 sensor2novatel_tf2_frame_id_,
178 sensor2novatel_tf2_child_frame_id_)) {
179 return false;
180 }
181 sensor2novatel_extrinsics_.reset(new Eigen::Affine3d);
182 *sensor2novatel_extrinsics_ =
183 trans_sensor2novatel.translation * trans_sensor2novatel.rotation;
184 AINFO << "Get sensor2novatel extrinsics successfully.";
185 }
186
187 StampedTransform trans_novatel2world;
188 trans_novatel2world.timestamp = timestamp;
189 Eigen::Affine3d novatel2world;
190
191 if (!QueryTrans(timestamp, &trans_novatel2world, novatel2world_tf2_frame_id_,
192 novatel2world_tf2_child_frame_id_)) {
193 if (FLAGS_obs_enable_local_pose_extrapolation) {
194 if (!transform_cache_.QueryTransform(
195 timestamp, &trans_novatel2world,
196 FLAGS_obs_max_local_pose_extrapolation_latency)) {
197 return false;
198 }
199 } else {
200 return false;
201 }
202 } else if (FLAGS_obs_enable_local_pose_extrapolation) {
203 transform_cache_.AddTransform(trans_novatel2world);
204 }
205
206 novatel2world =
207 trans_novatel2world.translation * trans_novatel2world.rotation;
208 *sensor2world_trans = novatel2world * (*sensor2novatel_extrinsics_);
209 if (novatel2world_trans != nullptr) {
210 *novatel2world_trans = novatel2world;
211 }
212 AINFO << "Get pose timestamp: " << timestamp << ", pose: \n"
213 << (*sensor2world_trans).matrix();
214 return true;
215}
bool QueryTransform(double timestamp, StampedTransform *transform, double max_duration=0.0)
void AddTransform(const StampedTransform &transform)

◆ GetTrans()

bool apollo::perception::onboard::TransformWrapper::GetTrans ( double  timestamp,
Eigen::Affine3d *  trans,
const std::string &  frame_id,
const std::string &  child_frame_id 
)

在文件 transform_wrapper.cc247 行定义.

249 {
250 StampedTransform transform;
251 if (!QueryTrans(timestamp, &transform, frame_id, child_frame_id)) {
252 if (!FLAGS_obs_enable_local_pose_extrapolation ||
253 !transform_cache_.QueryTransform(
254 timestamp, &transform,
255 FLAGS_obs_max_local_pose_extrapolation_latency)) {
256 return false;
257 }
258 }
259
260 if (FLAGS_obs_enable_local_pose_extrapolation) {
261 transform_cache_.AddTransform(transform);
262 }
263
264 *trans = transform.translation * transform.rotation;
265 return true;
266}

◆ Init() [1/2]

void apollo::perception::onboard::TransformWrapper::Init ( const std::string &  sensor2novatel_tf2_child_frame_id)

在文件 transform_wrapper.cc141 行定义.

142 {
143 sensor2novatel_tf2_frame_id_ = FLAGS_obs_sensor2novatel_tf2_frame_id;
144 sensor2novatel_tf2_child_frame_id_ = sensor2novatel_tf2_child_frame_id;
145 novatel2world_tf2_frame_id_ = FLAGS_obs_novatel2world_tf2_frame_id;
146 novatel2world_tf2_child_frame_id_ =
147 FLAGS_obs_novatel2world_tf2_child_frame_id;
148 transform_cache_.SetCacheDuration(FLAGS_obs_transform_cache_size);
149 inited_ = true;
150}

◆ Init() [2/2]

void apollo::perception::onboard::TransformWrapper::Init ( const std::string &  sensor2novatel_tf2_frame_id,
const std::string &  sensor2novatel_tf2_child_frame_id,
const std::string &  novatel2world_tf2_frame_id,
const std::string &  novatel2world_tf2_child_frame_id 
)

在文件 transform_wrapper.cc152 行定义.

156 {
157 sensor2novatel_tf2_frame_id_ = sensor2novatel_tf2_frame_id;
158 sensor2novatel_tf2_child_frame_id_ = sensor2novatel_tf2_child_frame_id;
159 novatel2world_tf2_frame_id_ = novatel2world_tf2_frame_id;
160 novatel2world_tf2_child_frame_id_ = novatel2world_tf2_child_frame_id;
161 transform_cache_.SetCacheDuration(FLAGS_obs_transform_cache_size);
162 inited_ = true;
163}

◆ QueryTrans()

bool apollo::perception::onboard::TransformWrapper::QueryTrans ( double  timestamp,
StampedTransform trans,
const std::string &  frame_id,
const std::string &  child_frame_id 
)
protected

在文件 transform_wrapper.cc268 行定义.

270 {
271 cyber::Time query_time(timestamp);
272 std::string err_string;
273 if (!tf2_buffer_->canTransform(frame_id, child_frame_id, query_time,
274 static_cast<float>(FLAGS_obs_tf2_buff_size),
275 &err_string)) {
277 double latest_buffer_time;
278 if (!FLAGS_hardware_trigger) {
279 try {
280 latest_transform = tf2_buffer_->lookupTransform(
281 frame_id, child_frame_id, apollo::cyber::Time(0));
282 latest_buffer_time = latest_transform.header().timestamp_sec();
283 } catch (tf2::TransformException& ex) {
284 AERROR << ex.what();
285 return false;
286 }
287 }
288 // In simulation mode, use the latest transform information if query failed.
289 if (!cyber::common::GlobalData::Instance()->IsRealityMode()) {
290 query_time = cyber::Time(0);
291 } else if (!FLAGS_hardware_trigger &&
292 (timestamp - latest_buffer_time < 0.015) &&
293 (timestamp - latest_buffer_time > 0)) {
294 // soft trigger and the latency is within the tolerance range
295 query_time = apollo::cyber::Time(0);
296 } else {
297 AERROR << "Can not find transform. " << FORMAT_TIMESTAMP(timestamp)
298 << " frame_id: " << frame_id
299 << " child_frame_id: " << child_frame_id
300 << " Error info: " << err_string;
301 return false;
302 }
303 }
304
305 apollo::transform::TransformStamped stamped_transform;
306 try {
307 stamped_transform =
308 tf2_buffer_->lookupTransform(frame_id, child_frame_id, query_time);
309
310 trans->translation =
311 Eigen::Translation3d(stamped_transform.transform().translation().x(),
312 stamped_transform.transform().translation().y(),
313 stamped_transform.transform().translation().z());
314 trans->rotation =
315 Eigen::Quaterniond(stamped_transform.transform().rotation().qw(),
316 stamped_transform.transform().rotation().qx(),
317 stamped_transform.transform().rotation().qy(),
318 stamped_transform.transform().rotation().qz());
319 } catch (tf2::TransformException& ex) {
320 AERROR << ex.what();
321 return false;
322 }
323 return true;
324}
Cyber has builtin time type Time.
Definition time.h:31
virtual bool canTransform(const std::string &target_frame, const std::string &source_frame, const cyber::Time &target_time, const float timeout_second=0.01f, std::string *errstr=nullptr) const
Test if a transform is possible
Definition buffer.cc:195
virtual TransformStamped lookupTransform(const std::string &target_frame, const std::string &source_frame, const cyber::Time &time, const float timeout_second=0.01f) const
Get the transform between two frames by frame ID.
Definition buffer.cc:168
#define FORMAT_TIMESTAMP(timestamp)
Definition string_util.h:29
optional double timestamp_sec
Definition header.proto:9
optional apollo::common::Header header
optional apollo::common::Quaternion rotation
optional apollo::common::Point3D translation

该类的文档由以下文件生成: