1. 程式人生 > >(七)turtlebot3導航包解析

(七)turtlebot3導航包解析

地圖導航需要啟動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 data
    planner_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來實現,具體使用什麼演算法生成導航路徑將在下篇博文中介紹

下圖為節點關係圖
這裡寫圖片描述