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

自适应蒙特卡洛定位-AMCL

自适应蒙特卡洛定位,简称AMCL,主要提供定位功能并以/tf形式输出

蒙特卡洛算法的基本思想:当所要求的问题是某种事件出现的概率或者是某个变量的期望值时,它们可以通过某种"试验"的方法,得到这种事件出现的概率,并用它们作为问题的解

粒子滤波

粒子滤波就是使用了蒙特卡洛思想的方法。把粒子滤波用在定位上就成为蒙特卡洛定位。其核心思想是通过一组随机采样粒子(即假设的状态)及其权重来近似后验概率分布,并通过重采样避免粒子退化。

粒子滤波实现的蒙特卡洛定位过程如下:

  1. 初始化:生成初始粒子集,表示机器人可能的初始位姿分布,注意一般粒子要均匀分布在环境的自由空间(非障碍物区域)。如果有初始位姿(有先验,比如初始GPS或人工指定位置),则粒子集中在初始位姿附近的高斯分布中。这里,生成的粒子数量作为参数可调,粒子数量 NN 影响计算效率和定位精度
  2. 权重计算:根据传感器观测数据(如激光雷达、深度相机)调整粒子权重,反映其与真实位姿的匹配程度。计算每个粒子的观测似然 p(zt∣xt(i)),即当前传感器数据在该粒子位姿 xt(i)xt(i)​ 下与地图的匹配程度。以雷达为例,对每个激光束,在地图中计算其端点与最近障碍物的距离误差,误差越小权重越高。
  3. 重采样:淘汰低权重粒子,复制高权重粒子,避免粒子退化(即多数粒子权重趋近0)。抛弃旧粒子重新生成相同数量的新粒子,新粒子集中出现在权重大的旧粒子位置上,并且有大量的新粒子叠加在同一个位置。因为所有的新粒子都是重采样得到的,所以它们现在有相同的权重
  4. 状态转移:根据机器人运动模型(如里程计)传播粒子,预测下一时刻的位姿分布。传感器不是绝对精准的,也就是存在误差,测出来的速度和方向是一个范围值,粒子在这些范围内随机取样,导致状态转移后的粒子不完全重叠
  5. 状态转移后再进行权重计算阶段,重复过程234。加权平均或最高权重粒子作为最终位姿。
  6. 不断重复上述过程,会在某一时刻完成定位,即大部分粒子都集中到了小车附近,这时小车移动,蒙特卡洛的粒子集中区域就会跟随移动,实现定位效果

由amcl定位的原理可以得知,刚开始时,粒子均匀撒在整个地图上,真正接近真实位姿的粒子可能很少。 小车还没运动或只运动了一点点,激光雷达/深度相机等传感器数据不足以让权重计算准确区分正确粒子。为了解决这个问题,可以在小车启动后先不运动,保持静止几秒钟,让传感器数据(如激光雷达)反复计算权重,淘汰错误粒子,但是如果环境特征不明显(比如空旷走廊),可能仍然不准。也可以在定位未收敛时,限制小车最大速度,让它缓慢运动,避免剧烈碰撞。

# 在move_base或局部规划器中设置
initial_planner:max_vel_x: 0.1  # 初始最大速度(通常0.5m/s,这里降到0.1)convergence_threshold: 0.8  # 粒子置信度>80%才全速运动

也可以启动时使用更多粒子(如5000→10000),等收敛后再减少。

amcl:initial_particles: 10000  # 初始粒子数after_convergence_particles: 2000  # 收敛后减少到2000

 

当机器人定位基本完成时,即这些粒子都集中在一块了,这个时候重采样的粒子就可以自适应的减少一些 。当遭遇劫持绑架(下面会介绍),即粒子的平均分数(权重)突然降低,在全局重新撒一些粒子来重新找位置。上面所说的自适应调整粒子数量就是自适应解决的问题。

机器人定位分为三大问题:全局定位、位姿跟踪、绑架劫持。

  • 全局定位:机器人刚启动,不清楚初始位置,这时靠粒子滤波等方法以及自身的运动来确定自己在地图中的位姿
  • 位姿跟踪:已知自身的位姿,持续估计自身在地图中的实时位置和朝向
  • 绑架劫持:已知自身的位姿,被人为的放到另一个环境中,这时上一时刻的位姿数据还在,粒子很集中,但是下一时刻计算权重时,发现所有的粒子与测量值不符(所有粒子权重都比较小)。 

官方提供的amcl功能包(包括在navigation中)输入为地图,雷达和小车自身的tf信息,最后以tf转换的形式输出定位信息 

参数 

以下为amcl_omni.launch文件,用于全向移动小车。这些参数取自navigation/amcl/cfg/AMCL.cfg。具体参数含义在最后

<launch><arg name="initial_pose_x" default="$(optenv initial_pose_x 0.0)"/><arg name="initial_pose_y" default="$(optenv initial_pose_y 0.0)"/><arg name="initial_pose_a" default="$(optenv initial_pose_a 0.0)"/>
<node pkg="amcl" type="amcl" name="amcl"><!-- Publish scans from best pose at a max of 10 Hz --><!--<param name="initial_pose_x" value="$(arg initial_pose_x)" />-->  <!-- 根据实际初始位置设置x坐标,单位米 --><!--<param name="initial_pose_y" value="$(arg initial_pose_y)" />-->  <!-- 根据实际初始位置设置y坐标,单位米 --><!--<param name="initial_pose_a" value="$(arg initial_pose_a)" />-->  <!-- 根据实际初始朝向设置角度,单位弧度 --><param name="odom_model_type" value="omni"/><param name="odom_alpha5" value="0.1"/><param name="transform_tolerance" value="0.2" /> <!--0.1--><param name="gui_publish_rate" value="10.0"/><param name="laser_max_beams" value="50"/><param name="use_map_topic" value="false"/>  <!-- //当设置为true时,AMCL将会订阅map话题,而不是调用服务返回地图。也就是说,当设置为true时,有另外一个节点实时的发布map话题,也就是机器人在实时的进行地图构建,并供给amcl话题使用;当设置为false时,通过map server,也就是调用已经构建完成的地图。在navigation 1.4.2中新加入的参数。 --><param name="first_map_only" value="true"/>  <!-- //当设置为true时,AMCL将仅仅使用订阅的第一个地图,而不是每次接收到新的时更新为一个新的地图,在navigation 1.4.2中新加入的参数。 --><param name="min_particles" value="1000"/><param name="max_particles" value="10000"/><param name="kld_err" value="0.03"/><param name="kld_z" value="0.99"/><param name="odom_alpha1" value="0.2"/><param name="odom_alpha2" value="0.2"/><!-- translation std dev, m --><param name="odom_alpha3" value="0.8"/><param name="odom_alpha4" value="0.2"/><param name="laser_z_hit" value="0.5"/><param name="laser_z_short" value="0.05"/><param name="laser_z_max" value="0.05"/><param name="laser_z_rand" value="0.5"/><param name="laser_sigma_hit" value="0.2"/><param name="laser_lambda_short" value="0.1"/><param name="laser_lambda_short" value="0.1"/><!-- <param name="laser_model_type" value="likelihood_field"/> --><param name="laser_model_type" value="beam"/><param name="laser_likelihood_max_dist" value="2.0"/><param name="update_min_d" value="0.15"/> <!--0.2--><param name="update_min_a" value="0.3"/>  <!--0.5--><param name="odom_frame_id" value="odom"/><param name="resample_interval" value="1"/><param name="transform_tolerance" value="0.1"/><param name="recovery_alpha_slow" value="0.0"/><param name="recovery_alpha_fast" value="0.0"/><!-- <param name="odom_frame_id" value="odom"/>   --><!-- //里程计默认使用的坐标系 --><!-- <param name="base_frame_id" value="base_link"/>   --><!-- //用作机器人的基坐标系 --><!-- <param name="global_frame_id" value="map"/>   --><!-- //由定位系统发布的坐标系名称 --><!-- <param name="tf_broadcast" value="false"/>   --><!-- //设置为false阻止amcl发布全局坐标系和里程计坐标系之间的tf变换 -->
</node>
</launch>

amcl_diff.launch用于差速小车。 

<launch>
<node pkg="amcl" type="amcl" name="amcl" output="screen"><!-- Publish scans from best pose at a max of 10 Hz --><param name="odom_model_type" value="diff"/><param name="odom_alpha5" value="0.1"/><param name="transform_tolerance" value="0.2" /><param name="gui_publish_rate" value="10.0"/><param name="laser_max_beams" value="12"/><param name="min_particles" value="1000"/><param name="max_particles" value="10000"/><param name="kld_err" value="0.05"/><param name="kld_z" value="0.99"/><param name="odom_alpha1" value="0.2"/><param name="odom_alpha2" value="0.2"/><!-- translation std dev, m --><param name="odom_alpha3" value="0.8"/><param name="odom_alpha4" value="0.2"/><param name="laser_z_hit" value="0.5"/><param name="laser_z_short" value="0.05"/><param name="laser_z_max" value="0.05"/><param name="laser_z_rand" value="0.5"/><param name="laser_sigma_hit" value="0.2"/><param name="laser_lambda_short" value="0.1"/><param name="laser_lambda_short" value="0.1"/><!-- <param name="laser_model_type" value="likelihood_field"/> --><param name="laser_model_type" value="beam"/><param name="laser_likelihood_max_dist" value="2.0"/><param name="update_min_d" value="0.2"/><param name="update_min_a" value="0.5"/><param name="odom_frame_id"   value="odom"/><param name="resample_interval" value="1"/><param name="transform_tolerance" value="0.1"/><param name="recovery_alpha_slow" value="0.0"/><param name="recovery_alpha_fast" value="0.0"/><!--  <param name="odom_frame_id"   value="odom"/><param name="base_frame_id"   value="base_link"/><param name="global_frame_id" value="map"/><param name="scan_frame_id" value="laser_frame"/> --><!-- <param name="scan_topic" value="scan"/>  <remap from="scan"  to="lidar/scan"/> -->
</node>
</launch>

以下是我导航总的启动文件,可以看到对amcl launch文件的调用 

<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> <!-- 启动AMCL重启控制器 --><!--<node name="restart_amcl" pkg="ucar_nav" type="restart_amcl.py" output="screen"/>--><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>

 

 <--------里程计模型参数-------->
odom_model_type:
含义: 里程计模型类型。对于全向驱动机器人,设置为 omni。
调整建议: 如果机器人是全向驱动的,保持为 omni;如果是差分驱动的,改为 diff。odom_alpha1 到 odom_alpha5:
含义: 这些参数用于调整里程计模型的噪声。具体含义如下:
odom_alpha1: 旋转噪声(由于旋转引起的平移噪声)。
odom_alpha2: 平移噪声(由于平移引起的旋转噪声)。
odom_alpha3: 平移噪声(由于平移引起的平移噪声)。
odom_alpha4: 旋转噪声(由于旋转引起的旋转噪声)。
odom_alpha5: 旋转噪声(由于平移引起的旋转噪声)。
调整建议: 如果机器人的里程计噪声较大,可以适当增加这些值;如果噪声较小,可以减少这些值。<--------粒子滤波器参数-------->
min_particles:
含义: 粒子滤波器的最小粒子数量。
调整建议: 增加粒子数量可以提高定位精度,但会增加计算负载。默认值 1000 通常足够。
max_particles:
含义: 粒子滤波器的最大粒子数量。
调整建议: 增加粒子数量可以提高定位精度,但会增加计算负载。默认值 10000 通常足够。
kld_err:
含义: KLD(Kullback-Leibler Divergence)误差的上限,用于动态调整粒子数量。
调整建议: 减小该值会增加粒子数量,提高定位精度,但会增加计算负载。默认值 0.05 通常足够。
kld_z:
含义: KLD 的置信度参数。
调整建议: 增加该值会增加粒子数量。默认值 0.99 通常足够。<--------激光雷达参数-------->
laser_max_beams:
含义: 用于定位的激光雷达光束的最大数量。
调整建议: 增加该值可以提高定位精度,但会增加计算负载。默认值 50 通常足够。
laser_model_type:
含义: 激光雷达模型类型。beam 表示使用光束模型,likelihood_field 表示使用似然场模型。
调整建议: likelihood_field 模型通常更精确,但计算量更大。如果激光雷达数据质量较高,可以尝试使用 likelihood_field。
laser_z_hit:
含义: 激光雷达命中模型的权重。
调整建议: 增加该值可以提高对激光雷达命中数据的信任度。默认值 0.5 通常足够。
laser_z_short:
含义: 激光雷达短距离模型的权重。
调整建议: 增加该值可以提高对短距离数据的信任度。默认值 0.05 通常足够。
laser_z_max:
含义: 激光雷达最大距离模型的权重。
调整建议: 增加该值可以提高对最大距离数据的信任度。默认值 0.05 通常足够。
laser_z_rand:
含义: 激光雷达随机噪声模型的权重。
调整建议: 增加该值可以提高对随机噪声的容忍度。默认值 0.5 通常足够。
laser_sigma_hit:
含义: 激光雷达命中模型的标准差。
调整建议: 增加该值可以放宽对激光雷达数据的精度要求。默认值 0.2 通常足够。
laser_lambda_short:
含义: 激光雷达短距离模型的衰减系数。
调整建议: 增加该值可以提高对短距离数据的信任度。默认值 0.1 通常足够。
laser_likelihood_max_dist:
含义: 激光雷达似然场模型的最大距离。
调整建议: 增加该值可以扩大似然场的范围。默认值 2.0 通常足够。<--------更新参数-------->
update_min_d:
含义: 触发定位更新的最小平移距离(米)。当机器人移动的距离超过 update_min_d 时,amcl 会触发一次定位更新。
调整建议: 减小该值可以提高定位频率,但会增加计算负载。默认值 0.2 通常足够。
update_min_a:
含义: 触发定位更新的最小旋转角度(弧度)。当机器人旋转的角度超过 update_min_a(弧度) 时,amcl 会触发一次定位更新。
调整建议: 减小该值可以提高定位频率,但会增加计算负载。默认值 0.5 通常足够<--------其他参数-------->
transform_tolerance:
含义: 坐标系变换的容忍时间(秒)。它定义了在查询坐标变换时,允许的最大时间偏差。如果坐标变换的时间戳与当前时间的偏差超过 transform_tolerance,系统会认为该变换无效。
调整建议: 增加该值可以容忍更大的时间偏差。默认值 0.1 通常足够。
resample_interval:
含义: 重采样间隔(更新次数)。用于控制 粒子滤波器的重采样频率。它的作用是决定 AMCL 在多少次更新后才对粒子进行重采样。合理设置 resample_interval 可以提高定位的精度和效率。
调整建议: 增加该值可以减少重采样频率,降低计算负载。resample_interval 设置为 1,则每次更新后都会进行重采样。
recovery_alpha_slow 和 recovery_alpha_fast:
含义: 用于恢复行为的慢速和快速衰减系数。它们的作用是控制 AMCL 在定位失败或丢失时如何调整粒子滤波器的分布,以尝试重新定位机器人。
recovery_alpha_slow控制 AMCL 在定位失败时,缓慢增加粒子分布的随机性。这个过程较慢,适合在定位失败初期使用。取值范围:0.0 到 1.0。
recovery_alpha_fast控制 AMCL 在定位失败时,快速增加粒子分布的随机性。当机器人定位失败较严重时,AMCL 会快速增加粒子的随机性,以尝试快速覆盖更大的区域。这个过程较快,适合在定位失败较严重时使用。
recovery_alpha_slow适用场景:定位失败较轻(例如机器人位置稍有偏差)。环境变化较小(例如机器人移动到一个已知区域但定位稍有偏差)。不会显著改变粒子分布,避免过度随机化导致定位结果不稳定。
recovery_alpha_fast适用场景:定位失败较严重(例如机器人完全丢失定位)。环境变化较大(例如机器人被移动到未知区域)。快速覆盖更大的区域,增加重新定位的可能性。
调整建议: 默认情况下,recovery_alpha_slow 和 recovery_alpha_fast 都设置为 0.0,即禁用恢复行为。这是因为恢复行为可能会引入额外的计算开销,且在某些场景下并不需要。

 

相关文章:

自适应蒙特卡洛定位-AMCL

自适应蒙特卡洛定位&#xff0c;简称AMCL&#xff0c;主要提供定位功能并以/tf形式输出 蒙特卡洛算法的基本思想&#xff1a;当所要求的问题是某种事件出现的概率或者是某个变量的期望值时&#xff0c;它们可以通过某种"试验"的方法&#xff0c;得到这种事件出现的概…...

用python清除PDF文件中的水印(Adobe Acrobat 无法删除)

学校老师发的资料&#xff0c;有时候会带水印&#xff0c;有点强迫症的都想给它去掉。用Adobe Acrobat试了下&#xff0c;检测不到水印&#xff0c;无法删除&#xff01;分析发现原来这类PDF文件是用word编辑的&#xff0c;其中的水印是加在了页眉中&#xff01; 自己动手想办法…...

bootstrap自助(抽样)法

一&#xff0c;概念 一言以蔽之&#xff1a;从训练集中有放回的均匀抽样——》本质就是有放回抽样&#xff1b; 自助法&#xff08;bootstrap&#xff09;是一种通过从数据集中重复抽样来估计统计量分布的非参数方法。它可用于构建假设检验&#xff0c;当对参数模型的假设存在…...

综合实验二之删除/boot目录,进行系统修复

实验三、删除/boot目录&#xff0c;进行系统修复 在 Linux 系统中&#xff0c;/boot 目录是一个至关重要的系统目录&#xff0c;主要用于存放系统启动时所需的核心文件和配置信息。 /boot 目录的主要作用&#xff1a; 存放内核文件&#xff08;Kernel&#xff09; vmlinuz&…...

postgresql主从集群一键搭建脚本分享

脚本1&#xff1a; cat pg_ms_install.sh #!/bin/bash # 基础环境配置&#xff08;保持不变&#xff09; setenforce 0 >/dev/null 2>&1 || true sed -i "s/SELINUXenforcing/SELINUXdisabled/" /etc/selinux/config systemctl stop firewalld >/dev/n…...

融合一致性与差异性约束的光场深度估计

摘要&#xff1a;光场图像深度估计是光场三维重建、目标检测、跟踪等应用中十分关键的技术。虽然光场图像的重聚焦特性为深度估计提供了非常有用的信息&#xff0c;但是在处理遮挡区域、边缘区域、噪声干扰等情况时&#xff0c;光场图像深度估计仍然存在很大的挑战。因此&#…...

转运机器人可以绕障吗?

在工业物流场景中&#xff0c;障碍物动态分布、路径突发拥堵是常态。传统AGV依赖固定轨道或磁条&#xff0c;面对复杂环境时往往“束手无策”。转运机器人可以绕障吗&#xff1f;富唯智能用技术创新给出答案——搭载激光SLAM导航与多传感器融合技术&#xff0c;其转运机器人不仅…...

【Web前端开发】CSS基础

2.CSS 2.1CSS概念 CSS是一组样式设置的规则&#xff0c;称为层叠样式表&#xff0c;用于控制页面的外观样式。 使用CSS能够对网页中元素位置的排版进行像素控制&#xff0c;实现美化页面的效果&#xff0c;也能够做到页面的样式和结构分离。 2.2基本语法 通常都是&#xff…...

【物流开单专用软件】佳易王物流管理系统:常见的物流信息系统以及软件程序实操教程 #物流软件定制#物流软件开发#物流软件推荐

一、概述 软件试用版资源文件下载方法&#xff1a; 【进入头像主页第一篇文章最后 卡片按钮 可点击了解详细资料 或左上角本博客主页 右侧按钮了解具体资料信息】 本实例以 佳易王物流管理系统 为例说明&#xff0c;其他版本可参考本实例。试用版软件资源可到文章最…...

力扣-94.二叉树的中序遍历

题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 class Solution { public:void inorder(TreeNode* root, vector<int>& res){//C这里&一定要加if(!root)return;inorder(root->left,res);res.push_back(root->val);inorder(ro…...

对基于再生龙制作的Linux系统的硬盘进行扩容

背景 公司一个仪器产品是基于x86核心板开发的&#xff0c;因此制作系统镜像时用的再生龙软件&#xff0c;好处是制作的系统镜像比ARM平台那种raw image小很多&#xff0c;缺点是操作有点麻烦。 最近客户反馈512GB的SSD硬盘容量不够&#xff0c;因此公司决定升级成1TB的&#x…...

Spring Boot 注解详细解析:解锁高效开发的密钥

一、引言 Spring Boot 以其快速开发、自动配置等特性&#xff0c;成为构建 Java 应用程序的热门框架。而注解在 Spring Boot 中扮演着至关重要的角色&#xff0c;它们如同魔法指令&#xff0c;简化了配置流程&#xff0c;增强了代码的可读性与可维护性。本文将深入剖析 Spring…...

【速写】KV-cache与解码的再探讨(以束搜索实现为例)

文章目录 1 Beam Search 解码算法实现2 实现带KV Cache的Beam Search解码3 关于在带kv-cache的情况下的use_cache参数 1 Beam Search 解码算法实现 下面是一个使用PyTorch实现的beam search解码算法&#xff1a; 几个小细节&#xff1a; 束搜索可以加入length_penalty&#…...

ElasticSearch聚合操作案例

1、根据color分组统计销售数量 只执行聚合分组&#xff0c;不做复杂的聚合统计。在ES中最基础的聚合为terms&#xff0c;相当于 SQL中的count。 在ES中默认为分组数据做排序&#xff0c;使用的是doc_count数据执行降序排列。可以使用 _key元数据&#xff0c;根据分组后的字段数…...

微信小程序单双周选择排序有效果图

效果图 .wxml <view class"group-box"><label class"radio" wx:for"{{[单周,双周,全选]}}" wx:key"index" bind:tap"radioChange"data-index"{{index}}"><radio checked"{{index zcTem.ind…...

保持Word中插入图片的清晰度

大家有没有遇到这个问题&#xff0c;原本绘制的高清晰度图片&#xff0c;插入word后就变模糊了。先说原因&#xff0c;word默认启动了自动压缩图片功能&#xff0c;分享一下如何关闭这项功能&#xff0c;保持Word中插入图片的清晰度。 ①在Word文档中&#xff0c;点击左上角的…...

Matlab 基于GUI的汽车巡航模糊pid控制

1、内容简介 Matlab 225-基于GUI的汽车巡航模糊pid控制 可以交流、咨询、答疑 2、内容说明 略 依据比例—积分—微分控制的基本原理&#xff0c;我们利用MATLAB软件中SMULINK建立一个简单的PID控制器模型&#xff0c;利用这个模型在模糊控制过程中对PID控制参数进行在线的实时…...

(网络)应用层协议-HTTPS

1.HTTPS是什么&#xff1f; HTTPS是应用层的一种协议&#xff0c;是在HTTP的基础上进行了加密层的处理。 HTTP协议的内容都是按照文本的形式进行传输的&#xff0c;所以呢就很容易被别人知道传输的是什么。 我们在了解了TCP/IP之后是知道我们的数据在传输的过程中是通过路由器进…...

Browserless 快速上手

要将你提供的 HTML 模板和数据结构转换为可以用于 Browserless /pdf 接口的 JSON 请求体&#xff08;且能正确渲染为 PDF&#xff09;&#xff0c;需要满足以下几点&#xff1a; ✅ 最终目标格式&#xff08;这是能用的格式&#xff09;&#xff1a; json 复制编辑 { "h…...

JWT的介绍与在Fastapi框架中的应用

什么是JWT JWT (JSON Web Token) 是一个开放标准 ( RFC 7519 )&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于在各方之间安全地以 JSON 对象的形式传输信息。由于这些信息经过数字签名&#xff0c;因此可以被验证和信任。JWT 可以使用密钥&#xff08;采用HMAC算…...

Html5新特性_js 给元素自定义属性_json 详解_浅克隆与深克隆

文章目录 1. html5新特性2.用 js 给元素自定义属性3.json3.1 json与普通对象的区别3.2 json对象与 js对象的转化 4.浅克隆和深克隆 1. html5新特性 html5中引入了新的特性&#xff08;新的标签&#xff09;&#xff0c;下面的新标签是新的结构标签&#xff0c;不过不太常用 h…...

一般纯软工程学习路径

基础 阶段一&#xff1a;基本熟悉工具链代码托管流程和配置 代码托管基本 1. 成见和管理代码库&#xff08;组&#xff09; 2. 成员配置和权限配置 代码迁移 1. 手工迁移 2. 脚本自动化迁移 代码提交 1. SSH key配置 2. 代码提交commit message 管理需求单 MR合并请求 1. 合并请…...

ES6基础特性

1.定时器 ——延时定时器 setTimeout&#xff08;function&#xff08;&#xff09;>{ },2000&#xff09; ——间隔执行定时器 setInterval&#xff08;function&#xff08;&#xff09;>{ },2000&#xff09; *定时器方法都返回唯一标识编号id&…...

SSTI记录

SSTI(Server-Side Template Injection&#xff0c;服务器段模板注入) 当前使用的一些框架&#xff0c;如python的flask、php的tp、java的spring&#xff0c;都采用成熟的MVC模式&#xff0c;用户的输入会先进入到Controller控制器&#xff0c;然后根据请求的类型和请求的指令发…...

Go语言爬虫系列教程(一) 爬虫基础入门

Go爬虫基础入门 1. 网络爬虫概念介绍 1.1 什么是网络爬虫 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称网页蜘蛛、网络机器人&#xff0c;是一种按照一定规则自动抓取互联网信息的程序或脚本。其核心功能是模拟人类浏览网页的行为&#xff0c;通过发送网络…...

c/c++爬虫总结

GitHub 开源 C/C 网页爬虫探究&#xff1a;协议、实现与测试 网页爬虫&#xff0c;作为一种自动化获取网络信息的强大工具&#xff0c;在搜索引擎、数据挖掘、市场分析等领域扮演着至关重要的角色。对于希望深入理解网络工作原理和数据提取技术的 C/C 开发者&#xff0c;尤其是…...

【HarmonyOS 5】鸿蒙碰一碰分享功能开发指南

【HarmonyOS 5】鸿蒙碰一碰分享功能开发指南 一、前言 碰一碰分享的定义 在 HarmonyOS NEXT 系统中&#xff0c;华为分享推出的碰一碰分享功能&#xff0c;为用户带来了便捷高效的跨端分享体验。开发者通过简单的代码实现&#xff0c;就能调用系统 API 拉起分享卡片模板&…...

vue H5解决安卓手机软键盘弹出,页面高度被顶起

开发中安卓机上遇到的软键盘弹出导致布局问题 直接上代码_ 在这里插入代码片 <div class"container"><div class"appContainer" :style"{height:isKeyboardOpen? Heights :inherit}"><p class"name"><!-- 绑定…...

【pypi镜像源】使用devpi实现python镜像源代理(缓存加速,私有仓库,版本控制)

【pypi镜像源】使用devpi实现python镜像源代理&#xff08;缓存加速&#xff0c;私有仓库&#xff0c;版本控制&#xff09; 文章目录 1、背景与目标2、devpi-server 服务端搭建3、devpi 镜像源使用 1、背景与目标 背景1&#xff08;访问速度优化&#xff09;&#xff1a; 直…...

Spring Bean有哪几种配置方式?

大家好&#xff0c;我是锋哥。今天分享关于【Spring Bean有哪几种配置方式&#xff1f;】面试题。希望对大家有帮助&#xff1b; Spring Bean有哪几种配置方式&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Bean的配置方式主要有三种&#xff…...

无人机信号线被电磁干扰导致停机

问题描述&#xff1a; 无人机飞控和电调之间使用PWM信号控制时候&#xff0c;无人机可以正常起飞&#xff0c;但是在空中悬停的时候会出现某一个电机停机&#xff0c;经排查电调没有启动过流过压等保护&#xff0c;定位到电调和飞控之间的信号线被干扰问题。 信号线被干扰&am…...

RWA开发全解析:技术架构、合规路径与未来趋势

RWA开发全解析&#xff1a;技术架构、合规路径与未来趋势 ——2025年真实世界资产代币化的创新逻辑与实践指南 一、RWA的核心定义与爆发逻辑 1. 什么是RWA&#xff1f; RWA&#xff08;Real World Asset Tokenization&#xff09;是通过区块链技术将现实资产&#xff08;房地…...

消息队列作用及RocketMQ详解(1)

目录 1 什么是消息队列 2 为什么要使用消息队列 2.1 异步处理 2.2 解耦 2.3 削峰填谷 3. 如何选择消息队列&#xff1f; 4. RocketMQ 4.1 生产者 4.2 消费者 4.3 主题 4.4 NameSever 4.5 Broker 5. 生产者发送消息 5.1 普通消息发送 5.1.1 同步发送 5.1.2 异步发送 5…...

DICOM 网络服务实现:医学影像传输与管理的技术实践

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...

恰到好处TDR

了解我的人都知道我喜欢那些从 1 到 10 到 11 的东西。对于那里的年轻人&#xff0c;参见 Spinal Tap&#xff0c;1984 年。但是有没有把它调得太高这样的事情呢&#xff1f;我收到并回答了很多关于使用时域反射仪 &#xff08;TDR&#xff09; 进行测量的问题。 我需要多少带宽…...

kubernetes服务自动伸缩-VPA

实验环境 安装好k8s集群 一、准备工作 1、部署Metrics Server VPA 依赖 Metrics Server 来获取 Pod 的资源使用数据。首先需要部署 Metrics Server 下载地址&#xff08;需要连接VPN&#xff09;&#xff1a;wget https://github.com/kubernetes-sigs/metrics-server/relea…...

stm32之BKP备份寄存器和RTC时钟

目录 1.时间戳1.1 Unix时间戳1.2 UTC/GMT1.3 时间戳转换**1.** time_t time(time_t*)**2.** struct tm* gmtime(const time_t*)**3.** struct tm* localtime(const time_t*)**4.** time_t mktime(struct tm*)**5.** char* ctime(const time_t*)**6.** char* asctime(const stru…...

OSCP - Hack The Box - Sau

主要知识点 CVE-2023-27163漏洞利用systemd提权 具体步骤 执行nmap扫描&#xff0c;可以先看一下55555端口 Nmap scan report for 10.10.11.224 Host is up (0.58s latency). Not shown: 65531 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp o…...

C++色彩博弈的史诗:红黑树

文章目录 1.红黑树的概念2.红黑树的结构3.红黑树的插入4.红黑树的删除5.红黑树与AVL树的比较6.红黑树的验证希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 红黑树是一种自平衡二叉查找树&#xff0c;每个节点都带有颜色属性&#xff0c;颜色或为…...

14.three官方示例+编辑器+AI快速学习webgl_buffergeometry_instancing_interleaved

本实例主要讲解内容 这个Three.js示例展示了如何结合使用索引几何体、GPU实例化和交错缓冲区来高效渲染大量相同模型的不同实例。通过这种技术组合&#xff0c;我们可以在保持较低内存占用的同时渲染数千个独立变换的对象。 核心技术包括&#xff1a; 索引几何体的实例化渲染…...

「华为」人形机器人赛道投资首秀!

温馨提示&#xff1a;运营团队2025年最新原创报告&#xff08;共210页&#xff09; —— 正文&#xff1a; 近日&#xff0c;【华为】完成具身智能赛道投资首秀&#xff0c;继续加码人形机器人赛道布局。 2025年3月31日&#xff0c;具身智能机器人头部创企【千寻智能&#x…...

GitHub 趋势日报 (2025年05月11日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1harry0703/MoneyPrinterTurbo利用ai大模型&#xff0c;一键生成高清短视频使用…...

MySQL查询优化100条军规

概述 以下是MySQL查询优化的关键军规&#xff0c;分为不同类别&#xff0c;帮助您系统化提升数据库性能资料已经分类整理好&#xff0c;喜欢的朋友自取&#xff1a;https://pan.quark.cn/s/f52968c518d3 一、索引优化 为WHERE、JOIN、ORDER BY字段建索引联合索引遵循最左前缀…...

WEBSTORM前端 —— 第3章:移动 Web —— 第1节:平面转换、渐变

目录 一.平面转换 二.平面转换 – 平移 ①属性 ②取值 ③技巧 三.平移实现居中效果 四.案例——双开门效果 五.平面转换 – 旋转 ①属性 ②技巧 六.平面转换 – 改变转换原点 ①属性 ②取值 七.案例-时钟 八.平面转换 – 多重转换 九.平面转换 – 缩放 ①属性 …...

1.10-数据传输格式

1.10-数据传输格式 在对网站进行渗透测试时&#xff0c;使用目标服务器规定的数据传输格式来进行 payload 测试非常关键 如果不按规定格式发送数据&#xff0c;服务器可能直接拒绝请求或返回错误响应&#xff0c;比如&#xff1a; 接口要求 JSON 格式&#xff0c;而你用的是…...

Python制作Dashboard【待续】

运行环境&#xff1a;jupyter notebook (python 3.12.7)...

物理:海市蜃楼是宇宙背景辐射吗?

宇宙背景辐射(特别是宇宙微波背景辐射,CMB)与海市蜃楼是两种完全不同的现象,它们的物理机制、来源和科学意义截然不同。以下是详细的解释: 1. 宇宙微波背景辐射(CMB)的本质 起源:CMB是大爆炸理论的关键证据之一。它形成于宇宙诞生后约38万年(即“最后散射时期”),当…...

联想 SR550 服务器,配置 RAID 5教程!

今天的任务&#xff0c;是帮客户的一台联想Lenovo thinksystem x SR550 服务器&#xff0c;配置RAID 5&#xff0c;并安装windows server 2019操作系统。那么依然是按照我的个人传统&#xff0c;顺便做一个教程&#xff0c;分享给有需要的粉丝们。 第一步&#xff0c;服务器开机…...

Docker-配置私有仓库(Harbor)

配置私有仓库&#xff08;Harbor&#xff09; 一、环境准备安装 Docker 三、安装docker-compose四、准备Harbor五、配置证书六、部署配置Harbor七、配置启动服务八、定制本地仓库九、测试本地仓库 Harbor(港湾)&#xff0c;是一个用于 存储 和 分发 Docker 镜像的企业级 Regi…...

1.5 连续性与导数

一、连续性的底层逻辑&#xff08;前因&#xff09; 为什么需要研究连续性&#xff1f; 数学家在研究函数图像时发现两类现象&#xff1a;有些函数能用一笔画完不断开&#xff08;如抛物线&#xff09;&#xff0c;有些则会出现"断崖"“跳跃"或"无底洞”&a…...