实验四 定位与导航算法

您所在的位置:网站首页 定位算法仿真实验心得 实验四 定位与导航算法

实验四 定位与导航算法

2024-06-08 23:49| 来源: 网络整理| 查看: 265

【体验内容】 一、全局规划: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

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

rplidar_costmap_params.yaml

global_costmap: robot_radius: 0.20 obstacle_layer: scan: data_type: LaserScan topic: scan marking: true clearing: true min_obstacle_height: 0.05 max_obstacle_height: 0.35 local_costmap: robot_radius: 0.18 obstacle_layer: scan: data_type: LaserScan topic: scan marking: true clearing: true min_obstacle_height: 0.05 max_obstacle_height: 0.35

在turtlebot_ws/src/turtlebot_app/turtlebot_navigation/launch目录下创建rplidar_amcl_demo.launch文件,代码如下:

rplidar_amcl_demo.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 × n m\times n m×n 个格子的栅格地图,并绘制图案,如棋盘格、文字等。复杂图案、彩图、动态图可加分。

实现思路:了解 nav_msgs/OccupancyGrid 消息的数据结构,编写话题发布程序持续发出该类型话题,可以使用 rviz 查看发出的栅格图样。

范例:

#include "ros/ros.h" #include #include "std_msgs/Float32.h" #include "nav_msgs/OccupancyGrid.h" /* /map话题的消息类型为nav_msgs/OccupancyGrid 具体的数据结构为 std_msgs/Header header uint32 seq time stamp string frame_id nav_msgs/MapMetaData info time map_load_time float32 resolution uint32 width uint32 height geometry_msgs/Pose origin geometry_msgs/Point position float64 x float64 y float64 z geometry_msgs/Quaternion orientation float64 x float64 y float64 z float64 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("map",1,true); ros::Publisher intpub = n.advertise("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 // intpub.publish(mynumber); mappub.publish(rosMap); cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3