(七)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來實現,具體使用什麼演算法生成導航路徑將在下篇博文中介紹
下圖為節點關係圖