【移动机器人技术】cartographer定位模式下的功能开发(二):订阅/initialpose

google开发的cartographer开源包,既可以用来做SLAM建图,又可以用来做纯定位。
在实时定位工作过程中,若从外部信息获取到了机器人的准确位姿,如何像move_base中的amcl模块一样,通过订阅/initialpose话题达到修正定位结果的目的呢?
本文记录了整个操作流程。

2 实时修正定位位姿

2.1 编写回调函数

在文件node_main.cc的头部编写回调函数:
函数中订阅了/initialpose后,结束了当前活动的轨迹,设置轨迹配置选项中的起点为话题值,重新开启节点。

void Reset_InitPose_callback(const geometry_msgs::PoseWithCovarianceStamped::ConstPtr &msg) {

  // 关闭当前运行的Trajectories
  node_handle->FinishAllTrajectories();

  // 给轨迹设置起点 msg->pose.pose
  // start trajectory with initial pose
  *trajectory_options_handle->trajectory_builder_options.mutable_initial_trajectory_pose()->mutable_relative_pose()
    = cartographer::transform::ToProto(cartographer_ros::ToRigid3d(msg->pose.pose));

  // 重新开启Trajectory
  if (FLAGS_start_trajectory_with_default_topics) 
  {
    node_handle->StartTrajectoryWithDefaultTopics(*trajectory_options_handle);
  }
}

提示:如编译报错,提示“ error: ‘ToRigid3d’ is not a member of ‘cartographer_ros’ ”,则增加头文件包含,#include “cartographer_ros/msg_conversion.h”。

2.2 订阅/initialpose

  • 首先定义全局变量
    在文件node_main.cc头部位置
cartographer_ros::Node* node_handle;
cartographer_ros::TrajectoryOptions* trajectory_options_handle;
  • 初始化全局变量
    在文件node_main.cc的void Run()中:
trajectory_options_handle = &(trajectory_options);
node_handle = &(node);
  • 订阅话题
    在文件node_main.cc的void Run()函数中添加如下代码:
ros::Subscriber initPose_sub = node.node_handle()->subscribe("/initialpose", 1, Reset_InitPose_callback);
  • 1
    点赞
  • 32
    收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论 10

打赏作者

A MAN NAMED MAGIC

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值