无人机避障——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.rhkb.cn/news/461238.html

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

相关文章

科研项目:利用AI大模型获得基金资助的10个原则

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 以ChatGPT为代表的大语言模型的诞生后&#xff0c;在学术界这些大模型LLM驱动的聊天机器人已经成为大家撰写和修订论文、基金申请书的流行工具。这些LLM经过千亿文本训练&…

CVE-2022-0185

这是一个关于整型溢出的CVE。 static int legacy_parse_param(struct fs_context *fc, struct fs_parameter *param) {struct legacy_fs_context *ctx fc->fs_private; // [1] ctx 与文件描述符相关unsigned int size ctx->data_size; // [2] size —— 目前已经写…

【Linux网络】TCP_Socket

目录 TCP协议&#xff08;传输控制协议&#xff09; listen状态 accept和connect TCP_echo_server (1)创建套接字 &#xff08;2&#xff09;绑定 &#xff08;3&#xff09;设置listen状态 &#xff08;4&#xff09;loop &#xff08;5&#xff09;客户端 多线程远程…

摄像机实时接入分析平台LiteAIServer视频智能分析软件视频诊断中的抖动检测功能

在现代社会中&#xff0c;视频监控系统扮演着至关重要的角色&#xff0c;而视频质量直接影响到监控系统的可靠性和有效性。随着技术的不断进步&#xff0c;视频智能分析软件LiteAIServer作为一款领先的视频智能分析软件&#xff0c;通过引入抖动检测功能&#xff0c;进一步提升…

Excel重新踩坑4:快捷键;逻辑函数;文本函数;日期相关函数;查找与引用函数;统计类函数;数组公式

0、excel常用快捷键 基础快捷键&#xff1a; alt&#xff1a;快速区域求和&#xff1b; ★ altenter&#xff1a;强制换行&#xff08;因为在excel单元格中没法用enter换行&#xff09;&#xff1b;altj&#xff1a;强制换行符的替换删除&#xff0c;这里altj就是在替换中输入…

ABAP RFC SQL 模糊查询和多个区间条件

对于非选择屏幕的情况&#xff0c;RFC接口输入数据后&#xff0c;如何处理字符串模糊查询、日期区间查询、数字区间查询&#xff1a; 一、所有字符支持模糊查询&#xff0c;在SAP SQL中&#xff0c;使用 %S%来实现。 二、区间查询有3种情况&#xff1a; 1、没有值输入&#xf…

python通过pyperclip库操作剪贴板

pyperclip介绍 pyperclip是一个python库用于操作剪贴板&#xff0c;可以非常方便地将文本复制到剪贴板或从剪贴板获取文本。 通过pip进行安装&#xff1a;pip install pyperclip pyperclip的github地址 pyperclip使用 复制到剪贴板 import pypercliptext "Hello, Wo…

Golang | Leetcode Golang题解之第516题最长回文子序列

题目&#xff1a; 题解&#xff1a; func longestPalindromeSubseq(s string) int {n : len(s)dp : make([][]int, n)for i : range dp {dp[i] make([]int, n)}for i : n - 1; i > 0; i-- {dp[i][i] 1for j : i 1; j < n; j {if s[i] s[j] {dp[i][j] dp[i1][j-1] …

Virtuoso使用layout绘制版图、使用Calibre验证DRC和LVS

1 绘制版图 1.1 进入Layout XL 绘制好Schmatic后&#xff0c;在原理图界面点击Launch&#xff0c;点击Layout XL进入版图绘制界面。 1.2 导入元件 1、在Layout XL界面左下角找到Generate All from Source。 2、在Generate Layout界面&#xff0c;选中“Instance”&#…

摩科智能化一体化防盗门(物联网)项目

一&#xff0c;选题依据及意义 ①理论意义 目前国内外学者对智能门锁的研究取得了一些成果&#xff0c;但都局限于猫眼和门锁设计上。本课题在产品设计、服务设计等理论基础上&#xff0c;深入研究在安全与防护的背景下简约化即智能应用的门锁创新。在理论与实际探索上建立了…

记录一下方便的条件编译

1. 需要准备&#xff1a; 1-1、npm i cross-env -D 是跨平台的自定义编译 1-2、构造工具&#xff1a;vite/webpack > vite: import.meta.env.VITE_NODE_ENV > webpack:process.env.NODE_ENV这里使用vite为例子 1-3、 package.json 2. 思路与步骤 首先我们知道 axio…

企业数据泄露安全演练(分享)

该文章主要分享作者在XXX企业内部做的一次【数据泄露安全演练】&#xff0c;涉及演练背景、目的、演练流程、剧本设定、预期行为、结果等等。 以下是完整的演练方案&#xff0c;有不足的地方希望大家指出&#xff01;&#xff01; 需要原版方案电子版的可以联系作者获取。 演练…

[前端面试]计算机网络

TCP/IP 与OSI TCP/IP TCP/IP 四层模型是一个分层网络通信模型&#xff0c; 它将网络通信过程分为四个层次&#xff0c;这四层分别是&#xff1a;网络接口层、互联网层、传输层和应用层。 网络接口层负责在计算机和网络硬件之间传输数据&#xff0c;负责在物理网络上发送和接…

Conmi的正确答案——在Kibana中进入Elasticsearch的索引管理页面

Elasticsearch版本&#xff1a;7.17.25 Kibana版本&#xff1a;7.17.25 注&#xff1a;索引即类似mysql的表。 0、进入首页 1、未创建任何“索引模式”时&#xff1a; 1.1、点击左边的三横菜单&#xff1b; 1.2、点击“Discover”&#xff0c;进入“发现”页面&#xff1b; 2…

Marin说PCB之电源的Surface Current Density知多少?

小编我是一位资深的国漫迷&#xff0c;像什么仙逆&#xff0c;斗破&#xff0c;斗罗&#xff0c;完美世界&#xff0c;遮天&#xff0c;凡人修仙传&#xff0c;少年歌行等&#xff0c;为了可以看这些视频小编我不惜花费了攒了很多年的私房钱去开了这个三个平台的会员啊&#xf…

安卓开发之数据库的创建与删除

目录 前言&#xff1a;基础夯实&#xff1a;数据库的创建数据库的删除注意事项 效果展示&#xff1a;遇到问题&#xff1a;如何在虚拟机里面找到这个文件首先&#xff0c;找到虚拟机文件的位置其次&#xff0c;找到数据库文件的位置 核心代码&#xff1a; 前言&#xff1a; 安…

UV紫外相机

在产业设备领域&#xff0c;运用相机进行检测的需求很大&#xff0c;应用也很多样&#xff0c;对于图像传感器性能的期望逐年提升。在这样的背景下&#xff0c;可拍摄紫外线&#xff08;UV&#xff1a;Ultra Violet&#xff09;图像的相机拥有越来越广泛的应用场景。将UV照明和…

Python学习的自我理解和想法(22)

学的是b站的课程&#xff08;千锋教育&#xff09;&#xff0c;跟老师写程序&#xff0c;不是自创的代码&#xff01; 今天是学Python的第22天&#xff0c;学的内容是正则表达式&#xff0c;明天会出一篇详细实例介绍。电脑刚修好&#xff01;开学了&#xff0c;时间不多&…

ARM base instruction -- bfi

Bitfield Insert copies a bitfield of <width> bits from the least significant bits of the source register to bit position <lsb> of the destination register, leaving the other destination bits unchanged. 位域插入将<width>位的位域从源寄存器的…

Python实现深度学习模型预测控制(tensorflow)DL-MPC(Deep Learning Model Predictive Control

链接&#xff1a;深度学习模型预测控制 &#xff08;如果认为有用&#xff0c;动动小手为我点亮github小星星哦&#xff09;&#xff0c;持续更新中…… 链接&#xff1a;WangXiaoMingo/TensorDL-MPC&#xff1a;DL-MPC&#xff08;深度学习模型预测控制&#xff09;是基于 P…