无人机避障——2D栅格地图pgm格式文件路径规划代码详解

代码和测试效果请看上一篇博客:

无人机避障——使用三维PCD点云生成的2D栅格地图PGM做路径规划-CSDN博客

 更换模型文件.dae:

部分模型文件可以从这里下载:

https://github.com/ethz-asl/rotors_simulator/wiki

将原先代码中的car.dae文件更换为无人机.dae文件

然后对urdf文件进行修改:

<?xml version="1.0"?>
<robot name="car"><link name="ground_link"><visual name="base_visual"><origin xyz="0 0 10" rpy="0 0 0" /><geometry><mesh filename="package://hybrid_a_star/model/car_and_UAV_model/firefly.dae" scale="8 8 8"/></geometry></visual></link>
</robot>

测试结果: 

代码分析: 

run_hybrid_a_star.launch文件:

<launch><!-- 定义一个名为fixed_frame的参数,其默认值为"world",这个参数可能在后续节点启动或配置中会用到,通常用于指定某个固定的参考坐标系 --><arg name="fixed_frame" default="world"/><!-- 设置一个名为robot_description的参数,其值通过读取指定的URDF文件来获取。这里使用$(find hybrid_a_star)来查找名为hybrid_a_star的功能包路径,然后拼接上/model/car_and_UAV_model/default.urdf来确定具体要读取的URDF文件,该文件可能描述了机器人(在这里可能是车辆模型)的结构等信息 --><param name="robot_description" textfile="$(find hybrid_a_star)/model/car_and_UAV_model/default.urdf"/><!-- 以下这部分是被注释掉的两个节点启动设置。这里原本可能是打算启动joint_state_publisher和robot_state_publisher节点,但当前未被使用(可能是在某些特定场景或调试阶段才需要启动它们)。joint_state_publisher节点通常用于发布机器人关节状态信息,robot_state_publisher节点一般用于根据机器人的关节状态等信息来发布机器人的状态信息到tf树中 --><!--这两个节点没有使用<node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher"/><node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher"/>--><!-- 启动rviz节点,rviz是ROS中用于可视化的工具。这里通过指定args参数来加载特定的配置文件,同样使用$(find hybrid_a_star)来查找hybrid_a_star功能包路径,然后拼接上/rviz/display_hybrid_astar.rviz确定要加载的rviz配置文件,该配置文件会定义在rviz中如何显示相关的信息,比如机器人模型、地图等 --><node pkg="rviz" type="rviz" name="rviz" args="-d $(find hybrid_a_star)/rviz/display_hybrid_astar.rviz"/><!-- 这是一个对下面即将启动的static_transform_publisher节点的注释说明。static_transform_publisher节点用于发布一个静态的坐标变换,这里给出了其参数的含义:x y z yaw pitch roll frame_id child_frame_id period_in_ms,分别表示在x、y、z方向上的平移量,绕yaw、pitch、roll轴的旋转角度,以及父坐标系frame_id、子坐标系child_frame_id和发布变换的周期(单位为毫秒) --><!--static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms--><node pkg="tf" type="static_transform_publisher" name="link1_broadcaster"args="0 0 0 0 0 0 world map 100"/><!-- 启动map_server节点,map_server用于加载和发布地图信息。这里通过args参数指定要加载的地图配置文件,使用$(find hybrid_a_star)找到hybrid_a_star功能包路径,再拼接上/maps/map.yaml确定具体要加载的地图配置文件,该文件中应该包含了地图的相关参数,比如地图分辨率、尺寸等 --><node pkg="map_server" type="map_server" name="map_server" args="$(find hybrid_a_star)/maps/map.yaml"/><!-- 启动名为run_hybrid_astar的节点,该节点属于hybrid_a_star功能包,执行的可执行文件类型为run_hybrid_astar。并且设置了一些参数,这些参数可能用于配置路径规划相关的策略或属性,以下是对每个参数的具体说明: --><node pkg="hybrid_a_star" type="run_hybrid_astar" name="run_hybrid_astar" output="screen"><!-- 设置规划器的转向角度参数,值为15.0度,可能用于控制车辆在路径规划时的最大转向角度 --><param name="planner/steering_angle" value="15.0"/><!-- 设置转向角度离散化数量参数,值为1,可能与转向角度的离散化处理方式有关,比如将连续的转向角度划分成几个离散的区间 --><param name="planner/steering_angle_discrete_num" value="1"/><!-- 设置车辆的轴距参数,值为2.0,轴距是车辆前后轴之间的距离,在路径规划中可能会影响车辆转弯等操作的计算 --><param name="planner/wheel_base" value="2.0"/><!-- 设置路径规划中线段长度参数,值为1.6,可能用于定义在规划路径时每一段线段的长度 --><param name="planner/segment_length" value="1.6"/><!-- 设置线段长度离散化数量参数,值为8,与线段长度的离散化处理相关,比如将路径划分成若干个离散长度的线段 --><param name="planner/segment_length_discrete_num" value="8"/><!-- 设置转向惩罚参数,值为1.5,可能在路径规划算法中,当车辆进行转向操作时会根据这个参数来增加一定的成本,以影响最终路径的选择,使得路径更倾向于减少不必要的转向 --><param name="planner/steering_penalty" value="1.5"/><!-- 设置倒车惩罚参数,值为3.0,在路径规划中如果车辆需要倒车,可能会根据这个参数增加较高的成本,促使规划出的路径尽量减少倒车操作 --><param name="planner/reversing_penalty" value="3.0"/><!-- 设置转向变化惩罚参数,值为2.0,当车辆在路径上的转向角度发生变化时,可能会根据这个参数增加一定的成本,用于优化路径,使得转向变化更加平滑或者符合某种策略 --><param name="planner/steering_change_pparam" name="planner/steering_change_penalty" value="2.0"/><!-- 设置短距离参数,值为5.0,可能与某种短距离相关的操作或判断有关,具体含义可能需要结合具体的路径规划算法来确定 --><param name="planner/shot_distance" value="5.0"/></node></launch>

主要是map_server和hybrid_a_star节点对读取地图做路径规划起作用!! 

<node pkg="map_server" type="map_server" name="map_server" args="$(find hybrid_a_star)/maps/map.yaml"/>

map_server节点会将加载并处理好的地图数据发布到 ROS 的话题(topic)上,通常发布的话题名称为/map。其他的 ROS 节点(比如路径规划节点、导航节点等)可以通过订阅这个话题来获取地图信息,从而在其自身的功能实现中利用这些地图数据。例如,路径规划节点在规划机器人从起点到终点的最优路径时,就需要知道地图的布局,包括哪里有障碍物、哪里是可通行区域等,通过订阅/map话题就可以从map_server节点获取到这些必要的地图信息。 

map_server处理过程

  • PGM 文件开头有特定的文件头格式,包含了关于这幅图像的一些基本信息,如文件格式标识(确认是 PGM 格式)、图像的宽度和高度(即地图的尺寸)、灰度值的最大范围等。map_server首先会读取这些文件头信息,以便后续正确解析图像数据。例如,知道了图像的宽度和高度,就可以确定要读取多少个像素的数据来完整获取地图信息。
  • 根据文件头获取到的图像尺寸信息,map_server会逐行逐列地读取 PGM 文件中的每个像素的灰度值。在读取过程中,依据事先约定好的灰度值与地图属性的对应关系(如上述白色表示可通行、黑色表示障碍物)来判断每个像素位置对应的地图区域是可通行还是存在障碍物。
  • 比如,如果读取到一个像素的灰度值接近 255(假设是 8 位灰度图像,最大灰度值为 255),那么根据约定,这个像素所对应的地图位置就会被判定为可通行区域;如果读取到的灰度值接近 0,就会被判定为障碍物所在位置。
  • 在解析完所有像素数据后,map_server会将判断好的地图通行和障碍信息以合适的方式存储在内存中。通常会采用二维数组等数据结构来存储,其中数组的每个元素对应着地图上的一个位置,元素的值则表示该位置是可通行、障碍物还是其他状态(如未知区域等)。例如,可能会用 0 表示障碍物,1 表示可通行区域等,这样其他需要使用地图的节点(如路径规划节点)就可以方便地从这个存储结构中获取到所需的地图信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iPhone当U盘使用的方法 - iTunes共享文件夹无法复制到电脑怎么办 - 如何100%写入读出

效果图 从iPhone复制文件夹到windows电脑 步骤windows 打开iTunes通过USB连接iPhone和电脑手机允许授权iTunes中点击手机图标&#xff0c;进入到点击左边“文件共享”&#xff0c;在右边随便选择一个App&#xff08;随意...&#xff09;写入U盘&#xff1a;拖动电脑的文件&am…

python 爬虫抓取百度热搜

实现思路&#xff1a; 第1步、在百度热搜页获取热搜元素 元素类名为category-wrap_iQLoo 即我们只需要获取类名category-wrap_为前缀的元素 第2步、编写python脚本实现爬虫 import requests from bs4 import BeautifulSoupurl https://top.baidu.com/board?tabrealtime he…

【保姆级教程】Linux服务器本地部署Trilium+Notes笔记结合内网穿透远程在线协作

文章目录 前言1. 安装docker与docker-compose2. 启动容器运行镜像3. 本地访问测试4.安装内网穿透5. 创建公网地址6. 创建固定公网地址 前言 今天和大家分享一款在G站获得了26K的强大的开源在线协作笔记软件&#xff0c;Trilium Notes的中文版如何在Linux环境使用docker本地部署…

整合 flatten-maven-plugin 插件:解决子模块单独打包失败问题

整合 flatten-maven-plugin 插件&#xff1a;解决子模块单独打包失败问题 解决问题 我们来解决 Maven 多模块工程中&#xff0c;如果在父 pom 中定义了统一版本号 revision &#xff0c;单独对某个子模块执行 clean package 打包失败的问题。 [ERROR] Failed to execute goa…

PLC是如何扫描程序的?各位电气人都了解吗?

学习PLC必须要深刻理解PLC的扫描过程和执行原理&#xff0c;才能可靠无误的编写程序。通俗的讲PLC程序是从上往下&#xff0c;从左往右顺序循环扫描执行&#xff0c;它需要三个过程才真正输出实现外部动作。 第一步&#xff0c;先把外接的开关信号状态批量刷新到I输入映像区。 …

基于BLE的商业综合体室内定位导航系统的设计与实现

在大型商业综合体中&#xff0c;消费者常常因复杂的布局而感到困惑&#xff0c;如何高效、精准地引导顾客到达目标位置&#xff0c;成为提升购物体验的关键。BLE技术凭借其低功耗、高稳定性和广泛的设备兼容性&#xff0c;成为构建室内定位导航系统的理想选择。本文将详细探讨商…

CSS浮雕效果

效果图&#xff1a; HTML源码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Documen…

音视频入门基础:FLV专题(18)——Audio Tag简介

一、引言 根据《video_file_format_spec_v10_1.pdf》第75页&#xff0c;如果某个Tag的Tag header中的TagType值为8&#xff0c;表示该Tag为Audio Tag&#xff1a; 这时StreamID之后紧接着的就是AudioTagHeader&#xff0c;也就是说这时Tag header之后的就是AudioTagHeader&…

《掌控Linux:全面解析用户与组管理的奥秘》

目录 引言 用户与组管理 一、理解用户账户和组 二、Linux用户账户及其类型 三、超级用户权限 &#xff08;一&#xff09;Ubuntu的sudo命令 1、使用su命令临时改变用户身份 2、sudo命令用于切换用户身份执行 四、用户配置文件 &#xff08;一&#xff09;用户账户配置…

exp:CVE-2024-2961将phpfilter任意文件读取提升为远程代码执行(RCE)

该exp来自于https://raw.githubusercontent.com/ambionics/cnext-exploits/main/cnext-exploit.py在原基础上添加了一个小改动&#xff0c;使其更加通用 修改后的exp顶部资源失效则https://www.123865.com/s/kN7jVv-uccLd 之前的命令行参数为 使用方式是python exp.py url com…

玄机-应急响应- Linux入侵排查

一、web目录存在木马&#xff0c;请找到木马的密码提交 到web目录进行搜索 find ./ type f -name "*.php" | xargs grep "eval(" 发现有三个可疑文件 1.php看到密码 1 flag{1} 二、服务器疑似存在不死马&#xff0c;请找到不死马的密码提交 被md5加密的…

Thread类及线程的核心操作

一. Thread类的常见构造方法 1. Thread() Thread类无参的构造方法, 用于创建Thread类的实例对象. 2. Thread(String name) 带一个参数的Thread类构造方法, 创建一个线程对象, 并给其命名. [注]: 如果不专门给线程命名, 那么线程默认的名字就是Thread-0, Thread-1, Thread-…

云腾五洲的智联引擎是什么?

智联引擎是成都云腾五洲科技有限公司旗下的数智化转型服务平台&#xff0c;它提供云边协同的分布式物联网平台引擎服务。这一平台以其强大的功能和灵活性&#xff0c;为全行业提供数智化转型的新动力&#xff0c;帮助企业在数智化升级中实现持续增长。 核心能力 智联引擎的核心…

网络编程 TCP编程 Linux环境 C语言实现

所有基于数据传输通信的程序&#xff0c;都会被分成两种角色&#xff1a; 1. 服务端&#xff1a;又称为服务器 server 提供一种通信服务的进程 基本工作过程是&#xff1a;1> 接收请求数据 2> 处理请求数据 3> 发送处理结果 2. 客户端&#xff1a;client 使用一种通…

【Qt聊天室客户端】个人信息界面功能开发

1. 加载个人信息 从DataCenter数据类中拿到个人信息相关数据&#xff0c;然后显示到窗口中即可 个人信息界面中所有功能的实现&#xff0c;都是通过按钮触发操作&#xff0c;然后通过网络请求与后台交互完成信息更新 实现 2. 修改昵称 实现逻辑分析 获取输入框的昵称&#xf…

加油-加油

A 时刻注意A可逆&#xff0c;直接除去

十分钟Linux中的epoll机制

epoll机制 epoll是Linux内核提供的一种高效I/O事件通知机制&#xff0c;用于处理大量文件描述符的I/O操作。它适合高并发场景&#xff0c;如网络服务器、实时数据处理等&#xff0c;是select和poll的高效替代方案。 1. epoll的工作原理 epoll通过内核中的事件通知接口和文件…

60V恒流IC SL8443B内置功率MOS 支持2.5A电流 降压LED恒流驱动芯片

一、概述 SL8443B是一款高性能的LED恒流驱动芯片&#xff0c;具有60V的耐压能力&#xff0c;适用于高电压应用场景。它内置了5A&#xff08;或说5V&#xff0c;根据上下文理解为功率等级&#xff09;的功率MOS&#xff0c;可以减少外部元件数量&#xff0c;降低成本&#xff0…

获得淘宝app商品详情原数据 API 券后价获取API

item_get_app_pro-获得淘宝app商品详情原数据 通过此API可以实现通过商品id获取商品详情页数据&#xff0c;包括券后价、主图、详情等等。 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameStr…

得计算题者得天下!软考系统集成计算题详解!

软考中级系统集成项目管理工程师考试一共有《综合知识》和《案例分析》两门科目&#xff0c;而在这两科中都会涉及到计算题&#xff0c;特别是案例分析中&#xff0c;计算题每次考试都会占到一道大题&#xff0c;共25分&#xff0c;占到了科目总分的1/4&#xff0c;所以对于系统…