日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

实验四 定位与导航算法

發布時間:2023/11/27 生活经验 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实验四 定位与导航算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【體驗內容】

一、全局規劃:Astar算法

檢查點1】在上次gmapping實驗課中構建的地圖上,使用astar規劃一條路徑。

在工作空間的src目錄下,下載astar算法功能包并編譯

git  clone  https://gitee.com/massif_li/astar
cd ..
catkin_make

修改launch文件中的yaml地圖文件地址,運行launch文件

roslaunch astar astar.launch

在顯示出來的rviz界面中可以看到設置的地圖文件,分辨點擊2D Pose Estimate2D Nav Goal,即可在地圖中設置起始位姿和目標位姿,可以看到astar程序為我們規劃一條路徑。

使用rqt_graph查看此時運行的節點,將左上角的選項從Nodes only改為Nodes/Topics (all),可以看到astar節點接受起始點位姿地圖,生成導航路徑和覆蓋在原地圖上的路徑圖像蒙版。

其中這幾個話題的消息類型:
/initialpose —— geometry_msgs/PoseWithCovarianceStamped(帶協方差標志的位姿)
/move_base_simple/goal —— geometry_msgs/PoseStamped(位姿)
/map —— nav_msgs/OccupancyGrid(占用柵格)
/nav_path —— nav_msgs/Path(路徑,由一個標準頭和一組位姿組成)
/mask —— nav_msgs/OccupancyGrid(占用柵格)

二、Turtlebot定位與導航

檢查點2】完成蒙特卡洛定位(即使得位姿粒子群在運動控制下獲得收斂的效果)。

在工作空間的src目錄下,下載以下功能包并編譯(這是用戶與turtlebot進行交互的功能包,后面會使用其中的turtlebot_rviz_launchers顯示蒙特卡洛定位過程與效果)

git  clone  https://gitee.com/massif_li/turtlebot_interactions.git
cd ..
catkin_make

turtlebot_ws/ src / turtlebot_apps / turtlebot_navigation / launch / includes / amcl目錄下創建rplidar_amcl.launch.xml文件,代碼如下:

rplidar_amcl.launch.xml

<launch><arg name="use_map_topic"   default="false"/><arg name="scan_topic"      default="scan"/> <arg name="initial_pose_x"  default="0.0"/><arg name="initial_pose_y"  default="0.0"/><arg name="initial_pose_a"  default="0.0"/><arg name="odom_frame_id"   default="odom"/><arg name="base_frame_id"   default="base_footprint"/><arg name="global_frame_id" default="map"/><node pkg="amcl" type="amcl" name="amcl"><param name="use_map_topic"             value="$(arg use_map_topic)"/><!-- 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="gui_publish_rate"          value="10.0"/><param name="laser_max_beams"             value="60"/><param name="laser_max_range"           value="12.0"/><param name="min_particles"             value="500"/><param name="max_particles"             value="2000"/><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.2"/><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_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.25"/><param name="update_min_a"              value="0.2"/><param name="odom_frame_id"             value="$(arg odom_frame_id)"/> <param name="base_frame_id"             value="$(arg base_frame_id)"/> <param name="global_frame_id"           value="$(arg global_frame_id)"/><param name="resample_interval"         value="1"/><!-- Increase tolerance because the computer can get quite busy --><param name="transform_tolerance"       value="1.0"/><param name="recovery_alpha_slow"       value="0.0"/><param name="recovery_alpha_fast"       value="0.0"/><param name="initial_pose_x"            value="$(arg initial_pose_x)"/><param name="initial_pose_y"            value="$(arg initial_pose_y)"/><param name="initial_pose_a"            value="$(arg initial_pose_a)"/><remap from="scan"                      to="$(arg scan_topic)"/></node>
</launch>

turtlebot_ws/src/turtlebot_app/turtlebot_navigation/param目錄新建rplidar_costmap_params.yaml文件,

rplidar_costmap_params.yaml

global_costmap:robot_radius: 0.20obstacle_layer:scan:data_type: LaserScantopic: scanmarking: trueclearing: truemin_obstacle_height: 0.05max_obstacle_height: 0.35local_costmap:robot_radius: 0.18obstacle_layer:scan:data_type: LaserScantopic: scanmarking: trueclearing: truemin_obstacle_height: 0.05max_obstacle_height: 0.35

turtlebot_ws/src/turtlebot_app/turtlebot_navigation/launch目錄下創建rplidar_amcl_demo.launch文件,代碼如下:

rplidar_amcl_demo.launch

<launch><!-- 2D sensor --><arg name="2D_laser" default="rplidar"/><include file="$(find rplidar_ros)/launch/rplidar.launch"></include><!-- Map server --><arg name="map_file" default="/home/lijian/Documents/turtlebot_ws/map/rplidar_gmapping.yaml"/><node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)" /><!-- AMCL --><arg name="custom_amcl_launch_file" default="$(find turtlebot_navigation)/launch/includes/amcl/$(arg 2D_laser)_amcl.launch.xml"/><arg name="initial_pose_x" default="0.0"/> <!-- Use 17.0 for willow's map in simulation --><arg name="initial_pose_y" default="0.0"/> <!-- Use 17.0 for willow's map in simulation --><arg name="initial_pose_a" default="0.0"/><include file="$(arg custom_amcl_launch_file)"><arg name="initial_pose_x" value="$(arg initial_pose_x)"/><arg name="initial_pose_y" value="$(arg initial_pose_y)"/><arg name="initial_pose_a" value="$(arg initial_pose_a)"/></include><!-- Move base --><arg name="custom_param_file" default="$(find turtlebot_navigation)/param/$(arg 2D_laser)_costmap_params.yaml"/><include file="$(find turtlebot_navigation)/launch/includes/move_base.launch.xml"><arg name="custom_param_file" value="$(arg custom_param_file)"/></include></launch>

編譯

catkin_make

替換好rplidar_amcl_demo.launch中的地圖信息

roslaunch turtlebot_navigation rplidar_amcl_demo.launch
roslaunch turtlebot_rviz_launchers view_navigation.launch

指定

三、全局與局部規劃理解

【不檢查】點擊“2D Nav Goal”,指定目標點,對完成定位的turtlebot進行運動規劃,自行了解全局規劃和局部規劃的區別。

【作業內容】

四、C++編寫柵格地圖(可課后完成)

用C++編寫一個 m×nm\times nm×n 個格子的柵格地圖,并繪制圖案,如棋盤格、文字等。復雜圖案、彩圖、動態圖可加分。

實現思路:了解 nav_msgs/OccupancyGrid 消息的數據結構,編寫話題發布程序持續發出該類型話題,可以使用 rviz 查看發出的柵格圖樣。

范例:

#include "ros/ros.h"
#include <iostream>
#include "std_msgs/Float32.h"
#include "nav_msgs/OccupancyGrid.h"/* /map話題的消息類型為nav_msgs/OccupancyGrid 具體的數據結構為std_msgs/Header headeruint32 seqtime stampstring frame_id
nav_msgs/MapMetaData infotime map_load_timefloat32 resolutionuint32 widthuint32 heightgeometry_msgs/Pose origingeometry_msgs/Point positionfloat64 xfloat64 yfloat64 zgeometry_msgs/Quaternion orientationfloat64 xfloat64 yfloat64 zfloat64 w
int8[] data*/using namespace std;int main(int argc, char **argv)
{// 初始化節點ros::init(argc,argv,"mapnode");ros::NodeHandle n;ros::Publisher mappub = n.advertise<nav_msgs::OccupancyGrid>("map",1,true);ros::Publisher intpub = n.advertise<std_msgs::Float32>("number",1,true);nav_msgs::OccupancyGrid rosMap;rosMap.info.resolution = 1.0;rosMap.info.width = 20;rosMap.info.height = 10;rosMap.info.origin.position.x = 0.0;rosMap.info.origin.position.y = 0.0;rosMap.info.origin.position.z = 0.0;rosMap.info.origin.orientation.x = 0.0;rosMap.info.origin.orientation.y = 0.0;rosMap.info.origin.orientation.z = 0.0;rosMap.info.origin.orientation.w = 1.0;rosMap.data.resize(rosMap.info.width * rosMap.info.height);int count = 0;for(int i = 0;i < rosMap.info.width * rosMap.info.height; i++){rosMap.data[i] = count++;}rosMap.header.stamp = ros::Time::now();rosMap.header.frame_id = "map";mappub.publish(rosMap);std_msgs::Float32 mynumber;mynumber.data = 2.3;while(1){// intpub.publish(mynumber);mappub.publish(rosMap);cout << "Hello" << endl;}
}

總結

以上是生活随笔為你收集整理的实验四 定位与导航算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。