(七)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發送信息,獲取地圖
(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消息
(4)move_base節點在executeCb函數中的 bool done = executeCycle(goal, global_plan)中發送cmd_vel信息,gazebo接收此信息并控制機器人運動,
首先新建一個路徑規劃類
以上是使用插件的方式新建一個nav_core::BaseGlobalPlanne類。相當于new 一個這樣的類。初始化的時候要將costmap地圖傳給該類。
初始化好后就要根據起始點,終點和地圖來找全局路徑了
找到路徑后將路徑發給局部地圖規劃器
nav_core::BaseLocalPlanne tc_
首先設置路徑,
然后將根據路徑計算控制命令
tc_->computeVelocityCommands(cmd_vel)完成路徑規劃。
如何生成導航路徑主要由makePlan來實現,具體使用什么算法生成導航路徑將在下篇博文中介紹
下圖為節點關系圖
總結
以上是生活随笔為你收集整理的(七)turtlebot3导航包解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Selenium中的EC模块
- 下一篇: 弘辽科技:手淘客是什么意思?如何去查看?