地图导航需要启动amcl节点和move_base节点,rviz节点。

1.amcl节点

(1)amcl接收从rviz中传送过来的初始化位置。

initial_pose_sub_ = nh_.subscribe("initialpose", 2, &AmclNode::initialPoseReceived, this);

订阅rviz 发布的initialpose话题。如果收到rviz中传送过来的初始化位置调用AmclNode::initialPoseReceived函数。
(2)amcl向map_server发送信息,获取地图

requestMap()

(3)如果获取地图和初始化位置成功,初始化粒子滤波

AmclNode::applyInitialPose()

(4)初始化激光,广播tf信息。

 this->tfb_->sendTransform(tmp_tf_stamped);

2.move_base节点

(1)move_base节点从amcl接收tf消息,其中固定的frame为map,就是原点位置的名字叫做map,由于amcl中已经由粒子滤波计算出来了机器相对于地图的位置,用odom表示机器,那么amcl发送odom到map的tf在move_base节点中就可以接收到了。

tf::TransformListener tf(ros::Duration(10));
move_base::MoveBase move_base( tf );

(2)move_base节点新建局部地图和全局地图,并发送地图信息

 controller_costmap_ros_ = new costmap_2d::Costmap2DROS("local_costmap", tf_);

其中Costmap2DROS类中发送地图信息

publisher_ = new Costmap2DPublisher(&private_nh, layered_costmap_->getCostmap(), global_frame_, "costmap",always_send_full_costmap);

(3)当move_base节点的局部地图和全局地图启动后,local_costmap从gazebo中接收里程计信息/odom和激光信息/scan并且更新局部地图。同时更新全局地图。

  // Start actively updating costmaps based on sensor dataplanner_costmap_ros_->start();

查看start函数发现将所有的插件设置为activate

(*plugin)->activate();

发现加载的插件为costmap_2d::InflationLayer ,costmap_2d::ObstacleLayer ,
costmap_2d::StaticLayer,costmap_2d::VoxelLayer
在costmap_2d::ObstacleLayer 类中的可以发现此类订阅了sensor_msgs::LaserScan消息

  boost::shared_ptr < message_filters::Subscriber<sensor_msgs::LaserScan>> sub(new message_filters::Subscriber<sensor_msgs::LaserScan>(g_nh, topic, 50));

(4)move_base节点在executeCb函数中的 bool done = executeCycle(goal, global_plan)中发送cmd_vel信息,gazebo接收此信息并控制机器人运动,
首先新建一个路径规划类

 boost::shared_ptr<nav_core::BaseGlobalPlanner> planner_planner_ = bgp_loader_.createInstance(global_planner);planner_->initialize(bgp_loader_.getName(global_planner), planner_costmap_ros_);

以上是使用插件的方式新建一个nav_core::BaseGlobalPlanne类。相当于new 一个这样的类。初始化的时候要将costmap地图传给该类。
初始化好后就要根据起始点,终点和地图来找全局路径了

planner_->makePlan(start, req.goal, global_plan)

找到路径后将路径发给局部地图规划器
nav_core::BaseLocalPlanne tc_
首先设置路径,

tc_->setPlan(*controller_plan_)

然后将根据路径计算控制命令

tc_->computeVelocityCommands(cmd_vel)

完成路径规划。

如何生成导航路径主要由makePlan来实现,具体使用什么算法生成导航路径将在下篇博文中介绍

下图为节点关系图

(七)turtlebot3导航包解析相关推荐

  1. SSL加密包解析的几个概念梳理

    1.DPI技术初识 DPI(Deep PacketInspection)深度包检测技术是在传统IP数据包检测技术(OSI L2-L4之间包含的数据包元素的检测分析)之上增加了对应用层数据的应用协议识别 ...

  2. 机器人学习--AMCL导航包自己修改源码编译和调用方法

    说明 1: 使用的Ubuntu16.04 Linux系统: ROS kinetic版本: ROS及依赖库安装在 根目录下的 /opt/ros 官方的导航包已经被编译完成,源代码不在里面,源代码需要自己 ...

  3. vue-router进阶:路由使用归纳、路由导航守卫、导航守卫解析流程、

    一.定义和理解 导航守卫的作用:vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航. >>项目中应用场景举例:路由页面跳转时候进行登陆验证:路由跳转判断: 有多种机会 ...

  4. GPS NMEA数据包解析

    GPS NMEA数据包解析 NMEA-0183是美国国家海洋电子协会为海用电子设备制定的标准格式.它包含了定位时间,纬度,经度,高度,定位所用的卫星数,DOP值,差分状态和校正时段等很多信息 一 通用 ...

  5. wireshark官方文档第 9 章数据包解析

    第 9 章数据包解析 9.1. 数据包解析的工作原理 对于一个已封装好的协议包,每个解析器(dissector)对其负责的一部分协议进行解码,然后将解码过程交给后续的解析器. 每个解析都从帧(Fram ...

  6. 关于vivo 8.0和miui新系统android studio调试出现“包解析错误”的bug的解决办法

    最近在工作中遇到了调试的时候将app安装到vivo 手机上,出现了包解析错误的问题.一般来说这种问题只会出现在手机版本 小于 app所要求的最低版本的手机上.但是此vivo手机的版本是8.0,很显然不 ...

  7. 使用Golang flag包解析字符串

    本篇文章主要介绍如何使用flag包解析字符串,没有介绍flag包的详细使用,需要学习flag包如何使用的同学可以参考如下这篇文章: Go语言中使用flag包对命令行进行参数解析的方法 https:// ...

  8. 蓝牙4.0BLE抓包(二) – 广播包解析

    转自: http://www.cnblogs.com/aikm/p/5022502.html 版权声明:本文为博主原创文章,转载请注明作者和出处.    作者:强光手电[艾克姆科技-无线事业部] 在使 ...

  9. R学习_multitaper包解析2:子函数spec.mtm.dpss,dpssHelper

    前言 之前讲了MTM(多锥形窗谱估计)的相关原理,现在来分析一下它的R语言的实现,这个实现是提出人的学生写的,和matlab的实现进行对照分析,加深理解,提高大家对这门技术的掌握程度,解析的顺序依旧是 ...

最新文章

  1. 行情分析:下杀或不可持续,市场大概率继续震荡
  2. 深度分析蔡徐坤的百万流量数据,揭底哪些是假的!
  3. 基于supersocket、C#对JT808协议进行解析构建gps监控平台服务端
  4. JMeter 测试计划
  5. [YTU]_2390( 抽象一个形状类)
  6. 数据库三大范式(1NF,2NF,3NF)及ER图
  7. Spring 5 新特性:函数式Web框架
  8. 我犯的错误--struts标签s:radio
  9. 19级:班级日常分享 | 一天一瞬间
  10. sql server中存储过程提示错误
  11. linux mem设备是什么,linux下/dev/mem分析
  12. python series增加一行_关于python:将一个列表或系列作为一行添加到pandas DataFrame中?...
  13. paypal创建订单后怎么获得id_新支付无国界:PayPal注册教程
  14. JAVA 泛型 入门
  15. 影视APP直播盒子源码 第三方接口无需采集
  16. 怎么提供专利技术交底书
  17. Fall 2020 Berkeley cs61a Projects cats答案
  18. php开发微信小程序教程,从零开始开发微信小程序步骤(三)
  19. Java ques: Unknown initial character set index ‘255‘ received from server. Initial client character
  20. python中oserror_[python] 解决OSError:

热门文章

  1. 文本文档打开来是写字板怎么办
  2. Oracle获取指定月最后一天日期(last_day函数)
  3. R 一行代码出Cox回归模型的表格
  4. (javascript)(基础知识+实例) 15.JSON,对象克隆,正则表达式
  5. Python迭代器和生成器详解(包括yield详解)
  6. 【DockerCE】使用Portainer-ce管理监控docker容器实例
  7. 译:Dataiku 白皮书之《在银行和保险行业应用数据科学》
  8. MyBatisCodeHelper-Pro插件
  9. fatal The remote end hung up unexpectedly
  10. 安培龙IPO过会:年营收5亿 同创伟业与中移创新是股东