当前位置: 首页 > news >正文

Costmap代价地图

以下为ROS navigation导航工具包的move_base框架图。其中有两个关于代价地图的模块(红框所框),全局代价地图global_costmap和局部代价地图local_costmap,这两个代价地图实际上是调用的同一个功能包代码,通过配置不同的参数实例化为两个代价地图,全局代价地图就提供给全局路径规划器使用,局部代价地图就提供给局部路径规划器使用

全局代价地图(Global Costmap):为全局路径规划(如A*、Dijkstra算法)提供静态环境模型,生成从起点到目标点的最优路径。

  • 范围大:覆盖整个已知环境(如地图或SLAM构建的栅格地图)。

  • 更新频率低:主要依赖静态地图(如map_server加载的PGM地图),通常仅在收到新地图时更新。

  • 包含静态障碍:如墙壁、家具等固定物体,也可能叠加动态障碍(但更新较慢)。

  • 分辨率较低:为了平衡计算效率,栅格粒度可能较粗。

 局部代价地图(Local Costmap):为局部路径规划(如TEB、DWA算法)提供动态环境模型,处理实时避障和局部路径调整。

  • 范围小:仅围绕机器人周围(如4x4米),关注即时环境。

  • 更新频率高:实时融合传感器数据(如激光雷达、深度相机),快速响应动态障碍(如行人、移动物体)。

  • 高分辨率:栅格粒度更细,以精确避障。

  • 短期记忆:可能包含临时障碍物(如inflation_layer膨胀区域)。

协同工作流程:

  1. 全局规划:导航开始时,全局代价地图基于静态地图生成一条粗略路径(如navfnGlobal Planner)。

  2. 局部执行:机器人沿全局路径移动时,局部代价地图实时检测动态障碍,并通过局部规划器(如TEB)调整轨迹。

  3. 恢复机制:若局部避障失败(如死胡同),全局规划器会重新规划路径。

 

地图文件与地图参数文件 

在我们完成建图的时候会保存一个pgm格式的地图文件,pgm就是便携式灰度图,除了这种格式外,costmap还支持加载jpg,png等常用的图片格式,还可以使用画图工具修改或重画地图。

地图文件是由很多像素组成的,每个像素我们取它的灰度值作为网格值(取值范围是0-255,0代表黑色,255代表白色)

除此之外还会有一个地图参数文件 .yaml。

image:/home/yf/ros_ws/src/map/mymap.pgm     # 地图文件路径
resolution:0.050000                         # 地图分辨率,米/像素
origin:[-13.800000, -13.800000, 0.000000]   # 小车在地图中的起始姿态(x, y, yaw)
negate:0                                    # 是否应该反转 白/黑 空闲/占用 默认置0
occupied_thresh: 0.65                       # 大于此阈值的像素被视为完全占用。取值[0, 1]
free_thresh: 0.196                          # 小于此阈值的像素被认为是完全空闲的。取值[0, 1]
# 可选参数mode: Trinary 默认值为三元解释,即加载进去的地图最终输出一共有三个状态,分别是完全占用、完全空闲和未知

 

 

footprint

可以理解为小车投影到二维地图上的轮廓

 

膨胀

如下图所示,红色为障碍物,蓝色部分就是障碍物按一定的半径膨胀出来的,为了防止小车撞到障碍物上。膨胀的半径至少是小车轮廓的外接圆半径,小车的中心不能与蓝色膨胀部分相交

 

costmap的地图组成

costmap是由三层地图组成的,:Static Layer(静态地图层),Obstacle Layer(障碍物层),Inflation Layer(膨胀层)。如下图所示,Master就是最终在rviz中呈现的地图,它是由静态地图层、障碍物层和膨胀层叠加形成。

  1.  Static Layer(静态地图层):接收/map话题信息,加载建好的地图
  2. Obstacle Layer(障碍物层):接收雷达等信息,实时检测环境的障碍物。可以通过PointCloud,PointCloud2和LaserScan进行观测,常用LaserScan即雷达。
  3. Inflation Layer(膨胀层):根据inflation_radius(膨胀半径)参数,膨胀障碍物

前面说过,在move_base框架中有两个costmap,这两个代价地图模块都是根据costmap2DROS接口来进行实例化

 

costmap类的继承图

如下图所示,重点关注Costmap2D和Layer类,Costmap2D提供存储地图,变换坐标等功能;Layer提供每一层的对地图的操作,包括updateCosts和updateBounds两个主要函数。

类CostmapLayer继承了 Costmap2D和Layer类,所以既提供地图服务,又提供对地图操作的方法。

ObstacleLayer和StaticLayer类继承了CostmapLayer类。

inflationLayer就是膨胀层的类,膨胀层不需要存储地图信息,只对地图进行膨胀操作,所以不需要Costmap2D

LayeredCostmap是将类ObstacleLayer、StaticLayer和inflationLayer实例化后的对象进行整合形成masterlayer,然后可以展示在rviz中。主要的更新函数是updateMap

Costmap2DROS类就是对外提供一个简洁的接口

 

下面介绍这些类是如何一起工作来更新地图的:首先Layeredcostmap里有更新函数updateMap,遍历调用了所有层的两个核心函数(updateCosts和updateBounds,一共三个层,所以共调用6个函数,updateBounds函数用于各层自己更新,updateCosts则将更新后的内容反映到masterlayer上) 

具体流程如下:下图1为初始化后的状态,每一层都调用更新函数在自己的层区域内进行更新(静态地图一般不更新),可以看到图2障碍物更新以后和初始化状态就不一样了,再调用函数updateCosts就把更新后的状态反映到了master上面。图3 4 5分别为静态层、障碍物层、膨胀层调用函数进行更新并反映到masterlayer上的过程。同时在Costmap2DROS这个接口类开启更新map的线程运行map的updateloop函数来循环调用Layeredcostmap类

 

恢复行为

与global_costmap和local_costmap联系比较密切的recovery_behaviors。这个就是在导航时如果遇到堵住的情况就会进行一些恢复行为看看能不能正常恢复,如果恢复行为还是不行的情况下它就终止导航

官方提供的恢复行为一共有三个插件。在navigation官方的功能包里都是有源码的

参数 

以下参数是从navigation/costmap_2d/cfg中提取出来的,这样修改参数更加直观 。我将navigation功能包的核心参数提出,重新建立一个功能包ucar_nav专门用来修改navigation的参数,以下分别为costmap_common_params.yaml、global_costmap_params.yaml和local_costmap_params.yaml文件,最后再在ucar_nav中写一个启动文件即可启动导航,launch文件内容见篇尾,这个launch文件启动了导航的所有参数文件,其中包括文件costmap_common_params.yaml、global_costmap_params.yaml和local_costmap_params.yaml

#Description:
# 代价地图通用参数配置文件,就是全局代价地图和局部代价地图
# 共同都需要配置的参数,各参数意义如下:
# robot_radius: 机器人的半径
# "obstacle_range" 参数确定最大范围传感器读数,这将导致障碍物被放入代价地图中。
# 在这里,我们把它设置在3米,这意味着机器人只会更新其地图包含距离移动基座3米以内的障碍物的信息。
# “raytrace_range”参数确定了用于清除指定范围外的空间。
# 将其设置为3.0米,这意味着机器人将尝试清除3米外的空间,在代价地图中清除3米外的障碍物。#robot_radius: 0.2#如footprint 参数定义了机器人的轮廓(Footprint),用于表示机器人在二维平面上的形状和大小。它是一个多边形的顶点列表,每个顶点由 [x, y] 坐标表示。这些坐标描述了机器人在地图上的物理边界,用于避障和路径规划。
#机器人的基坐标系(base_link)通常位于机器人的中心。x 轴指向机器人的前方,y 轴指向机器人的左侧,z 轴指向机器人的上方。
#[0.171, -0.128]: 表示机器人轮廓的右前角,距离机器人中心前方 0.171 米,右侧 0.128 米。
footprint: [[0.171, -0.128], [0.171, 0.128], [-0.171, 0.128], [-0.171, -0.128]]obstacle_layer: # 这是用于检测和跟踪障碍物的层。它会根据传感器数据更新代价地图,将障碍物添加到地图中,并尝试清除可能的障碍物enabled: true #  一个布尔值,指示是否启用障碍物层combination_method: 1 # 用于控制多个传感器数据如何融合到代价地图中。它的作用是决定当多个传感器检测到同一区域时,如何合并这些传感器的数据。# combination_method 是一个整数参数,0表示当多个传感器检测到同一区域时,选择最大的代价值作为该区域的最终值,# 如果某个传感器曾经检测到高代价值的障碍物,即使后续传感器数据更新为低代价值,该区域的代价值仍然会保持较高(直到被其他机制清除)。# 1表示当多个传感器检测到同一区域时,后接收到的传感器数据会覆盖之前的数据,每次传感器数据更新时,都会直接覆盖之前的代价值,确保最新的传感器数据被优先使用。# 2表示当多个传感器检测到同一区域时,选择最小的代价值作为该区域的最终值。track_unknown_space: true #  一个布尔值,指示是否跟踪未知空间。如果设置为true,则会将未知区域标记为障碍物。obstacle_range: 2.0 # 最大障碍单位为米。物检测范围raytrace_range: 3.0 #  用于清除指定范围外的空间的参数,单位为米observation_sources: laser_scan_sensorlaser_scan_sensor:{sensor_frame: laser_frame,data_type: LaserScan,topic: scan,marking: true,clearing: true,inf_is_valid: true,}inflation_layer: # inflation_layer: 这是用于扩展障碍物的层,以确保机器人周围的区域被正确考虑。它会根据代价地图中的障碍物信息来调整代价值。增加该值可以扩大避障范围,但可能会限制机器人的运动空间。enabled: truecost_scaling_factor: 13.0 # 控制代价值随距离变化的速率。较大的 cost_scaling_factor:代价值衰减得更快,膨胀区域较小。机器人会更接近障碍物,路径规划更灵活,但避障安全性降低。较小的 cost_scaling_factor:代价值衰减得更慢,膨胀区域较大。机器人会远离障碍物,避障安全性提高,但路径规划可能更保守。# inflation_radius: 0.2inflation_radius: 0.15 #  扩展半径,即将障碍物周围多远的区域考虑在内,单位为米。static_layer: # 这是用于处理静态地图的层。它会将静态地图中的信息添加到代价地图中,以确保机器人周围的环境与实际环境保持一致。enabled: true
#Description:
#  全局代价地图参数配置文件,各参数的意义如下:
#  global_frame:在全局代价地图中的全局坐标系;
#  robot_base_frame:机器人的基坐标系;
#0.2quanju  inflation_layer
global_costmap:global_frame: maprobot_base_frame: base_linkupdate_frequency: 0.5 # 代价地图更新的频率,以赫兹为单位。它表示代价地图将以多快的速度更新和重新计算。值越高,地图更新越快,但计算负载也越大.update_frequency不断更新动态障碍物,更新膨胀区域,更新传感器数据publish_frequency: 5.0 #  代价地图发布的频率,以赫兹为单位。它表示代价地图将以多快的速度发布给其他节点。值越高,地图发布越频繁,但会增加网络负载。static_map: true # 一个布尔值,指示是否使用静态地图。如果设置为true,则代价地图将使用静态地图服务(例如map_server)提供的静态地图。如果设置为false,则代价地图将不使用静态地图服务,而是由代价地图自己生成地图。rolling_window: false # 是否使用滚动窗口模式。如果为 true,全局代价地图会以机器人当前位置为中心动态更新;如果为 false,全局代价地图会覆盖整个地图。transform_tolerance: 10 # 确保在导航过程中,坐标系变换(如从 map 到 base_link 的变换)是有效的和及时的。如果变换的时间戳与当前时间的差值超过了 transform_tolerance,该变换会被认为无效,导航系统可能会采取相应的措施(如停止机器人或重新请求变换)。确保使用的变换是最新的和有效的。避免使用过时的变换数据,导致导航错误。track_unknown_space: true #  一个布尔值,指示是否跟踪未知空间。如果设置为true,则代价地图将尝试跟踪地图中未知空间的信息,否则将忽略未知空间。plugins:- {name: static_layer,    type: "costmap_2d::StaticLayer"}- {name: obstacle_layer,  type: "costmap_2d::ObstacleLayer"}- {name: inflation_layer, type: "costmap_2d::InflationLayer"}
#Description:
#  本地代价地图需要配置的参数,各参数意义如下:
#  global_frame:在本地代价地图中的全局坐标系;
#  robot_base_frame:机器人本体的基坐标系;
#0.1
local_costmap:global_frame: maprobot_base_frame: base_linkupdate_frequency: 8.0 # 本地代价地图的更新频率,以赫兹(Hz)为单位。指定了代价地图更新的频率,即更新地图中的障碍物信息的速率publish_frequency: 5.0 # 本地代价地图的发布频率,以赫兹(Hz)为单位。指定了代价地图发布更新的频率,即向外部节点发布地图信息的速率。static_map: true # 指定是否使用静态地图。如果设置为true,则使用静态地图来构建代价地图,这意味着局部代价地图会包含全局地图中的静态障碍物信息。。如果设置为false,则使用滚动窗口方式构建代价地图,完全依赖传感器数据激光雷达来构建局部环境信息。rolling_window: true # 指定是否使用滚动窗口方式构建代价地图。如果设置为 true,局部代价地图会以机器人当前位置为中心,动态更新地图内容。地图的范围是固定的(由 width 和 height 参数定义),但地图的内容会随着机器人的移动而滚动更新。如果设置为 false,局部代价地图的范围是固定的,且不会随着机器人的移动而滚动更新。机器人可能会移动到地图边界之外,导致地图无法覆盖当前环境。width: 2.0 # 本地代价地图的宽度和高度,以米为单位。指定了代价地图的尺寸,即代价地图覆盖的地理区域的大小。height: 2.0resolution: 0.03 # 本地代价地图的分辨率,以米为单位。指定了代价地图的分辨率,即每个栅格的大小。transform_tolerance: 10 # TF变换的容忍度,以秒为单位。指定了在更新代价地图时允许的TF变换的最大延迟时间,以确保代价地图的正确性plugins:
#    - {name: static_layer,    type: "costmap_2d::StaticLayer"}- {name: obstacle_layer,  type: "costmap_2d::ObstacleLayer"}- {name: inflation_layer, type: "costmap_2d::InflationLayer"}

 

<launch><!-- Run the map server --><include file="$(find ucar_controller)/launch/base_driver.launch" > </include><include file="$(find ydlidar)/launch/ydlidar.launch" > </include><node name="map_server" pkg="map_server" type="map_server" args="$(find ucar_nav)/maps/yf.yaml" output="screen"><param name="frame_id" value="map" /></node> <include file="$(find ucar_nav)/launch/config/amcl/amcl_omni.launch" > </include><node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen"><param name="base_global_planner" value="global_planner/GlobalPlanner"/><param name="base_local_planner" value="teb_local_planner/TebLocalPlannerROS"/><rosparam file="$(find ucar_nav)/launch/config/move_base/costmap_common_params.yaml" command="load" ns="global_costmap" /><rosparam file="$(find ucar_nav)/launch/config/move_base/costmap_common_params.yaml" command="load" ns="local_costmap" /><rosparam file="$(find ucar_nav)/launch/config/move_base/global_planner_params.yaml" command="load" /><rosparam file="$(find ucar_nav)/launch/config/move_base/tra_local_planner_params.yaml" command="load" /><rosparam file="$(find ucar_nav)/launch/config/move_base/local_costmap_params.yaml" command="load" /><rosparam file="$(find ucar_nav)/launch/config/move_base/global_costmap_params.yaml" command="load" /><rosparam file="$(find ucar_nav)/launch/config/move_base/laser_filters.yaml" command="load" /><remap from="scan" to="/raw_scan" />  <!-- 输入原始激光话题 --><remap from="scan_filtered" to="/scan" />  <!-- 输出过滤后话题 --></node><node pkg="rviz" type="rviz" name="rviz" args="-d $(find ucar_nav)/launch/config/rviz/rviz.rviz" /></launch>

 

 

 

 

相关文章:

Costmap代价地图

以下为ROS navigation导航工具包的move_base框架图。其中有两个关于代价地图的模块(红框所框)&#xff0c;全局代价地图global_costmap和局部代价地图local_costmap&#xff0c;这两个代价地图实际上是调用的同一个功能包代码&#xff0c;通过配置不同的参数实例化为两个代价地…...

用生活例子通俗理解 Python OOP 四大特性

让我们用最生活化的方式&#xff0c;结合Python代码&#xff0c;来理解面向对象编程的四大特性。 1. 封装&#xff1a;像使用自动售货机 生活比喻&#xff1a; 你只需要投币、按按钮&#xff0c;就能拿到饮料 不需要知道机器内部如何计算找零、如何运送饮料 如果直接打开机…...

大规模容器集群怎么规划

规划大规模容器集群需要综合考虑多个方面&#xff0c;以下是一些关键的规划要点&#xff1a; 业务需求分析 应用类型和特点&#xff1a;明确容器集群上运行的应用类型&#xff0c;如 Web 应用、数据库、大数据处理等。不同类型的应用对资源的需求和性能要求各不相同。例如&am…...

机器学习第七讲:概率统计 → 预测可能性,下雨概率70%就是典型应用

机器学习第七讲&#xff1a;概率统计 → 预测可能性&#xff0c;下雨概率70%就是典型应用 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手…...

蓝桥杯13届 卡牌

问题描述 这天, 小明在整理他的卡牌。 他一共有 n 种卡牌, 第 i 种卡牌上印有正整数数 i(i∈[1,n]), 且第 i 种卡牌 现有 ai​ 张。 而如果有 n 张卡牌, 其中每种卡牌各一张, 那么这 n 张卡牌可以被称为一 套牌。小明为了凑出尽可能多套牌, 拿出了 m 张空白牌, 他可以在上面…...

《Vue.js》阅读之响应式数据与副作用函数

Vue.js 《Vue.js设计与实现》&#xff08;霍春阳&#xff09; 适合&#xff1a;从零手写Vue3响应式系统&#xff0c;大厂面试源码题直接覆盖。重点章节&#xff1a;第4章&#xff08;响应式&#xff09;、第5章&#xff08;渲染器&#xff09;、第8章&#xff08;编译器&…...

线下消费经济“举步维艰”,开源AI智能名片链动2+1+S2B2C小程序线上“狂飙突进”!

开源AI智能名片链动21模式S2B2C商城小程序&#xff1a;驱动消费经济迭代的数字化引擎 摘要&#xff1a;本文以中国消费经济四阶段演进为框架&#xff0c;分析开源AI智能名片链动21模式S2B2C商城小程序如何重构商业生态。研究显示&#xff0c;该系统通过AI算法驱动的精准需求匹…...

简述DNS域名服务器

DNS简述 在互联网中&#xff0c;识别一个主机通常有两种方式——主机名和IP地址。从人类角度来看&#xff0c;人类肯定更喜欢这些便于记忆的主机名标识方式&#xff0c;而对于路由器来说&#xff0c;路由器则更喜欢定长的&#xff0c;有结构层次的IP地址。所以DNS域名服务器就…...

小结: Port Security,DHCP Snooping,IPSG,DAI,

以下是华为和思科在 IP Source Guard、Dynamic ARP Inspection、DHCP Snooping、Port Security 四个安全功能的配置指令对比&#xff1a; 1. Port Security&#xff08;端口安全&#xff09; 思科&#xff08;Cisco&#xff09; # 进入接口模式 interface GigabitEthernet0/1…...

2025年阿里云ACP人工智能高级工程师认证模拟试题(附答案解析)

这篇文章的内容是阿里云ACP人工智能高级工程师认证考试的模拟试题。 所有模拟试题由AI自动生成&#xff0c;主要为了练习和巩固知识&#xff0c;并非所谓的 “题库”&#xff0c;考试中如果出现同样试题那真是纯属巧合。 1、在PAl-Studio实验运行完毕后&#xff0c;可以右键单…...

SwitchyOmega_Chromium 代理插件下载与配置

下载地址: 【免费】SwitchyOmega-Chromium.ran资源-CSDN文库 下载 SwitchyOmega_Chromium.ran 文件。 解压缩文件 解压第一层后&#xff0c;解压第二层代理插件SwitchyOmega_Chromium。 打开 Chromium 浏览器。 导入插件&#xff1a; 在浏览器地址栏输入 chrome://extensio…...

【Nova UI】十四、打造组件库之按钮组件(下):按钮组组件的构建之旅

序言 在之前的探索中&#xff0c;我们成功雕琢出了功能完备且样式精美的 Vue 按钮组件&#xff0c;它在前端界面上绽放着独特的光彩✨。然而&#xff0c;前端开发的创新之路永无止境。如今&#xff0c;为了满足更丰富的交互需求&#xff0c;我们将目光聚焦在按钮组组件的实现上…...

SQL注入

sql注入核心语句 information_schema 虚拟数据库(物理上不存在)&#xff0c;能提供方皓文数据库元数据的方式&#xff0c;元数据是关于数据的数据&#xff0c;如数据库名、表名、列的数据类型、访问权限等 只能访问 information_schema下面的表&#xff1a; schemata表&#xf…...

Java面试高阶篇:Spring Boot+Quarkus+Redis高并发架构设计与性能优化实战

Java面试高阶篇&#xff1a;Spring BootQuarkusRedis高并发架构设计与性能优化实战 面试官&#xff08;严肃&#xff09;&#xff1a; Q1: 你项目中如何实现高并发下的缓存优化&#xff1f; 候选人&#xff08;水货&#xff09;&#xff1a; 我们用了Redis做缓存&#xff0c;…...

【CF】Day57——Codeforces Round 955 (Div. 2, with prizes from NEAR!) BCD

B. Collatz Conjecture 题目&#xff1a; 思路&#xff1a; 简单模拟 很简单的模拟&#xff0c;我们只需要快速的找到下一个离 x 最近的 y 的倍数即可&#xff08;要大于 x&#xff09; 这里我们可以这样写 add y - (x % y)&#xff0c;这样就知道如果 x 要变成 y 的倍数还要…...

Matlab 列车纵向滑模二阶自抗扰算法和PID对比

1、内容简介 Matlab 223-列车纵向滑模二阶自抗扰算法和PID对比 可以交流、咨询、答疑 2、内容说明 略 列车模型 在运行过程中&#xff0c;已知列车受到牵引力或者制动力&#xff0c;基本阻力和附加阻力的作用&#xff0c;规定与列车运行方向相同的力为正&#xff0c;与运行…...

Swift实战:如何优雅地从二叉搜索树中挑出最接近的K个值

文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结未来展望 摘要 在日常开发中&#xff0c;我们经常会遇到“在一堆数据中找出最接近某个值”的需求。尤其在搜索引擎、推荐系统或者地理坐标匹配中&#xff0c;这种“最近匹配”的问题非常常见。Le…...

深度策略梯度算法PPO

一、策略梯度核心思想和原理 从时序差分算法Q学习到深度Q网络&#xff0c;这些算法都侧重于学习和优化价值函数&#xff0c;属于基于价值的强化学习算法&#xff08;Value-based&#xff09;。 1. 基于策略方法的主要思想&#xff08;Policy-based&#xff09; 基于价值类方…...

QuickList

Redis在3.2版本引入数据结构&#xff0c;是一个双端链表&#xff0c;每个节点都是一个ZipList。 引入的原因&#xff1a;ZipList申请内存空间是连续的&#xff0c;如果内存占用较多&#xff0c;申请内存效率很低 思想&#xff1a;属于分片存储的思想 Redis配置项&#xff1a…...

DVWA在线靶场-SQL注入部分

目录 1.SQL注入 1.1 low 1.2 Medium 1.3 high 1.4 impossible 1. SQL盲注 1.1 low 2.2 medium 2.3 high 2.4 impossible 1.SQL注入 显注&#xff1a;前端页面可以回显用户信息&#xff0c;比如 联合注入、报错注入。 盲注&#xff1a;前端页面不能回显用户信息&#xff0c;比…...

IDEA+git将分支合并到主分支、IDEA合并分支

文章目录 一、合并分支二、可能遇到的问题2.1、代码冲突 开发过程中我们可能在开发分支(dev)中进行开发&#xff0c;等上线后将代码合并到主分支(master)中&#xff0c;本文讲解如何在IDEA中将dev分支的代码合并到master分支中。 一、合并分支 功能说明&#xff1a;将dev分支的…...

【Linux笔记】——进程信号的产生

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;Linux &#x1f339;往期回顾&#x1f339;&#xff1a;【Linux笔记】进程间通信——system v 共享内存 &#x1f516;流水不争&#xff0c;争的是滔滔不 一、进程信号…...

Java后端文件类型检测(防伪造)

在 Spring Boot 项目中&#xff0c;为了防止用户伪造 Content-Type&#xff08;例如将 .txt 文件改为 image/jpeg 上传&#xff09;&#xff0c;可以通过检查文件的 Magic Number&#xff08;文件头签名&#xff09;来验证文件的真实类型。以下是 详细实现步骤 和 完整代码示例…...

知名人工智能AI培训公开课内训课程培训师培训老师专家咨询顾问唐兴通AI在金融零售制造业医药服务业创新实践应用

AI赋能未来工作&#xff1a;引爆效率与价值创造的实战营 AI驱动的工作革命&#xff1a;从效率提升到价值共创 培训时长&#xff1a; 本课程不仅是AI工具的操作指南&#xff0c;更是面向未来的工作方式升级罗盘。旨在帮助学员系统掌握AI&#xff08;特别是生成式AI/大语言模型…...

VUE3基础样式调整学习经验

首先创建一个vue项目最好要把不属于自己的样式都删除掉&#xff0c;以面出现css难以调整的情况&#xff1a; 1.assets目录下的main.css、base.css等样式全部删除 2.app.vue下的样式也全部删除 3.使用element plus一定要加入样式包&#xff1a; import element-plus/dist/in…...

AI与IoT携手,精准农业未来已来

AIoT:农业领域的变革先锋 在科技飞速发展的当下,人工智能(AI)与物联网(IoT)的融合 ——AIoT,正逐渐成为推动各行业变革的关键力量,农业领域也不例外。AIoT 技术通过将 AI 的智能分析能力与 IoT 的设备互联能力相结合,为农业生产带来了前所未有的精准度和智能化水平。 …...

物联网驱动的共享充电站系统:智能充电的实现原理与技术解析!

随着新能源汽车的快速普及&#xff0c;共享充电站系统作为其核心基础设施&#xff0c;正通过物联网技术的深度赋能&#xff0c;实现从“传统充电”到“智能充电”的跨越式升级。本文将从系统架构、核心技术、优化策略及实际案例等角度&#xff0c;解析物联网如何驱动共享充电站…...

MCP 入门实战:用 C# 开启 AI 新篇章

MCP 入门实战&#xff1a;用 C# 开启 AI 新篇章 一、什么是 MCP&#xff1f; MCP&#xff0c;全称为 Model Context Protocol&#xff08;模型上下文协议&#xff09;&#xff0c;是一个开放的协议&#xff0c;它为应用程序向大型语言模型&#xff08;LLM&#xff09;提供上下…...

ES常识7:ES8.X集群允许4个 master 节点吗

在 Elasticsearch&#xff08;ES&#xff09;中&#xff0c;4 个 Master 节点的集群可以运行&#xff0c;但存在稳定性风险&#xff0c;且不符合官方推荐的最佳实践。以下从选举机制、故障容错、资源消耗三个维度详细分析&#xff1a; 一、4 个 Master 节点的可行性&#xff1…...

WebRTC:去中心化网络P2P框架解析

在互联网的世界里&#xff0c;数据的传输就像一场永不停歇的 “信息快递”。当我们使用 WebRTC 实现视频通话时&#xff0c;背后支撑的网络框架至关重要。今天&#xff0c;我们将深入探索 WebRTC 开发中视频通话的前置基础 ——P2P&#xff08;点对点&#xff09;框架&#xff…...

Linux 上安装RabbitMQ

&#x1f407; 安装 Erlang/OTP 27.3.4&#xff08;最新稳定版&#xff09; 1. 下载 Erlang 源码 cd /usr/local/src wget https://erlang.org/download/otp_src_27.3.4.tar.gz2. 解压源码 tar -zxvf otp_src_27.3.4.tar.gz cd otp_src_27.3.43. 安装依赖 sudo apt update …...

Service Mesh实战之Istio

Service Mesh&#xff08;服务网格&#xff09;是一种专为微服务架构设计的网络代理层&#xff0c;用于处理服务间的通信、管理和监控。Istio 是一个流行的开源 Service Mesh 实现&#xff0c;通过提供流量管理、观测性和安全性等功能&#xff0c;帮助开发者应对分布式系统的复…...

BGP练习

一、要求拓扑图 二、要求 完成上图内容&#xff0c;要求五台路由器的环回地址均可以相互访问 三、需求分析 1. 网络连通性目标 - 需求明确要求五台路由器&#xff08;AR1 - AR5 &#xff09;的环回地址能够相互访问。环回地址是路由器上用于测试、管理及作为BGP等协议中Ro…...

【Redis】分布式锁的实现

目录 一、本地锁存在的问题 二、redis实现分布式锁原理 三、使用示例 四、锁误删问题 解决思路 获取锁和释放锁代码优化 五、锁释放的原子性问题 解决思路&#xff08;Lua脚本&#xff09; 使用流程 总结 大家好&#xff0c;我是千语。上期给大家讲了使用悲观锁来解决…...

【vue】全局组件及组件模块抽离

一、全局组件 只要是实例化过的区域都可以使用 Vue.component("组件名",{ template: 内容} ) 二、组件模块抽离 抽离就是把template的内容写到body里面&#xff0c;然后建立id写到变量下的template里&#xff0c;id变量写到component里 body{ template&#xff1a; …...

手写 vue 源码 === watch 实现

目录 1. watch 的基本使用 2. watch 的整体架构 3. doWatch 函数的实现 3.1 处理不同类型的监听源 3.2 清理副作用的机制 3.3 创建响应式效果 3.4 初始化执行 3.5 返回停止函数 4. watch 如何基于 ReactiveEffect 实现 4.1 依赖收集过程详解 4.2 更新触发过程详解 …...

STM32核心机制解析:重映射、时间片与系统定时器实战——从理论到呼吸灯开发

知识点1【重映射的概念】 1、引入 默认&#xff1a; **定义&#xff1a;**系统或硬件在未经用户修改时的预设配置或行为 STM32的引脚功能、外设配置、中断向量表等默认由芯片设计或库函数预设。 部分重映射 **定义&#xff1a;**仅修改部分资源或地址的映射关系&#xff…...

【Linux网络编程】HTTPS协议原理

目录 一&#xff0c;HTTPS是什么&#xff1f; 1&#xff0c;什么是加密&#xff1f; 2&#xff0c;为什么需要加密&#xff1f; 3&#xff0c;常见的加密方式 对称加密 非对称加密 4&#xff0c;数据摘要&&数据指纹 二&#xff0c;HTTPS协议加密方案 方案一&a…...

【idea】快捷键ctrl+shift+F(Find in files)不起作用

问题描述 在idea中使用快捷键CtrlShiftF&#xff0c;进行内容的搜索&#xff0c;但是弹不出对话框、或有时候能弹出有时候又弹不出。 原因分析 1.怀疑是缓存问题&#xff1f;--清空缓存重启也没什么作用 2.怀疑是idea的问题&#xff1f;--有时行、有时不行&#xff0c;而且…...

「光域」系列激光测距传感器:以光为尺,重构空间认知边界

在150米深的地下矿井中&#xff0c;无人矿卡需要精准识别前方3厘米的落石&#xff1b;在千米高空的风电塔筒检测现场&#xff0c;工程师手持设备要穿透50米雾霭锁定0.1毫米的形变&#xff1b;在智能仓储的立体库房里&#xff0c;穿梭车需在0.3秒内完成货架间距的毫米级校准………...

http和https的区别

HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;超文本传输安全协议&#xff09;是互联网上用于传输数据的两种协议&#xff0c;它们的主要区别如下&#xff1a; 1. 安全性 HTTP&#xff1a;明文传输&#xff0c;数据在传输过程中不加密&#xff0c;容易被窃…...

Dapp开发-如何开发一个dapp

DApp开发全流程指南&#xff1a;从需求到落地的技术实践与生态构建 ——2025年去中心化应用开发方法论与未来趋势解析 一、需求定位与架构设计&#xff1a;构建DApp的技术地基 需求精准定位 功能定义&#xff1a;明确DApp的核心场景&#xff08;如DeFi借贷、NFT交易、DAO治理&…...

Python邮件处理(使用imaplib和email库实现自动化邮件处理)

在日常工作中&#xff0c;我们经常需要自动化处理电子邮件&#xff0c;比如自动下载附件、解析邮件内容、处理特定格式的数据等。本文将通过一个实际案例&#xff0c;详细介绍如何使用Python的imaplib和email库来实现邮件的自动化处理。 目录 环境准备与库介绍IMAP邮件服务器连…...

时空注意力机制深度解析:理论、技术与应用全景

时空注意力机制作为深度学习领域的关键技术&#xff0c;通过捕捉数据在时间和空间维度上的依赖关系&#xff0c;显著提升了时序数据处理和时空建模能力。本文从理论起源、数学建模、网络架构、工程实现到行业应用&#xff0c;系统拆解时空注意力机制的核心原理&#xff0c;涵盖…...

鸿蒙 UIAbility组件与UI的数据同步和窗口关闭

使用 EventHub 进行数据通信 根据 Stage 模型概念图 UIAbility 先于 ArkUI Page 创建 所以&#xff0c;事件要先 .on 订阅 再 emit 发布 假如现在有页面 Page1 和他的 UIAbility // src/main/ets/page1ability/Page1Ability.ets onCreate(want: Want, launchParam: Ability…...

UI-TARS: 基于视觉语言模型的多模式代理

GitHub&#xff1a;https://github.com/bytedance/UI-TARS 更多AI开源软件&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI 基于视觉语言模型&#xff08;Vision-Language Model&#xff09;的 GUI 代理应用&#xff0c;允许用户通过自然语言控制电脑操…...

C++多态讲解

1. 多态的概念 通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态就是函数重载和函数模板&#xff0c;他们传不同的类型的参数就可以调用不同的函数&#xff0c;通过参数的不同达到多种形态&#xff0c;之所以叫编译时多态&…...

QuecPython+蜂窝模组基础开发

开发准备 硬件&#xff1a; 一块 QuecPython_EC2X_EVB 开发板 (以该开发板为例&#xff0c;更多开发板介绍参见下文开发板列表)USB 数据线 (USB-A TO USB-C)PC (Windows10) 蜂窝模组开发板列表: EC2X_EVBEC600X_EVBEC800X_EVBEC600X/EC800X_CORE_EVBBG95_EVBEC200X_EVBEG91…...

-MAC桢-

MAC桢和IP的关系&#xff1a; 主机A想跨网络和B通信需要IP地址进行路由选择&#xff0c;但一个局域网&#xff0c;比如路由器进行路由选择之前&#xff0c;首先要将数据包发送给路由器B&#xff0c;也就是局域网通信也就是同一个网段的主机进行通信&#xff0c;所以必须通过mac…...

反转链表 - 简单

************* C topic: 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; ************* Give the topic an inspection. It seems really easy. At very first, I think that I will use reverse cammand to kill this topic. But a few seconds later I found that…...