国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

47.在ROS中實(shí)現(xiàn)global planner(3)- 使用A*實(shí)現(xiàn)全局規(guī)劃

這篇具有很好參考價(jià)值的文章主要介紹了47.在ROS中實(shí)現(xiàn)global planner(3)- 使用A*實(shí)現(xiàn)全局規(guī)劃。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

接著之前45.在ROS中實(shí)現(xiàn)global planner(1)和46.在ROS中實(shí)現(xiàn)global planner(2)的鋪墊,在ROS中實(shí)現(xiàn)AStar Global Planner

1. planner package

  • 照著之前的模板,修改下名稱
git clone -b https://gitee.com/pibot/sample_global_planner.git astar_global_planner

再替換下所有的sample_global_planner–>astar_global_planner

  • 基于這個(gè)我們新增之前的astar算法
    拷貝astar_planner.h 和astar_planner.cpp 分別至includesrc目錄
  • 修改CMakeLists.txt
    • 添加編譯
    add_library(${PROJECT_NAME}
      src/planner_node.cpp
      src/astar_planner.cpp  # 新增
    )
    
    • 添加opencv的依賴
    find_package(catkin REQUIRED
    COMPONENTS
        costmap_2d
        OpenCV)
    
    • c++11支持
      使用了c++11 cmake打開配置
    add_compile_options(-std=c++11) 
    

直接編譯試下
catkin_make -DCATKIN_WHITELIST_PACKAGES=astar_global_planner
頭文件報(bào)錯(cuò),稍微修改下
#include "astar_global_planner/astar_planner.h"

2. 規(guī)劃實(shí)現(xiàn)

前面加入了編譯,下面我們具體新增其的使用

2.1 添加AStarPlanner

  • 把之前實(shí)現(xiàn)好的AStarPlanner 添加為GlobalPlanner的一個(gè)成員

      std::unique_ptr<AStarPlanner> planner_; // 這里我們指定為指針
    
  • 初始化接口添加對其的實(shí)例化

      planner_ = std::unique_ptr<AStarPlanner>(new AStarPlanner());
    

2.2 接口調(diào)用

AStarPlanner 主要的接口就是

bool Plan(const Mat& cost_map, const Point& start_point, const Point& end_point, std::vector<Point>& path, PlannerAction planner_action);

主要接收一個(gè)地圖參數(shù)cost_map, 一個(gè)起點(diǎn)start_point,一個(gè)終點(diǎn)end_point, 輸出為路徑path

planner_action為回調(diào)函數(shù) 之前調(diào)試顯示用,這里用不到, 傳入nullptr

  • 地圖

地圖參數(shù)在GlobalPlannerinitialize接口有指定,我們只需要在這里保存下來,保存至成員,后續(xù)函數(shù)中使用

void GlobalPlanner::initialize(std::string name, costmap_2d::Costmap2DROS* costmap_ros) {
  costmap_ = costmap_ros->getCostmap();

  int nx = costmap_->getSizeInCellsX(), ny = costmap_->getSizeInCellsY();
  double resolution = costmap_->getResolution();

  cv::Mat costmap_mat = cv::Mat(costmap_->getSizeInCellsY(), costmap_->getSizeInCellsX(), CV_8UC1, costmap_->getCharMap());
  costmap_mat_ = costmap_mat.clone();  // costmap_mat_保存地圖的拷貝
}
  • 起點(diǎn)&終點(diǎn)
    規(guī)劃接口中傳入了2個(gè)參數(shù)分別是起點(diǎn)和終點(diǎn),但需要注意傳入的點(diǎn)的坐標(biāo)系為世界坐標(biāo)系,并非地圖的坐標(biāo),所以需要做轉(zhuǎn)換,initialize傳入?yún)?shù)costmap_ros帶有轉(zhuǎn)換接口worldToMap直接調(diào)用即可,如下
  unsigned int start_x_i, start_y_i, goal_x_i, goal_y_i;

  double wx = start.pose.position.x;
  double wy = start.pose.position.y;
  costmap_->worldToMap(wx, wy, start_x_i, start_y_i);

  wx = goal.pose.position.x;
  wy = goal.pose.position.y;

  costmap_->worldToMap(wx, wy, goal_x_i, goal_y_i)
  • 執(zhí)行規(guī)劃
    只需要調(diào)用AStarPlannerPlan接口,傳入相應(yīng)的參數(shù)即可
  std::vector<Point> path;
  bool vaild = planner_->Plan(costmap_mat_, {start_x_i, start_y_i}, {goal_x_i, goal_y_i}, path, nullptr);
  • 輸出路徑
    同起點(diǎn)&終點(diǎn)相反,這里輸出路徑保存的是地圖坐標(biāo),所有需要轉(zhuǎn)換到世界坐標(biāo)返回,同樣使用costmap_ros的下mapToWorld接口即可
    另外AStarPlanner Plan接口輸出的路徑是從終點(diǎn)到起點(diǎn)的,這里需要反序列后輸出
bool GlobalPlanner::makePlan(const geometry_msgs::PoseStamped& start,
                             const geometry_msgs::PoseStamped& goal,
                             std::vector<geometry_msgs::PoseStamped>& plan) {
  ...

  geometry_msgs::PoseStamped pose = goal;

  // 使用path反向迭代器循環(huán)
  for (auto it = path.rbegin(); it != path.rend(); it++) {
    costmap_->mapToWorld(it->x, it->y, pose.pose.position.x, pose.pose.position.y);
    plan.push_back(pose);
  }
  
  // plan 即為需要返回和pub的路徑
  ....
}

3. 測試

  • 修改move_base_params.yaml中的base_global_planner

    base_global_planner: astar_global_planner/GlobalPlanner
    
  • 啟動模擬器
    pibot_simulator

  • 查看插件是否加載

    ? rosparam get /move_base/base_global_planner
    astar_global_planner/GlobalPlanner
    
  • 打開rviz查看
    pibot_view
    47.在ROS中實(shí)現(xiàn)global planner(3)- 使用A*實(shí)現(xiàn)全局規(guī)劃,ROS,ROS自主導(dǎo)航機(jī)器人,自動駕駛,c++,ros,人工智能

可以看出來AStar Global Planner已經(jīng)生效了,規(guī)劃路徑也出來了, 很不幸的是local planner一直無法正常運(yùn)行,顯然這個(gè)路徑規(guī)劃的太貼近障礙物。導(dǎo)致規(guī)劃的結(jié)果無法在實(shí)際機(jī)器人場景使用, 后續(xù)我們看看如何做優(yōu)化。

4. 優(yōu)化

4.1 規(guī)劃優(yōu)化

我們的A* 算法沒有考慮到障礙無的距離,導(dǎo)致可能緊挨著障礙物,我們需要在啟發(fā)函數(shù)新增里障礙物的距離值,以使得規(guī)劃路徑盡量遠(yuǎn)離障礙物。

ROS中的地圖是cost map,所謂cost map也就是每個(gè)grid點(diǎn)有自己的cost, 如官方的這張圖片
47.在ROS中實(shí)現(xiàn)global planner(3)- 使用A*實(shí)現(xiàn)全局規(guī)劃,ROS,ROS自主導(dǎo)航機(jī)器人,自動駕駛,c++,ros,人工智能

簡單的說在ROS中,未知區(qū)域值255, 障礙物為254,其他就是遠(yuǎn)離障礙物就越越小

  • 這樣我們在計(jì)算H的函數(shù)新增個(gè)參數(shù),同時(shí)添加相應(yīng)的weight

    float Point2PointPlanner::CalcH(const Point& current_point, const Point& end_point) {
      ...
      return min_diff * kCornerCost + (max_diff - min_diff) * kLineCost;
    }
    

    改為

    float Point2PointPlanner::CalcH(const Point& current_point, const Point& end_point, float cost) {
      ...
      return min_diff * kCornerCost + (max_diff - min_diff) * kLineCost + cost * kCost;
      }
    
  • 計(jì)算時(shí)傳入每個(gè)gridcost

    ...
      open_list_.emplace(start_point, 0, CalcH(start_point, end_point, cost_map_.at<unsigned char>(start_point.y, start_point.x)));
    
    ...`
    
      all_grid_[index].Update(neighbor, point, G, CalcH(neighbor, end_point, cost_map_.at<unsigned char>(neighbor.y, neighbor.x)));
    ...
    

再次編譯測試,結(jié)果如下圖,可以看到規(guī)劃的路徑在道路中間,并且local planner可以正常工作。`
47.在ROS中實(shí)現(xiàn)global planner(3)- 使用A*實(shí)現(xiàn)全局規(guī)劃,ROS,ROS自主導(dǎo)航機(jī)器人,自動駕駛,c++,ros,人工智能

4.2 路徑優(yōu)化

可以看到,規(guī)劃的路徑是還存在瑕疵,路徑是鋸齒狀的,對local planner的控制有一定影響,我們可以添加平滑處理,使得路徑更為平滑
參考ROS:一種簡單的基于global_planner的全局路徑優(yōu)化方法得到效果如下
47.在ROS中實(shí)現(xiàn)global planner(3)- 使用A*實(shí)現(xiàn)全局規(guī)劃,ROS,ROS自主導(dǎo)航機(jī)器人,自動駕駛,c++,ros,人工智能文章來源地址http://www.zghlxwxcb.cn/news/detail-659828.html

到了這里,關(guān)于47.在ROS中實(shí)現(xiàn)global planner(3)- 使用A*實(shí)現(xiàn)全局規(guī)劃的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ROS中實(shí)現(xiàn)A*路徑規(guī)劃

    ROS中實(shí)現(xiàn)A*路徑規(guī)劃

    學(xué)習(xí)A*路徑規(guī)劃算法,優(yōu)化啟發(fā)函數(shù),并在ROS中進(jìn)行測試。 A star算法教程 源碼地址:https://gitcode.net/VOR234/aster 安裝Linux系統(tǒng),建議Ubuntu18.04; 安裝ROS環(huán)境并學(xué)習(xí)其基本操作; 查找A 路徑規(guī)劃資料,學(xué)習(xí)并熟知A 路徑規(guī)劃算法; 對比賽中所提供A*算法的啟發(fā)函數(shù)AstarPathFinder::ge

    2024年01月16日
    瀏覽(20)
  • 基于STM32F103的樹莓派ROS小車——全局路徑規(guī)劃之Dijkstra算法

    基于STM32F103的樹莓派ROS小車——全局路徑規(guī)劃之Dijkstra算法

    Dijkstra Dijkstra算法概念: 基本思想:由近到遠(yuǎn)把所有點(diǎn)的最短路徑算出來。 算法解析:從起點(diǎn)向四周輻射,由近到遠(yuǎn)一層一層遍歷所有的點(diǎn),直到包含目標(biāo)點(diǎn)所在層級。然后將所有可行路徑進(jìn)行計(jì)算比較,篩選出絕對最佳路徑。 優(yōu)點(diǎn):最終得到的路徑一定是最佳路徑。 缺點(diǎn)

    2024年02月15日
    瀏覽(25)
  • Python 作用域:局部作用域、全局作用域和使用 global 關(guān)鍵字

    Python 作用域:局部作用域、全局作用域和使用 global 關(guān)鍵字

    變量只在創(chuàng)建它的區(qū)域內(nèi)可用。這被稱為作用域。 在函數(shù)內(nèi)部創(chuàng)建的變量屬于該函數(shù)的局部作用域,并且只能在該函數(shù)內(nèi)部使用。 示例:在函數(shù)內(nèi)部創(chuàng)建的變量在該函數(shù)內(nèi)部可用: 如上面的示例所解釋的那樣,變量 x 在函數(shù)外部不可用,但可以在函數(shù)內(nèi)部的任何函數(shù)中使用

    2024年02月08日
    瀏覽(22)
  • ROS:move_base路徑規(guī)劃介紹、更換全局路徑規(guī)劃算法(A star、Dijkstra、DWA,測試當(dāng)前是哪種算法,效果展示圖)

    ROS:move_base路徑規(guī)劃介紹、更換全局路徑規(guī)劃算法(A star、Dijkstra、DWA,測試當(dāng)前是哪種算法,效果展示圖)

    前提: 需要安裝navigation包 ,才可以運(yùn)行move_base。 move_base包默認(rèn)算法: 全局路徑規(guī)劃:Dijkstra; 局部路徑規(guī)劃:航跡推算; A*、Dijkstra屬于全局路徑規(guī)劃、DWA屬于局部路徑規(guī)劃。 move_base.launch文件需要 添加以下內(nèi)容 : 整體的move_base.launch文件內(nèi)容如下(其中 turtlebot3_navigati

    2024年02月08日
    瀏覽(244)
  • 使用git config --global設(shè)置用戶名和郵件,以及git config的全局和局部配置

    使用git config --global設(shè)置用戶名和郵件,以及git config的全局和局部配置

    我們?yōu)槭裁匆O(shè)置設(shè)置用戶名和郵件? 我們在注冊 github , gitlab 等時(shí),一般使用用戶名或郵箱: 這個(gè)用戶名可以是你的姓名,也可以是你的手機(jī)號,或者其他字母拼成的字符串。 當(dāng)你注冊完成時(shí),它會寫入到 .git 賬號中。你每次代碼提交時(shí),都會顯示你的這個(gè)賬號。 由于

    2024年02月05日
    瀏覽(33)
  • Node【Global全局對象】

    Node【Global全局對象】

    哈嘍小伙伴們,新的專欄 Node 已開啟;這個(gè)專欄里邊會收錄一些Node的基礎(chǔ)知識和項(xiàng)目實(shí)戰(zhàn),今天帶領(lǐng)大家初識一下 Node.js中的 Global全局對象 讓我們一起來看看吧??

    2023年04月22日
    瀏覽(12)
  • 全局平均池化(Global Average Pooling)

    全局平均池化(Global Average Pooling)

    最近看論文,看到了全局平均池化,之間見過這東西,但是沒有仔細(xì)了解,今天學(xué)習(xí)一下,并記錄下來,方便以后查閱。 出處 :Lin M, Chen Q, Yan S. Network in network[J]. arXiv preprint arXiv:1312.4400, 2013. 定義 :將特征圖所有像素值相加求平局,得到一個(gè)數(shù)值,即用該數(shù)值表示對應(yīng)特征

    2024年01月16日
    瀏覽(22)
  • 【HarmonyOS】輕量級智能穿戴應(yīng)用如何在頁面中實(shí)現(xiàn)數(shù)據(jù)傳遞與全局變量的使用

    【】 輕量級智能穿戴、LiteWearable、數(shù)據(jù)傳遞、全局變量 【問題描述】 開發(fā)輕量級智能穿戴LiteWearable應(yīng)用,在app.js中定義全局變量,在頁面中通過this.$app.$def.xxx獲取時(shí),報(bào)錯(cuò)TypeError: Cannot read property \\\'$def\\\' of undefined 【問題分析】 經(jīng)確認(rèn),LiteWearable暫不支持$def,只要是輕

    2024年02月03日
    瀏覽(25)
  • Semantic Kernel 入門系列:? Planner 規(guī)劃器

    Semantic Kernel 入門系列:? Planner 規(guī)劃器

    Semantic Kernel 的一個(gè)核心能力就是實(shí)現(xiàn)“目標(biāo)導(dǎo)向”的AI應(yīng)用。 “目標(biāo)導(dǎo)向”聽起來是一個(gè)比較高大的詞,但是卻是實(shí)際生活中我們處理問題的基本方法和原則。 顧名思義,這種方法的核心就是先確定目標(biāo),然后再尋找實(shí)現(xiàn)目標(biāo)的方法和步驟。這對于人來說的是很自然的事情

    2023年04月16日
    瀏覽(27)
  • ROS-melodic:源碼安裝teb_local_planner算法、替換DWA算法

    ROS-melodic:源碼安裝teb_local_planner算法、替換DWA算法

    源碼下載地址:GitHub - rst-tu-dortmund/teb_local_planner: An optimal trajectory planner considering distinctive topologies for mobile robots based on Timed-Elastic-Bands (ROS Package) ?注意選擇對應(yīng)ROS版本的代碼。 ?放在navigation目錄下(或者自己創(chuàng)建一個(gè)): 安裝缺失依賴(在teb_local_planner目錄下打開終端):

    2024年02月08日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包