实验四 定位与导航算法
【体验内容】
一、全局规划: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 Estimate
和2D 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;}
}
实验四 定位与导航算法相关推荐
- 实验四 查找和排序算法实现
广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼418A) 学院 计算机科学与网络工程学院 实验课程 数据结构实验 实验项目 实验四 查找和排序算法实现 一.实验目的: 1.各种排序算法 ...
- 人工智能导论实验四:深度学习算法及应用
实验四:深度学习算法及应用 一.实验目的 1.了解深度学习的基本原理: 2.能够使用深度学习开源工具: 3.应用深度学习算法求解实际问题. 二.实验要求 1.解释深度学习原理: 2.对实验性能进行分析 ...
- 实验四 图的遍历算法设计与实现
一.实验名称:图的遍历算法设计与实现 二.实验目的: 1.掌握图的深度优先遍历的算法. 2.掌握图的广度优先遍历的算法. 3.实验章节:算法设计与分析 第四章 三.实验内容.实验问题和程序运行结果 第 ...
- 南京邮电大学数据结构实验四(各种排序算法)
南邮数据结构实验报告四----各种排序算法 一.各类算法 (一)简单选择排序 (二)直接插入排序 (三)冒泡排序 (四)快速排序 (五)两路合并排序 (六)堆排序 二.全部排序整合+时间测试 三.算法 ...
- 大数据 | 实验四:并行化数据挖掘算法设计
文章目录
- 广州大学数据结构实验四
实验四 查找和排序算法实现 开课实验室:计算机科学与工程实验(电子楼) 2020年12月31日 学院 计算机科学与网络工程学院 年级.专业.班 网络工程194 姓名 jwt 学号 实验课程 ...
- [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- 九天创新智能科技有限公司诚招--SLAM/规划/控制/感知/定位/导航算法工程师
公司团队:海归高层次人才团队创办,拥有国际领先的全栈式动驾驶核心技术.创始团队来自新加坡国立大学.新加坡南洋理工大学.中国科学技术大学等世界一流学府. 项目已经是面向园区---专注智慧清洁领域 一.控 ...
- matlab信息隐藏算法,实验四--基于DCT域的信息隐藏算法
<实验四--基于DCT域的信息隐藏算法>由会员分享,可在线阅读,更多相关<实验四--基于DCT域的信息隐藏算法(6页珍藏版)>请在人人文库网上搜索. 1.实验四 基于DCT域的 ...
最新文章
- 基于Pygame的Python小游戏,《这是一场滑稽与阴险的较量》
- vue-router 的重定向-redirect
- python浅拷贝 深拷贝
- 使用cdn和npm引入的区别_在npm上发布自己的vue组件库(使用npm install 或者 CDN的方式引用)...
- linux下miniconda3启动命令
- 绝了!电容这样理解真的简单!
- 牛顿法、梯度下降法、高斯牛顿法、Levenberg-Marquardt算法
- machine ID问题 ( u-boot设置machine id , set mach_type 0x16a )
- 异常作弊– Java 8 Lambdas
- When allowCredentials is true, allowedOrigins cannot contain the special value “*“ that cannot be
- XEIM|XEIM企业即时通讯
- 列运算_MIT—线性代数笔记06 列空间和零空间
- Linux建立信任主机
- CCS8.0安装教程及安装包
- IOI国家集训队历年论文
- Vmware workstation 16pro解锁装MacOS
- java必备基础5(集合list、set、map)
- 如何写投资项目计划书?
- 经典Bug永流传---每周一“虫”(九)
- 从社交图谱看Web3.0在社交领域的探索
热门文章
- [LeetCode]42. Trapping Rain Water雨水填坑
- 2022-2028年中国医疗+养老产业深度调研及投资前景预测报告
- 2022-2028年中国橡胶减震产品行业市场研究及前瞻分析报告
- shiro和Spring整合使用注解时没有执行realm的doGetAuthorizationInfo回调方法的解决
- Java技术——Iterator和Enumeration的不同
- 三维刚体变化中Rcw,tcw的含义
- usaco Cow Pedigrees
- arm-linux-ld中的参数,arm-linux-ld指令详解
- java十个整数相反顺序_编写程序,对输入的一个整数,按相反顺序输出该数。例如,输入为 3578, 输出为 8753。...
- php 开发cs,PHP开发CS结构的技巧