Cartographer保存建图轨迹

Cartographer保存建图轨迹

需求:从cartographer建好的地图中保存建图轨迹。
思路:在使用cartographer建图的过程中,找到cartographer 提供的 “/trajectory_query” 服务(可以用“rosrun rqt_service_caller rqt_service_caller”命令),请求后会得到当前轨迹每一帧的位姿。在源码中找到这部分内容,将其保存为txt文件即可。
方法:源码node.cc中,修改HandleTrajectoryQuery函数:

bool Node::HandleTrajectoryQuery(
    ::cartographer_ros_msgs::TrajectoryQuery::Request& request,
    ::cartographer_ros_msgs::TrajectoryQuery::Response& response) {
  absl::MutexLock lock(&mutex_);
  response.status = TrajectoryStateToStatus(
      request.trajectory_id,
      {TrajectoryState::ACTIVE, TrajectoryState::FINISHED,
       TrajectoryState::FROZEN} /* valid states */);
  if (response.status.code != cartographer_ros_msgs::StatusCode::OK) {
    LOG(ERROR) << "Can't query trajectory from pose graph: "
               << response.status.message;
    return true;
  }
  map_builder_bridge_.HandleTrajectoryQuery(request, response);

  // 保存轨迹为txt文件
  std::cout << "receiving" << std::endl;
  std::string txt_filename = "/home/xxx/xxx.txt";
  std::ofstream outf(txt_filename, std::ios::app);
  for (int i = 0; i < response.trajectory.size(); i++){
    int32_t sec = response.trajectory[i].header.stamp.sec;
    int32_t nsec = response.trajectory[i].header.stamp.nsec;
    double x = response.trajectory[i].pose.position.x;
    double y = response.trajectory[i].pose.position.y;
    double z = response.trajectory[i].pose.position.z;
    outf << std::setprecision(20) << sec << "." << nsec << " " << x << " " << y << " " << z << std::endl;
  }

  return true;
}

效果
轨迹:
在这里插入图片描述

点云+轨迹: 在这里插入图片描述

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值