10 基于Gazebo和Rviz實現導航仿真,包括SLAM建圖,地圖服務,機器人定位,路徑規劃

在9中我們已經實現了機器人的模塊仿真,現在要在這個基礎上實現SLAM建圖,地圖服務,機器人定位,路徑規劃

1.? ?還是在上述機器人的工作空間下,新建功能包(nav),導入依賴

gmapping map_server amcl move_base

2.? ?導航實現SLAM建圖(gmapping)

在功能包下新建文件夾(launch)---> 新建文件(map.launch)寫入

<launch>
<param name="use_sim_time" value="true"/><node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen"><remap from="scan" to="scan"/><param name="base_frame" value="base_footprint"/><!--底盤坐標系--><param name="odom_frame" value="odom"/> <!--里程計坐標系--><param name="map_update_interval" value="5.0"/><param name="maxUrange" value="16.0"/><param name="sigma" value="0.05"/><param name="kernelSize" value="1"/><param name="lstep" value="0.05"/><param name="astep" value="0.05"/><param name="iterations" value="5"/><param name="lsigma" value="0.075"/><param name="ogain" value="3.0"/><param name="lskip" value="0"/><param name="srr" value="0.1"/><param name="srt" value="0.2"/><param name="str" value="0.1"/><param name="stt" value="0.2"/><param name="linearUpdate" value="1.0"/><param name="angularUpdate" value="0.5"/><param name="temporalUpdate" value="3.0"/><param name="resampleThreshold" value="0.5"/><param name="particles" value="30"/><param name="xmin" value="-50.0"/><param name="ymin" value="-50.0"/><param name="xmax" value="50.0"/><param name="ymax" value="50.0"/><param name="delta" value="0.05"/><param name="llsamplerange" value="0.01"/><param name="llsamplestep" value="0.01"/><param name="lasamplerange" value="0.005"/><param name="lasamplestep" value="0.005"/></node><node pkg="joint_state_publisher" name="joint_state_publisher" type="joint_state_publisher" /><node pkg="robot_state_publisher" name="robot_state_publisher" type="robot_state_publisher" /><node pkg="rviz" type="rviz" name="rviz" /><!-- 可以保存 rviz 配置并后期直接使用--><!--<node pkg="rviz" type="rviz" name="rviz" args="-d $(find my_nav_sum)/rviz/gmapping.rviz"/>-->
</launch>
關鍵代碼解釋:
<remap from="scan" to="scan"/><!-- 雷達話題 -->
<param name="base_frame" value="base_footprint"/><!--底盤坐標系-->
<param name="odom_frame" value="odom"/> <!--里程計坐標系-->
執行

1.先啟動 Gazebo 仿真環境

source ./devel/setup.bash
roslaunch car car.launch

2.然后再啟動地圖繪制的 launch 文件

source ./devel/setup.bash
roslaunch nav map.launch

3.在 rviz 中添加組件,顯示柵格地圖

? ? ? ? 保存組件(避免下次再添加)可以做以下操作

File -> Save Config As

然后再launch文件中替換

<node pkg="rviz" type="rviz" name="rviz" />

替換為

<node pkg="rviz" type="rviz" name="rviz" args="-d $(find your_bag_name )/rviz/XXX.rviz"/>

下次再啟動時就保存上次添加的組件

4.啟動鍵盤鍵盤控制節點,用于控制機器人運動建圖?

rosrun teleop_twist_keyboard teleop_twist_keyboard.py _speed:=0.5 _turn:=0.3

繪制完成后的地圖

?

3.? ?導航實現----地圖服務

保存地圖:在launch文件夾--->新建launch文件(map_saver),寫入

<launch><arg name="filename" value="$(find your_bag_name)/map/nav" /><node name="map_save" pkg="map_server" type="map_saver" args="-f $(arg filename)" />
</launch>

需要修改的地方

1)your_bag_name

2)nav--->your_saver_map_name,當然不修改,就保存為nav.pgm和nav.yaml

讀取地圖:在launch文件夾--->新建launch文件(map_server),寫入

<launch><!-- 設置地圖的配置文件 --><arg name="map" default="nav.yaml" /><!-- 運行地圖服務器,并且加載設置的地圖--><node name="map_server" pkg="map_server" type="map_server" args="$(find your_bag_name)/map/$(arg map)"/>
</launch>

需要修改的地方

1)your_bag_name

2)nav--->your_saver_map_name,當然不修改,就讀取為nav.yaml

執行該launch文件,該節點會發布題:map(nav_msgs/OccupancyGrid) ?

rviz

rviz 中使用 map 組件訂閱/map話題就可以顯示柵格地圖

4.? ?導航實現----定位

?在功能包下新建文件夾(launch)---> 新建文件(amcl.launch)寫入

<launch>
<node pkg="amcl" type="amcl" name="amcl" output="screen"><!-- Publish scans from best pose at a max of 10 Hz --><param name="odom_model_type" value="diff"/><!-- 里程計模式為差分 --><param name="odom_alpha5" value="0.1"/><param name="transform_tolerance" value="0.2" /><param name="gui_publish_rate" value="10.0"/><param name="laser_max_beams" value="30"/><param name="min_particles" value="500"/><param name="max_particles" value="5000"/><param name="kld_err" value="0.05"/><param name="kld_z" value="0.99"/><param name="odom_alpha1" value="0.2"/><param name="odom_alpha2" value="0.2"/><!-- translation std dev, m --><param name="odom_alpha3" value="0.8"/><param name="odom_alpha4" value="0.2"/><param name="laser_z_hit" value="0.5"/><param name="laser_z_short" value="0.05"/><param name="laser_z_max" value="0.05"/><param name="laser_z_rand" value="0.5"/><param name="laser_sigma_hit" value="0.2"/><param name="laser_lambda_short" value="0.1"/><param name="laser_lambda_short" value="0.1"/><param name="laser_model_type" value="likelihood_field"/><!-- <param name="laser_model_type" value="beam"/> --><param name="laser_likelihood_max_dist" value="2.0"/><param name="update_min_d" value="0.2"/><param name="update_min_a" value="0.5"/><param name="odom_frame_id" value="odom"/><!-- 里程計坐標系 --><param name="base_frame_id" value="base_footprint"/><!-- 添加機器人基坐標系 --><param name="global_frame_id" value="map"/><!-- 添加地圖坐標系 --><param name="resample_interval" value="1"/><param name="transform_tolerance" value="0.1"/><param name="recovery_alpha_slow" value="0.0"/><param name="recovery_alpha_fast" value="0.0"/>
</node>
</launch>

amcl節點是不可以單獨運行的,運行 amcl 節點之前,需要先加載全局地圖,然后啟動 rviz 顯示定位結果,上述節點可以集成進launch文件,在功能包下新建文件夾(launch)---> 新建文件(test_amcl.launch)寫入

內容示例如下:

<launch><!-- 設置地圖的配置文件 --><arg name="map" default="nav1.yaml" /><!-- 運行地圖服務器,并且加載設置的地圖--><node name="map_server" pkg="map_server" type="map_server" args="$(find nav)/map/$(arg map)"/><!-- 啟動AMCL節點 --><include file="$(find nav)/launch/amcl.launch" /><node pkg="joint_state_publisher" name="joint_state_publisher" type="joint_state_publisher" /><node pkg="robot_state_publisher" name="robot_state_publisher" type="robot_state_publisher" /><!-- <node pkg="rviz" type="rviz" name="rviz" />--> <!-- 可以保存 rviz 配置并后期直接使用--><node pkg="rviz" type="rviz" name="rviz" />
</launch>
執行

1.先啟動 Gazebo 仿真環境

2.啟動鍵盤控制節點:

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

3.啟動上一步中集成地圖服務、amcl 與 rviz 的 launch 文件;

source ./devel/setup.bash
roslaunch nav test_amcl.launch 

4.在啟動的 rviz 中,添加RobotModel、Map組件,分別顯示機器人模型與地圖,添加 posearray 插件,設置topic為particlecloud來顯示 amcl 預估的當前機器人的位姿,箭頭越是密集,說明當前機器人處于此位置的概率越高;

5.通過鍵盤控制機器人運動,會發現 posearray 也隨之而改變。

5.? ?導航實現----路徑規劃

在功能包下新建文件夾(launch)---> 新建文件(move_base.launch)寫入

<launch><node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true"><rosparam file="$(find 功能包)/param/costmap_common_params.yaml" command="load" ns="global_costmap" /><rosparam file="$(find 功能包)/param/costmap_common_params.yaml" command="load" ns="local_costmap" /><rosparam file="$(find 功能包)/param/local_costmap_params.yaml" command="load" /><rosparam file="$(find 功能包)/param/global_costmap_params.yaml" command="load" /><rosparam file="$(find 功能包)/param/base_local_planner_params.yaml" command="load" /></node></launch>

新建文件夾(params)--->新建文件(costmap_common_params.yaml,global_costmap_params.yaml,local_costmap_params.yaml,base_local_planner_params.yaml)

分別寫入:

costmap_common_params.yaml

#機器人幾何參,如果機器人是圓形,設置 robot_radius,如果是其他形狀設置 footprint
robot_radius: 0.12 #圓形
# footprint: [[-0.12, -0.12], [-0.12, 0.12], [0.12, 0.12], [0.12, -0.12]] #其他形狀obstacle_range: 3.0 # 用于障礙物探測,比如: 值為 3.0,意味著檢測到距離小于 3 米的障礙物時,就會引入代價地圖
raytrace_range: 3.5 # 用于清除障礙物,比如:值為 3.5,意味著清除代價地圖中 3.5 米以外的障礙物#膨脹半徑,擴展在碰撞區域以外的代價區域,使得機器人規劃路徑避開障礙物
inflation_radius: 0.2
#代價比例系數,越大則代價值越小
cost_scaling_factor: 3.0#地圖類型
map_type: costmap
#導航包所需要的傳感器
observation_sources: scan
#對傳感器的坐標系和數據進行配置。這個也會用于代價地圖添加和清除障礙物。例如,你可以用激光雷達傳感器用于在代價地圖添加障礙物,再添加kinect用于導航和清除障礙物。
scan: {sensor_frame: laser, data_type: LaserScan, topic: scan, marking: true, clearing: true}

global_costmap_params.yaml

global_costmap:global_frame: map #地圖坐標系robot_base_frame: base_footprint #機器人坐標系# 以此實現坐標變換update_frequency: 1.0 #代價地圖更新頻率publish_frequency: 1.0 #代價地圖的發布頻率transform_tolerance: 0.5 #等待坐標變換發布信息的超時時間static_map: true # 是否使用一個地圖或者地圖服務器來初始化全局代價地圖,如果不使用靜態地圖,這個參數為false.

local_costmap_params.yaml

local_costmap:global_frame: odom #里程計坐標系robot_base_frame: base_footprint #機器人坐標系update_frequency: 10.0 #代價地圖更新頻率publish_frequency: 10.0 #代價地圖的發布頻率transform_tolerance: 0.5 #等待坐標變換發布信息的超時時間static_map: false  #不需要靜態地圖,可以提升導航效果rolling_window: true #是否使用動態窗口,默認為false,在靜態的全局地圖中,地圖不會變化width: 3 # 局部地圖寬度 單位是 mheight: 3 # 局部地圖高度 單位是 mresolution: 0.05 # 局部地圖分辨率 單位是 m,一般與靜態地圖分辨率保持一致

base_local_planner_params.yaml

TrajectoryPlannerROS:# Robot Configuration Parametersmax_vel_x: 0.5 # X 方向最大速度min_vel_x: 0.1 # X 方向最小速速max_vel_theta:  1.0 # min_vel_theta: -1.0min_in_place_vel_theta: 1.0acc_lim_x: 1.0 # X 加速限制acc_lim_y: 0.0 # Y 加速限制acc_lim_theta: 0.6 # 角速度加速限制# Goal Tolerance Parameters,目標公差xy_goal_tolerance: 0.10yaw_goal_tolerance: 0.05# Differential-drive robot configuration
# 是否是全向移動機器人holonomic_robot: false# Forward Simulation Parameters,前進模擬參數sim_time: 0.8vx_samples: 18vtheta_samples: 20sim_granularity: 0.05

在新建test_move_base.launch

<launch><!-- 設置地圖的配置文件 --><arg name="map" default="map.yaml" /><!-- 運行地圖服務器,并且加載設置的地圖--><node name="map_server" pkg="map_server" type="map_server" args="$(find nav)/map/$(arg map)"/><!-- 啟動AMCL節點 --><include file="$(find nav)/launch/amcl.launch" /><!-- 運行move_base節點 --><include file="$(find nav)/launch/move_base.launch" /><!-- 運行rviz --><node pkg="joint_state_publisher" name="joint_state_publisher" type="joint_state_publisher" /><node pkg="robot_state_publisher" name="robot_state_publisher" type="robot_state_publisher" /><!-- <node pkg="rviz" type="rviz" name="rviz" />--> <!-- 可以保存 rviz 配置并后期直接使用 args="-d $(find nav)/config/move_base.rviz"--><node pkg="rviz" type="rviz" name="rviz" /></launch>

執行:

啟動 Gazebo 仿真環境

source ./devel/setup.bash
roslaunch car car.launch

啟動上一步中集成地圖服務、amcl 與 rviz,move_base 的 launch 文件

source ./devel/setup.bash
roslaunch nav test_move_base.launch

在Rviz中添加組件

RobotModel,Map(/map)

PoseArray(/particlecloud)

LaserScan(/scan),Map_Global(//move_base/global_costmap/costmap和修改Color Scheme為costmap)

Map_Local(/move_base/local_costmap/costmap和修改Color Scheme為costmap)

Path_Global(/move_base/TrajectoryPlannerROS/global_plan)

path_Local(/move_base/TrajectoryPlannerROS/local_plan)

Odometry(/odom)

通過2D Nav Goal設置終點,機器人實現導航

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903427.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenGL----OpenGL紋理與紋理緩存區

在現代計算機圖形學中,紋理(Texture)是一個至關重要的概念。它不僅可以為幾何體表面添加細節和真實感,還可以用于實現各種復雜的視覺效果和數據處理。在OpenGL中,紋理的應用范圍非常廣泛,從基本的顏色映射到高級的陰影映射、環境映射等。本文將深入探討OpenGL紋理與紋理緩…

Scikit-learn工具介紹與數據集

一、Scikit-learn簡介與安裝 Scikit-learn是Python中最流行的機器學習庫之一&#xff0c;它提供了簡單高效的數據挖掘和數據分析工具。 Python語言機器學習工具 Scikit-learn包括許多智能的機器學習算法的實現 Scikit-learn文檔完善&#xff0c;容易上手&#xff0c;豐富的A…

Byte-Buddy系列 - 第4講 byte-buddy無法讀取到SpringBoot Jar中的類

目錄 一、問題描述二、原因分析三、解決方案1&#xff08;推薦&#xff09;&#xff1a;獲取線程上下文中的類加載器擴展 四、解決方案2&#xff1a;自定義SpringBoot類加載器 一、問題描述 在使用Byte-Buddy中的TypePool對類進行擴展后&#xff0c;在本地開發集成環境&#x…

AutogenStudio使用

官網介紹&#xff1a;https://microsoft.github.io/autogen/stable/ Autogen是什么&#xff1f; AutoGen 是由微軟開發的一個開源框架&#xff0c;旨在通過 多智能體協作&#xff08;Multi-Agent Collaboration&#xff09; 實現復雜的任務自動化。它的核心思想是讓多個 AI 代…

Vue3 Echarts 3D圓形柱狀圖實現教程以及封裝一個可復用的組件

文章目錄 前言一、實現原理二、series ——type: "pictorialBar" 簡介2.1 常用屬性 三、代碼實戰3.1 封裝一個echarts通用組件 echarts.vue3.2 首先實現一個基礎柱狀圖3.3 添加上下2個橢圓面3.4 進階封裝一個可復用的3D圓形柱狀圖組件 總結 前言 在前端開發的數據可視…

yolov8中train、test、val

說明yolov8中train、test、val是什么意思&#xff0c;是什么作用呢&#xff1f;詳細介紹使用yolov8進行實例分割&#xff0c;我應該如何制作我的數據集呢&#xff1f; 1. YOLOv8中的train、val、test是什么意思&#xff1f;作用是什么&#xff1f; 在YOLOv8&#xff08;由Ultr…

借助Spring AI實現智能體代理模式:從理論到實踐

借助Spring AI實現智能體代理模式&#xff1a;從理論到實踐 前言 在人工智能領域&#xff0c;大語言模型&#xff08;LLM&#xff09;的應用愈發廣泛&#xff0c;如何高效構建基于LLM的系統成為眾多開發者關注的焦點。Anthropic的研究報告《構建高效代理》為我們提供了新的思…

【學習筆記】計算機操作系統(二)—— 進程的描述與控制

第二章 進程的描述與控制 文章目錄 第二章 進程的描述與控制2.1 前趨圖和程序執行2.1.1 前趨圖2.1.2 程序順序執行2.1.3 程序并發執行 2.2 進程的描述2.2.1 進程的定義和特征2.2.2 進程的基本狀態及轉換2.2.3 掛起操作和進程狀態的轉換2.2.4 進程管理中的數據結構 2.3 進程控制…

具身智能之強化學習

在具身智能&#xff08;Embodied AI&#xff09;中&#xff0c;強化學習&#xff08;Reinforcement Learning&#xff0c;RL&#xff09;是一種非常核心的學習方法。它讓智能體&#xff08;agent&#xff09;通過與環境交互&#xff0c;不斷試錯&#xff0c;學習完成任務的策略…

go打印金字塔

需求 打印空心金字塔 解析 // * // * * // * * * // * * * *// 看成由星號、空格組成的矩形&#xff1a; // 1 1 1 0 // 2 3 2 1 // 3 5 3 2 // 4 7 4 3// 層數&#xff1a;n // 每層總元素數&#xff1a;2n-1 // 每星號數&#xff1a;n // 每層空格數&am…

C語言教程(二十二):C 語言頭文件詳解

一、頭文件的定義與形式 頭文件一般具有 .h 擴展名&#xff0c;它主要用來存放函數聲明、宏定義、結構體和共用體的定義、全局變量的聲明等內容。在C語言程序里&#xff0c;可借助 #include 預處理指令把這些頭文件包含到源文件中。 二、頭文件的作用 2.1 函數聲明 頭文件可對…

數據庫day-08

一、實驗名稱和性質 刪除修改數據 驗證 設計 二、實驗目的 1&#xff0e;掌握數據操作-- 刪除、修改&#xff1b; 三、實驗的軟硬件環境要求 硬件環境要求&#xff1a; PC機&#xff08;單機&#xff09; 使用的軟件名稱、版本號以及模塊&#xff1a; Windows 10&#x…

JAVA中Spring全局異常處理@ControllerAdvice解析

一、ControllerAdvice基礎概念 1. 什么是ControllerAdvice&#xff1f; ControllerAdvice是Spring 3.2引入的注解&#xff0c;用于定義全局控制器增強組件&#xff0c;主要功能包括&#xff1a; 全局異常處理&#xff08;最常用&#xff09;全局數據綁定全局數據預處理 2. …

開放平臺架構方案- GraphQL 詳細解釋

GraphQL 詳細解釋 GraphQL 是一種用于 API 的查詢語言&#xff0c;由 Facebook 開發并開源&#xff0c;旨在提供一種更高效、靈活且強大的數據獲取和操作方式。它與傳統的 REST API 有顯著不同&#xff0c;通過類型系統和靈活的查詢能力&#xff0c;解決了 REST 中常見的過度獲…

labview項目文件架構

為了使 LabVIEW 項目更具可擴展性和易于維護&#xff0c;合理規劃和設計項目文件結構是非常重要的。 以下是一些基于行業經驗和最佳實踐的建議&#xff1a; 1. ### 文件夾層次劃分 將不同的功能模塊分開存儲在一個清晰的分層目錄結構中是一個常見的做法。通常情況下&#xff…

Chrome的插件擴展程序安裝目錄是什么?在哪個文件夾?

目錄 前提 直接復制到瀏覽器中打開 Mac下Chrome extension 安裝路徑 最近換了mac pro用起來雖然方便&#xff0c;但是對常用的一些使用方法還是不熟悉。這不為了找到mac上chrome插件的安裝路徑在哪里&#xff0c;花費了不少時間。我想應用有不少像小編一樣剛剛使用mac的小白…

第13講:圖形尺寸與分辨率設置——適配論文版面,打造專業圖稿!

目錄 ?? 為什么這一講重要? ?? 一、先認識幾個關鍵詞 ?? 二、ggsave() 是導出圖的標準方法 ?? 三、尺寸設置技巧:對齊目標期刊 ?? 找到目標期刊的圖形欄寬 ?? 四、多個圖組合導出(與 patchwork 搭配) ?? 五、使用 Cairo / ragg 導出高質量圖 ?? 六…

2025年- H13-Lc120-189.輪轉數組(普通數組)---java版

1.題目描述 2.思路 import java.util.Arrays;public class H189 {public static void main(String[] args) {int[] newArr {1, 2, 3, 4, 5};int[] nums new int[5];System.arraycopy(newArr,0,nums,0,4);System.out.println(Arrays.toString(nums)); } }補充2&#xff1a; 3.…

機器人--相機

教程 畸變和校正 單目和雙目標定 單雙&#xff0c;rgb-d原理 單目相機 只有一個攝像頭的相機。 原理 小孔成像。 缺點 單目相機無法測量物體點的深度信。 因為物體的Z軸坐標系無法測量。 雙目相機 有兩個攝像頭的相機。 用兩個單目相機組成的雙目相機就可以測量深度信…

Go 語言入門:(一) 環境安裝

一、前言 這里不同于其他人的 Go 語言入門&#xff0c;環境安裝我向來注重配置&#xff0c;比如依賴包、緩存的默認目錄。因為前期不弄好&#xff0c;后面要整理又影響這影響那的&#xff0c;所以就干脆寫成文章&#xff0c;方便后期撿起。 二、安裝 1. 安裝包 https://go.…