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

grid map学习笔记2之grid map的一些常规定义和功能包说明

文章目录

  • 0 引言
  • 1 常规定义
    • 1.1 单层grid map
    • 1.2 多层grid map
    • 1.3 迭代器类别
    • 1.4 移动grid map的位置
  • 2 功能包
    • 2.1 grid_map_rviz_plugin
    • 2.2 grid_map_sdf
    • 2.3 grid_map_visualization
      • 2.3.1 订阅的主题
      • 2.3.2 发布的主题
    • 2.4 grid_map_filters

0 引言

grid map学习笔记1已成功在Ubuntu18.04系统上源码编译grid map,并且用各个子工程的示例演示,本文主要目的是熟悉grid map的一些常规定义,比如grid map的多层定义,中心坐标系定义,栅格单元定义,迭代器的类型定义等,当然也有一些grid map封装好的packges,比如支持的可视化数据类型(点云,向量,占据栅格等),支持的各种栅格地图过滤器等。

👉 grid map github:https://github.com/ANYbotics/grid_map

本文系统环境:

  • Ubuntu18.04
  • ROS-melodic
  • grid map

1 常规定义

1.1 单层grid map

单层grid map是指一个平面地图,在这个地图上,将整个空间分割成一个个大小相等的方格,每个方格称为一个网格(grid)。每个网格都可以用一个值来表示其在地图上的属性,例如障碍物、自由空间、未知区域等。这些属性值通常用颜色来表示,比如灰色代表障碍物,白色代表自由空间,黑色代表未知区域等。

单层grid map通常用于机器人地图构建和路径规划中,机器人通过传感器获取周围环境信息,然后根据这些信息更新地图上各个网格的属性值。机器人在规划路径时,可以使用单层grid map来表示环境,根据不同网格的属性值计算出可行的路径,从而避开障碍物并尽可能地避免未知区域。

单层grid map相对于其他类型的地图,具有简单、易于实现、易于存储和处理等优点。但它也存在一些限制,例如无法表示多层信息、无法表达细节等。

单层grid map的中心默认在栅格地图的中心,栅格地图的坐标系定义遵从右手法则,x朝前,y朝左,z朝上,每张grid map地图,从左上角开始编号,依次是(0,0)、(0,1)...(n,m)

single grid map
一些常用的函数定义:

  • getMapSize():该函数用于获取地图的大小。输出为地图的宽度和高度,通常以网格数来表示。在机器人地图构建和路径规划中,通常需要获取地图的大小以便进行合理的路径规划和地图构建。
  • getPosition(grid_x, grid_y):该函数用于将网格坐标转化为世界坐标。输入参数为网格坐标(grid_x, grid_y),输出为该网格的世界坐标。在机器人地图构建和路径规划中,通常需要将机器人在地图上的位置转化为世界坐标,以便更好地进行路径规划和控制。
  • getGridIndex(pos_x, pos_y):该函数用于将世界坐标转化为网格坐标。输入参数为世界坐标(pos_x, pos_y),输出为该坐标所在网格的网格坐标。在机器人地图构建和路径规划中,通常需要将传感器获取到的障碍物位置转化为网格坐标,以便更新地图上各个网格的属性值。
  • getResolution():该函数用于获取网格地图的分辨率,即每个网格代表的实际距离。输出为一个实数值,单位为米/格。在机器人路径规划中,通常需要利用网格地图的分辨率计算机器人的运动距离和速度等参数。
  • getSize():该函数用于获取网格地图的大小,即网格地图的宽度和高度,以网格数为单位。输出为一个整数对,格式为(width, height)。在机器人路径规划和地图构建中,通常需要获取网格地图的大小以便进行合理的路径规划和地图构建。
  • getLength():该函数用于获取网格地图的尺寸,即网格地图的总网格数。输出为一个整数值,表示网格地图中网格的总数。在机器人路径规划和地图构建中,通常需要获取网格地图的尺寸以便进行合理的路径规划和地图构建。
  • getIndex(x, y):该函数用于将网格地图中的坐标转化为网格地图中的索引。输入参数为坐标(x, y),输出为该坐标在网格地图中的索引。在机器人路径规划中,通常需要将世界坐标转化为网格地图中的索引以便进行路径规划。

1.2 多层grid map

多层grid map是指在单层grid map的基础上,增加了多个层次的信息表示。每个层次的信息表示可以包括不同的地图属性,例如高度、颜色、温度等。每个网格在多层grid map中可以包含多个属性值,每个属性值对应一个层次。

多层grid map常用于机器人导航和环境建模中,它可以同时表示不同层次的信息,例如机器人所处的高度、周围环境的颜色、温度和湿度等,从而更准确地表示环境信息,增强机器人的感知能力和路径规划能力。

多层grid map中,常用的函数包括:

  • setGridValue(layer, grid_x, grid_y, value):该函数用于设置指定层次和指定网格的属性值。输入参数为层次(layer)、网格坐标(grid_x, grid_y)和属性值(value),用于更新地图上指定层次和指定网格的属性值。

  • getGridValue(layer, grid_x, grid_y):该函数用于获取指定层次和指定网格的属性值。输入参数为层次(layer)、网格坐标(grid_x, grid_y),输出为该网格在指定层次的属性值。

  • getMapSize():该函数用于获取多层grid map的大小。输出为地图的宽度和高度,通常以网格数来表示。

  • getNumLayers():该函数用于获取多层grid map的层数。输出为整数值,表示多层grid map中包含的层数。

  • getResolution():该函数用于获取多层grid map的分辨率,即每个网格代表的实际距离。输出为一个实数值,单位为米/格。

多层grid map相对于单层grid map具有更丰富的信息表示能力,但也会带来更高的计算和存储成本。

multi grid map

1.3 迭代器类别

grid map中,常用的迭代器包括:

  • GridMapIterator:用于在grid map中迭代所有网格。该迭代器按行优先(row-major)的顺序遍历网格,即先遍历第一行的所有网格,然后是第二行的所有网格,以此类推。使用该迭代器可以遍历整个地图。
  • GridMapIteratorRow:用于在grid map中迭代指定行的所有网格。该迭代器按列优先(column-major)的顺序遍历网格,即先遍历第一列的所有网格,然后是第二列的所有网格,以此类推。使用该迭代器可以遍历指定行的所有网格。
  • GridMapIteratorRectangle:用于在grid map中迭代指定矩形区域内的所有网格。该迭代器按行优先的顺序遍历矩形区域内的网格。使用该迭代器可以遍历指定矩形区域内的所有网格。
  • GridMapIteratorSubmap:用于在grid map中迭代指定子地图内的所有网格。该迭代器按行优先的顺序遍历子地图内的网格。使用该迭代器可以遍历指定子地图内的所有网格。

此外,还有一些特定形状的迭代器可以帮助更方便地访问grid map中的网格,例如:

  • GridMapCircleIterator:用于在grid map中迭代指定圆形区域内的所有网格。使用该迭代器可以遍历指定圆形区域内的所有网格。
  • GridMapLineIterator:用于在grid map中迭代指定线段路径上的所有网格。使用该迭代器可以遍历指定线段路径上的所有网格。
  • GridMapPolygonIterator:用于在grid map中迭代指定多边形区域内的所有网格。使用该迭代器可以遍历指定多边形区域内的所有网格。
  • GridMapEllipseIterator:用于在grid map中迭代指定椭圆形区域内的所有网格。使用该迭代器可以遍历指定椭圆形区域内的所有网格。
  • GridMapSpiralIterator:用于在grid map中迭代指定螺旋线区域内的所有网格。使用该迭代器可以遍历指定螺旋线区域内的所有网格。

可以根据具体的需求选择不同的迭代器。在实际应用中,可以通过使用这些迭代器来实现各种操作,例如遍历网格、更新网格属性、计算路径等。

网格图子图圆形线
AltAltAltAlt
多边形椭圆形螺旋
AltAltAlt

对于每个迭代器类别,都有相应的函数来创建迭代器对象,例如:

  • GridMapIterator: begin()end()函数
  • GridMapIteratorRow: beginRow()endRow()函数
  • GridMapIteratorRectangle: beginRectangle()endRectangle()函数
  • GridMapIteratorSubmap: beginSubmap()endSubmap()函数
  • GridMapCircleIterator: GridMapCircleIterator()构造函数
  • GridMapLineIterator: GridMapLineIterator()构造函数
  • GridMapPolygonIterator: GridMapPolygonIterator()构造函数
  • GridMapEllipseIterator: GridMapEllipseIterator()构造函数
  • GridMapSpiralIterator: GridMapSpiralIterator()构造函数

例如,以下代码演示了使用GridMapIterator遍历grid map中的所有网格:

// 创建GridMapIterator迭代器对象
GridMapIterator iter(grid_map);// 遍历grid map中的所有网格
for(auto index : iter) {// 对每个网格执行操作// ...
}

类似地,以下代码演示了使用GridMapCircleIterator遍历grid map中的一个圆形区域内的所有网格:

// 创建GridMapCircleIterator迭代器对象
GridMapCircleIterator iter(grid_map, center, radius);// 遍历圆形区域内的所有网格
for (auto index : iter) {// 对每个网格执行操作// ...
}

需要注意的是,在使用迭代器访问网格时,可以使用索引(index)或坐标(position)方式来访问。例如,以下代码演示了使用索引方式来访问网格:

// 遍历grid map中的所有网格
for (auto index : iter) {// 获取网格索引对应的网格值double value = grid_map.at("layer_name", index);// 对网格执行操作// ...
}

类似地,以下代码演示了使用坐标方式来访问网格:

// 创建GridMapIteratorSubmap迭代器对象
GridMapIteratorSubmap iter(grid_map, position, length);// 遍历子地图内的所有网格
for (auto position : iter) {// 获取坐标对应的网格值double value = grid_map.atPosition("layer_name", position);// 对网格执行操作// ...
}

1.4 移动grid map的位置

grid map中,位置移动可以通过使用grid_map库提供的函数来实现。grid_map库提供了一系列函数,可以方便地对网格地图进行平移和旋转操作。

setPosition(…)move(…)
AltAlt

比如,对于平移操作,可以使用grid_map::move函数。该函数接受一个Eigen::Vector2d类型的偏移量参数,用于指定网格地图在xy方向上的平移量。例如,以下代码可以将网格地图平移一个单位:

grid_map::GridMap map;
// 假设已经加载了网格地图
Eigen::Vector2d offset(1.0, 1.0);
grid_map::move(map, offset);

对于旋转操作,可以使用grid_map::rotate函数。该函数接受一个double类型的旋转角度参数,以弧度为单位。例如,以下代码可以将网格地图旋转45度:

grid_map::GridMap map;
// 假设已经加载了网格地图
double angle = M_PI / 4.0; // 45度
grid_map::rotate(map, angle);

需要注意的是,调用这些函数后,网格地图的大小和分辨率不会发生变化。如果需要改变网格地图的大小和分辨率,可以使用grid_map::GridMap::add函数或grid_map::GridMap::setGeometry函数。

2 功能包

2.1 grid_map_rviz_plugin

grid_map_rviz_plugin是一个ROS中的插件,用于在ROS可视化工具RViz中显示二维栅格地图。它是grid_map库的一部分,该库是ROS中用于管理和处理2D网格地图的常用库。

使用grid_map_rviz_plugin,用户可以在RViz中可视化网格地图的不同层,例如高程、占用度或其他用户定义的层。此外,该插件还支持在RViz中可视化其他信息,例如机器人传感器读数、路径规划结果等。

使用grid_map_rviz_plugin,用户可以执行以下操作:

  • RViz中添加grid_map_rviz_plugin插件。

  • 将网格地图转换为ROS消息类型,并将其发布到ROS话题中。

  • RViz中选择grid_map_rviz_plugin作为显示类型,并选择要显示的网格地图层。

  • 根据需要调整RViz中的显示参数,例如颜色、透明度等。

使用grid_map_rviz_plugin,用户可以更轻松地理解和分析网格地图数据,从而更好地实现机器人导航、路径规划等应用。同时,由于RViz支持交互式操作,用户还可以通过RViz直接与网格地图进行交互,例如缩放、平移、旋转等操作。

Alt

2.2 grid_map_sdf

grid_map_sdf是一个ROS包中的功能包,用于构建二维栅格地图,并计算该地图中每个栅格的有向距离场(Signed Distance Field,SDF)。以下是对该包的详细解释。

SDF是一种表示几何对象的方法,可以用于计算两个对象之间的距离。对于一个给定的点,SDF可以告诉我们该点离最近的对象表面的距离,以及该点是否在对象内部或外部。这种表示方式被广泛用于机器人导航和避障等应用中。

ROS中,grid_map_sdf包提供了一种使用栅格地图计算SDF的方法。它使用Fast Marching算法来计算每个栅格到最近障碍物的距离,可以有效地处理复杂的环境和障碍物形状。

使用grid_map_sdf包,可以将传感器数据转换为栅格地图,并计算出每个栅格的SDF值。这些值可以用于机器人的导航和避障,以及其他需要几何信息的任务。

请添加图片描述

2.3 grid_map_visualization

grid_map_visualization 是一种将网格地图可视化的方法或工具。网格地图是一种将环境或区域划分为规则网格单元的表示方式,通常用于机器人导航、路径规划、环境建模等应用。

grid_map_visualization节点订阅grid_map_msgs/GridMap类型的主题并发布可在RViz中可视化的消息。可视化工具发布的主题可以使用 YAML 参数文件进行完全配置。可以添加任意数量的具有不同参数的可视化。

2.3.1 订阅的主题

订阅的主题比较明确,就是grid_map_msgs/GridMap类型的栅格图主题,默认为/grid_map

2.3.2 发布的主题

发布的主题通过YAML参数文件进行配置。可能的主题有点云(Point cloud),向量(Vectors),占用网格(Occupancy grid),网格单元(Grid cells)等,这里以grid_map/grid_map_demos/config/tutorial_demo.yaml配置文件为例:

点云向量占用栅格网格单元
Altvectorsoccupancy gridgrid cells
  • point_cloud( sensor_msgs/PointCloud2 )

将网格图显示为点云。使用参数选择要转换为点的图层layer

  name: elevationtype: point_cloudparams:layer: elevationflat: false # optional
  • flat_point_cloud( sensor_msgs/PointCloud2 )

将网格图显示为“平面”点云,即所有点都具有相同高度。在RViz的帮助下,可以方便地可视化RViz中的2D地图或图像(甚至视频流)Color Transformer。该参数height确定平面点云需要的z位置;

  name: flat_gridtype: flat_point_cloudparams:height: 0.0

注意:为了从空/无效单元格中省略平面点云中的点,请指定使用来检查效果的图层setBasicLayers(...)

  • vectors(可视化消息/标记)

将网格地图的矢量数据可视化为视觉标记。使用参数指定保存保护的xyz数量的层layer_prefix,该参数position_layer定义使用矢量起点的图层;

  name: surface_normalstype: vectorsparams:layer_prefix: normal_position_layer: elevationscale: 0.06line_width: 0.005color: 15600153 # red
  • occupancy_grid( nav_msgs/OccupancyGrid)

将网格地图的图层可视化为占用网格。使用参数指定要可视化的图层layer,并使用和指定上限和data_min下限data_max

  name: traversability_gridtype: occupancy_gridparams:layer: traversabilitydata_min: -0.15data_max: 0.15
  • grid_cells( nav_msgs/GridCells)

将网格地图的图层可视化为网格单元。使用参数指定要可视化的图层layer,并使用和指定上限和lower_threshold下限upper_threshold

  name: elevation_cellstype: grid_cellsparams:layer: elevationlower_threshold: -0.08 # optional, default: -infupper_threshold: 0.08 # optional, default: inf
  • region(可视化消息/标记)

显示网格地图的边界;

  name: map_regiontype: map_regionparams:color: 3289650line_width: 0.003

注意:颜色值采用 RGB 形式作为串联(每个通道值 0-255)。以绿色为例(红色:0,绿色:255,蓝色:0

2.4 grid_map_filters

grid_map_filters包包含过滤器,可以将它们评估多个网格地图以对图层中的数据执行计算。网格地图过滤器基于ROS Filters,这意味着过滤器链可以配置为YAML文件。另外,可以通过 ROS 插件机制编写附加过滤器并设置可用,例如来自包的过滤器。InpaintFiltergrid_map_cv

grid_map_filters包中提供了几个基本的过滤器:

  • gridMapFilters/ThresholdFilter

如果condition_layer超过上限或下限阈值(一次仅一个阈值),则将输出层中的值设置指定值;

  name: lower_thresholdtype: gridMapFilters/ThresholdFilterparams:condition_layer: layer_nameoutput_layer: layer_namelower_threshold: 0.0 # alternative: upper_thresholdset_to: 0.0 # # Other uses: .nan, .inf
  • gridMapFilters/MeanInRadiusFilter

计算一个层的每个单元格中半径内的平均值;

  name: mean_in_radiustype: gridMapFilters/MeanInRadiusFilterparams:input_layer: inputoutput_layer: outputradius: 0.06 # in m.
  • gridMapFilters/MedianFillFilter

计算一个层的每个NAN单元的中位数(有限的)贴片内(有限)的中位数。可选地,将中位数计算用于已经有限的值,这些点的补丁半径由现有value_radius给出。请注意,仅当Fill_mask对此有效时才执行填充计算。

  name: mediantype: gridMapFilters/MedianFillFilterparams:input_layer: inputoutput_layer: outputfill_hole_radius: 0.11 # in m. filter_existing_values: false # Default is false. If enabled it also does a median computation for existing values. existing_value_radius: 0.2 # in m. Note that this option only has an effect if filter_existing_values is set true. fill_mask_layer: fill_mask # A layer that is used to compute which areas to fill. If not present in the input it is automatically computed. debug: false # If enabled, the additional debug_infill_mask_layer is published. debug_infill_mask_layer: infill_mask # Layer used to visualize the intermediate, sparse-outlier removed fill mask. Only published if debug is enabled.
  • gridMapFilters/NormalVectorsFilter

计算地图中图层的正常向量;

  name: surface_normalstype: gridMapFilters/NormalVectorsFilterparams:input_layer: inputoutput_layers_prefix: normal_vectors_radius: 0.05normal_vector_positive_axis: z
  • gridMapFilters/NormalColorMapFilter

根据普通向量层计算新的颜色层;

  name: surface_normalstype: gridMapFilters/NormalColorMapFilterparams:input_layers_prefix: normal_vectors_output_layer: normal_color
  • gridMapFilters/MathExpressionFilter

用网格图的层解析并评估数学基质表达式。有关表达式的文档,请参见 EigenLab

  name: math_expressiontype: gridMapFilters/MathExpressionFilterparams:output_layer: outputexpression: acos(normal_vectors_z) # Slope.# expression: abs(elevation - elevation_smooth) # Surface roughness.# expression: 0.5 * (1.0 - (slope / 0.6)) + 0.5 * (1.0 - (roughness / 0.1)) # Weighted and normalized sum.
  • gridMapFilters/SlidingWindowMathExpressionFilter

在网格图层上的滑动窗口中解析并评估数学矩阵表达式。有关表达式的文档,请参见EigenLab

  name: math_expressiontype: gridMapFilters/SlidingWindowMathExpressionFilterparams:input_layer: inputoutput_layer: outputexpression: meanOfFinites(input) # Box blur# expression: sqrt(sumOfFinites(square(input - meanOfFinites(input))) ./ numberOfFinites(input)) # Standard deviation# expression: 'sumOfFinites([0,-1,0;-1,5,-1;0,-1,0].*elevation_inpainted)' # Sharpen with kernel matrixcompute_empty_cells: trueedge_handling: crop # options: inside, crop, empty, meanwindow_size: 5 # in number of cells (optional, default: 3), make sure to make this compatible with the kernel matrix# window_length: 0.05 # instead of window_size, in m
  • gridMapFilters/DuplicationFilter

复制网格图的一层;

  name: duplicatetype: gridMapFilters/DuplicationFilterparams:input_layer: inputoutput_layer: output
  • gridMapFilters/DeletionFilter

从网格图中删除图层;

  name: deletetype: gridMapFilters/DeletionFilterparams:layers: [color, score] # List of layers.

此外,grid_map_cv包还提供以下过滤器:

  • gridMapCv/InpaintFilter

使用 OpenCV 修复/填充图层中的孔。

  name: inpainttype: gridMapCv/InpaintFilterparams:input_layer: inputoutput_layer: outputradius: 0.05 # in m

Reference:

  • https://github.com/anybotics/grid_map



须知少时凌云志,曾许人间第一流。



⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔

相关文章:

grid map学习笔记2之grid map的一些常规定义和功能包说明

文章目录 0 引言1 常规定义1.1 单层grid map1.2 多层grid map1.3 迭代器类别1.4 移动grid map的位置 2 功能包2.1 grid_map_rviz_plugin2.2 grid_map_sdf2.3 grid_map_visualization2.3.1 订阅的主题2.3.2 发布的主题 2.4 grid_map_filters 0 引言 grid map学习笔记1已成功在U…...

Python-文件操作

Python文件操作 1. 打开文件 使用open()函数打开文件,指定文件名和模式,常用模式有: r - 读取(默认)w - 写入(会先截断文件)a - 追加b - 二进制模式t - 文本模式(默认) - updating (reading and writing) f open(data.txt,r) # 打开data.txt文件用于读取2. 读取文件 f.re…...

windows中注册redis服务启动时报1067错误

注册完redis服务,打开计算机 服务时确实有redis服务存在,但是点击启动时却报1067错误,而命令行用redis-server.exe redis.windows.conf 命令却也可以启动 查看6379的端口也没有被占用(netstat -ano | findstr :6379) …...

大数据面试题:HBase的RegionServer宕机以后怎么恢复的?

面试题来源: 《大数据面试题 V4.0》 大数据面试题V3.0,523道题,679页,46w字 可回答:1)HBase一个节点宕机了怎么办;2)HBase故障恢复 参考答案: 1、HBase常见故障 导…...

ansible的脚本——playbook剧本

目录 一、playbook的组成 二、 playbook安装httpd服务 1.编写playbook剧本 2.运行playbook 三、定义、引用变量 四、 指定远程主机sudo切换用户 五、when条件判断 六、迭代 七、Templates 模块 1.先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变…...

【系统监控程序】

用python编写一个系统监控程序,需要每隔一秒钟记录系统每个进程的资源占用和整体的资源占用情况,并输出成json,保存到文本文件。 import psutil import json import timedef get_process_usage():process_list []for proc in psutil.proces…...

计算机论文中名词翻译和解释笔记

看论文中一些英文的简写不知道中文啥意思,或者一个名词不知道啥意思。 于是自己做了一个个人总结。 持续更新 目录 SoftmaxDeep Learning(深度学习)循环神经网络(Recurrent Neural Network简称 RNN)损失函数/代价函数(Loss Function)基于手绘草图的三维模型检索(Ske…...

读书笔记-《ON JAVA 中文版》-摘要20[第十九章 类型信息-1]

文章目录 第十九章 类型信息1. 为什么需要 RTTI2. Class 对象2.1 Class 对象2.2 类字面常量2.3 泛化的 Class 引用 3. 类型转换检测4. 注册工厂5. 类的等价比较6. 反射:运行时类信息7. 自我学习总结 第十九章 类型信息 RTTI(RunTime Type Information&am…...

3、Linux驱动开发:模块_传递参数

目录 🍅点击这里查看所有博文 随着自己工作的进行,接触到的技术栈也越来越多。给我一个很直观的感受就是,某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了,只有经常会用到的东西才有可能真正记…...

基于 ThinkPHP 5.1(稳定版本) 开发wms 进销存系统源码

基于ThinkPHP 5.1(LTS版本)开发的WMS进销存系统源码 管理员账号密码:admin 一、项目简介 这个系统是一个基于ThinkPHP框架的WMS进销存系统。 二、实现功能 控制台 – 权限管理(用户管理、角色管理、节点管理) – 订…...

全面解析 SOCKS5 代理和 HTTP 代理在网络安全与爬虫应用中的技术对比与应用指南

一、SOCKS5 代理和 HTTP 代理的基本原理 SOCKS5 代理:SOCKS5 是一种网络协议,可以在传输层代理 TCP 和 UDP 请求。它不解析请求内容,仅在客户端和代理服务器之间建立连接,并转发数据。SOCKS5 代理支持众多网络协议和端口类型&…...

DevOps系列文章 之 docker 制作kafka镜像

Docker制作Kafka镜像教程 概述 本教程将指导你如何使用Docker制作一个Kafka镜像。Kafka是一个高性能、分布式的消息队列系统,用于处理大规模的实时数据流。使用Docker制作Kafka镜像可以方便地部署和管理Kafka集群。 整体流程 下面是制作Kafka镜像的整体流程&#xf…...

iPhone 安装 iOS 17公测版(Public Beta)

文章目录 步骤1. 备份iPhone资料步骤2. 申请iOS 17 公测Beta 资格步骤3. 下载iOS 16 Beta 公测描述档步骤4. 选择iOS 17 Beta 公测描述档更新项目步骤5. 升级iOS 17 Public Beta 公开测试版 苹果已经开始向大众释出首个iOS 17 公开测试版/ 公测版( iOS 17 Public Beta)&#xf…...

Spingboot yaml 配置文件及数据读取

属性配置在这里插入图片描述 修改服务器端口 → server.port80 修改 banner → spring.main.banner off(关闭)/console(控制台)/log(日志) 日志 → logging.level.rootinfo Common Application Properties 配置文件分类 优先级 如果三种文件共存时,优先级为&am…...

vue中使用axios发送请求时,后端同一个session获取不到值

问题描述: 在登录页面加载完成后通过axios请求后端验证码接口(这时后端会生成一个session用于保存验证码数值),当输入完用户名、密码、验证码后请求登录接口,报错验证码输入错误,打印后端保存验证码的sessi…...

html请求谷歌音频跨域问题(谷歌翻译接口)虚拟机ping不通google(下载谷歌音频、下载百度翻译音频)

文章目录 调用谷歌翻译接口,尝试了几种方案,都提示跨域不行第一种(通过js代码获取音频文件的Blob对象,提示跨域了)代码结果 第二种(尝试新窗打开音频url,404,估计也是跨域了&#xf…...

【设计模式|结构型】享元模式(Flyweight Pattern)

概述 享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在通过共享对象来减少系统中的对象数量,以便在有限的内存中节省空间和提高性能。在享元模式中,对象分为两部分:内部状态(Intrinsic…...

最小覆盖子串(JS)

最小覆盖子串 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量…...

<C语言> 预处理和宏

1.预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义这些预定义符号都是C语言内置的。 举个例子&…...

代驾公司如何进行运营分析

在这个快节奏的社会中,人们的生活节奏也在不断加快,对于代驾服务的需求也日益增长。然而,如何在这个竞争激烈的市场中,让订单稳稳地握在自己的手中,成为了每一个代驾公司都需要深思的问题。那么,代驾公司如…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...