ROS2 Nav2 - Smac 规划器
系列文章目录
前言
SmacPlanner 是 Nav2 Planner 服务器的插件。它目前包括 3 个不同的插件:
- SmacPlannerHybrid:高度优化的完全可重新配置的 Hybrid-A* 实现,支持 Dubin 和 Reeds-Shepp 模型(足式、阿克曼和汽车模型)。
- SmacPlannerLattice:高度优化的完全可重新配置的状态网格实现,支持可配置的最小控制集,并为阿克曼、足式、差分和全向模型提供了控制集。
- SmacPlanner2D:高度优化的完全可重新配置的基于网格的 A* 实现,支持 8 个连接的邻域模型。
它还介绍了以下基本构建模块:
- CostmapDownsampler(成本映射下采样器):一个用于接收成本映射对象并将其下采样到另一种分辨率的库。
- AStar: 一个通用且高度优化的 A* 模板库,用于规划插件的搜索。还可使用它提供额外的规划模板。
- CollisionChecker(碰撞检查器) 根据机器人的半径或足迹进行碰撞检查。
- Smoother(平滑器) 简单的路径平滑器,用于平滑 2D、混合-A* 和状态网格路径。
有用户报告在以下设备上使用了该功能
- 快递机器人
- 工业机器人
- 垂直农业
- 太阳能农场
有关其他参数说明,请参阅配置指南页面。
一、简介
nav2_smac_planner 软件包包含一个优化的模板化 A* 搜索算法,用于为多种类型的机器人平台创建多个基于 A* 的规划器。它由 Steve Macenski 在三星研究院工作时创建。我们使用 SmacPlanner2D 规划器支持圆(circular)差分驱动和全向驱动机器人,该规划器实现了成本感知 A* 规划器。我们使用 SmacPlannerHybrid 插件(该插件实现了混合 A* 规划器)支持腿式、车式、类车式和阿克曼式车辆。我们使用 SmacPlannerLattice 插件支持非圆形、任意形状和任何模型的车辆,该插件实现了状态网格规划器。它包含用于阿克曼、腿式、差速驱动和全向车辆的控制集和生成器,但您也可以为其他机器人类型或不同的规划行为提供自己的控制集和生成器。后两个插件对于曲率约束或运动学上可行的规划也很有用,比如在规划高速行驶的机器人时,可以确保它们不会翻转或打滑失控。它还适用于需要基于姿势进行碰撞检查的非圆形机器人(如采用差动/单向传动系统的大型矩形或任意形状机器人)。
SmacPlannerHybrid 实现了《自动驾驶路径规划中的实用搜索技术》中提出的 Hybrid-A* 规划器,并对启发式遍历函数进行了修改,以提高路径质量,而无需昂贵的基于优化的平滑处理。
SmacPlannerLattice 实现了状态网格规划器。虽然我们的实现方式与状态网格中的最优、平滑、非全局性移动机器人运动规划(使用离散状态空间中受限运动规划的近似最小跨度控制集生成)并不完全相同,但两者非常相似,可以作为很好的参考。此外,我们还使用了更多的优化方法来进行逼近分析展开和改进启发式函数,这与 Hybrid-A* 的方法基本一致,以便它们能够共享这些优化实现,从而推动搜索更快地实现目标。
总之...
SmacPlannerHybrid 可与以下机器人配合使用:
- 阿克曼、汽车和类似汽车的机器人
- 高速或曲率受限的机器人(以免在高速行驶时翻转、打滑或倾倒负载)
- 任意形状、非圆形差分或全方向机器人,需要通过 SE2 碰撞检查进行运动学上可行的规划
- 足式机器人
SmacPlannerLattice 可与以下机器人配合使用
- 任意形状、非圆形机器人,要求运动学上可行的规划,并利用动力传动系统的全部功能进行 SE2 碰撞检测
- 可灵活使用其他机器人模型类型或提供非圆形差分、阿克曼和全向支持
SmacPlanner2D 设计用于以下情况
- 圆形、差分或全向机器人
- 相对于环境尺寸较小的机器人(如走廊中的遥控车或会展中心中的大型机器人),可近似使用圆形足迹。
二、特点
我们从以下几个方面对 Hybrid-A* 进行了进一步改进:
- 通过使用 10 倍更小的运动基元进行搜索(与上采样率相同),从而消除上采样的需要。
- 多分辨率搜索,允许在更宽的空间内以更粗的分辨率进行规划(O(N^2)更快)。
- 在搜索中使用成本感知惩罚函数,使规划更加平滑(进一步降低平滑要求)。
- 梯度下降,基本但快速的平滑器
- 通过高度优化模板 A* 算法,规划速度比原始论文更快。
- 通过自定义预计算启发式、运动基元和其他功能实现更快的规划。
- 通过运动模型、代价图分辨率和分仓大小自动调整搜索运动模型大小。
- 如果无法找到精确路径或在无效空间内,可在容差范围内找到最接近的路径。
- 多模型混合搜索,包括 Dubin 和 Reeds-Shepp 模型。还可添加更多模型。
- 高单元和集成测试覆盖率,doxygen 文档。
- 使用现代 C++14 语言功能,单个组件可轻松重用。
- 速度优化:主循环中无数据结构图查找,主循环拷贝近乎为零,动态生成图和基于动态编程的障碍启发式,对同一目标的后续规划请求可选择重新计算启发式等。
- 模板化节点和 A* 实现,支持更多机器人扩展。
- 对每个目标/地图或每次迭代的障碍物启发式进行选择性重新评估,可将后续重新规划的速度提高 20 倍或更多。
SmacPlanner2D 和 SmacPlannerLattice 插件也提供了这些功能中的大部分(多分辨率、模型、平滑器等)。
2D A* 实现也没有 NavFn Planner 中基于梯度波前的 2D A* 实现所引入的任何怪异人工痕迹。虽然这种 2D A* 规划器速度稍慢,但我相信它完全值得路径质量的提高。
注:在之前的版本中,CG 平滑器在很大程度上实现了最初的混合 A* 论文。但是,这个平滑器无法持续提供有用的结果,而且耗费了太多的计算时间,因此已被弃用。虽然在 95% 的时间内平滑路径似乎是个 “不错 ”的解决方案,但在实际应用中,我们需要更可靠的解决方案。由于我们的工作对象是移动机器人,而不是时速 60 英里的自动驾驶汽车,因此我们可以在平滑过程中采取一些不同的自由度,因为我们的本地轨迹规划器非常聪明。如果你正在寻找它,它现在作为成本感知平滑器存在于新的平滑服务器中。这种平滑器已被更简单的优化解决方案所取代,后者速度更快、更一致,也更易于理解。虽然这种平滑器不具有成本意识,但我们在规划器中添加了成本意识惩罚函数,以推动计划远离高成本空间,而且我们还会检查平滑段的有效性,以确保可行性。当路径与环境发生碰撞时,它将终止。不过,如果您想使用这种平滑器,可以在平滑器服务器中使用,不过需要额外的计算时间。
三、指标
最初的 Hybrid-A* 实施方案的规划时间为 50-300 毫秒,规划范围包括 102,400 个单元图和 72 个角度分区。在我们的评估中,我们看到了更快的结果:
- 对 147,456 个(比原来大 1.4 倍)具有 72 个角度分区的单元映射进行规划时,规划时间为 2-20ms。
- 规划 344 128 个(3.3 倍大)72 个角度分区的单元图时,需要 30-200 毫秒。
下面是 3 个规划器规划约 75 米路径的示例。
- 2D A* 在 243 毫秒内计算出路径(面板 1)
- Hybrid-A* 在 144 毫秒内计算出路径(图 2)
- State Lattice 在 113ms 内计算出路径(面板 3)
供参考: NavFn 在 146 毫秒内计算出路径,包括一些令人讨厌的路径不连续性伪影
四、设计
基本设计集中了一个模板化的 A* 实现,用于处理节点图的搜索。该实现由节点 NodeT 模板化,节点 NodeT 包含计算统计量、旅行成本和搜索邻域所需的方法。这样设计的结果就是一个标准的 A* 实现,只要能创建一个节点模板,它就能用于遍历任何类型的图。
目前,我们默认提供 3 个节点。2D 节点模板 (Node2D),可使用 4 或 8 个连接邻域进行 2D 网格搜索。我们还提供了混合 A* 节点模板(NodeHybrid),可在 Dubin 或 Reeds-Shepp 运动模型上进行 SE2(X、Y、θ)搜索和碰撞检查。我们还提供了用于状态网格规划的网格(NodeLattice)节点,可利用差分和全向机器人的更广泛速度选项。其他模板也可以很容易地制作和加入,用于三维网格搜索和非网格基础搜索(如路由)。
在面向 ROS2 的插件中,我们接收了全局目标,并对数据进行了预处理,以便将其输入到所使用的模板 A* 中。这包括处理任何请求,将成本映射缩小到另一种分辨率以加快搜索速度,以及平滑生成的 A* 路径(由于生成的网格取决于成本映射分辨率,因此无法用于状态网格)。对于 SmacPlannerHybrid 和 SmacPlannerLattice 插件,由于在分支搜索中使用了运动学上有效的模型,因此路径在运动学上是可行的。对于差分和全向机器人来说,2D A* 也是可行的。
我们将 A*、costmap 下采样器、平滑器和节点模板对象从 ROS2 中分离出来,使它们可以独立于 ROS 或规划器进行测试。唯一使用 ROS 的地方是规划器插件本身。
五、参数
请参阅 SmacPlanner 中参数的内联说明。其中包括适用于 SmacPlanner2D 和 SmacPlanner 的特定参数的注释。
planner_server:ros__parameters:planner_plugins: ["GridBased"]GridBased:plugin: "nav2_smac_planner::SmacPlannerHybrid"tolerance: 0.5 # tolerance for planning if unable to reach exact pose, in metersdownsample_costmap: false # whether or not to downsample the mapdownsampling_factor: 1 # multiplier for the resolution of the costmap layer (e.g. 2 on a 5cm costmap would be 10cm)allow_unknown: false # allow traveling in unknown spacemax_iterations: 1000000 # maximum total iterations to search for before failing (in case unreachable), set to -1 to disablemax_on_approach_iterations: 1000 # maximum number of iterations to attempt to reach goal once in toleranceterminal_checking_interval: 5000 # number of iterations between checking if the goal has been cancelled or planner timed outmax_planning_time: 3.5 # max time in s for planner to plan, smooth, and upsample. Will scale maximum smoothing and upsampling times based on remaining time after planning.motion_model_for_search: "DUBIN" # For Hybrid Dubin, Redds-Sheppcost_travel_multiplier: 2.0 # For 2D: Cost multiplier to apply to search to steer away from high cost areas. Larger values will place in the center of aisles more exactly (if non-`FREE` cost potential field exists) but take slightly longer to compute. To optimize for speed, a value of 1.0 is reasonable. A reasonable tradeoff value is 2.0. A value of 0.0 effective disables steering away from obstacles and acts like a naive binary search A*.angle_quantization_bins: 64 # For Hybrid nodes: Number of angle bins for search, must be 1 for 2D node (no angle search)analytic_expansion_ratio: 3.5 # For Hybrid/Lattice nodes: The ratio to attempt analytic expansions during search for final approach.analytic_expansion_max_length: 3.0 # For Hybrid/Lattice nodes: The maximum length of the analytic expansion to be considered valid to prevent unsafe shortcutting (in meters). This should be scaled with minimum turning radius and be no less than 4-5x the minimum radiusanalytic_expansion_max_cost: true # For Hybrid/Lattice nodes: The maximum single cost for any part of an analytic expansion to contain and be valid (except when necessary on approach to goal)analytic_expansion_max_cost_override: false # For Hybrid/Lattice nodes: Whether or not to override the maximum cost setting if within critical distance to goal (ie probably required)minimum_turning_radius: 0.40 # For Hybrid/Lattice nodes: minimum turning radius in m of path / vehiclereverse_penalty: 2.1 # For Reeds-Shepp model: penalty to apply if motion is reversing, must be => 1change_penalty: 0.0 # For Hybrid nodes: penalty to apply if motion is changing directions, must be >= 0non_straight_penalty: 1.20 # For Hybrid nodes: penalty to apply if motion is non-straight, must be => 1cost_penalty: 2.0 # For Hybrid nodes: penalty to apply to higher cost areas when adding into the obstacle map dynamic programming distance expansion heuristic. This drives the robot more towards the center of passages. A value between 1.3 - 3.5 is reasonable.retrospective_penalty: 0.025 # For Hybrid/Lattice nodes: penalty to prefer later maneuvers before earlier along the path. Saves search time since earlier nodes are not expanded until it is necessary. Must be >= 0.0 and <= 1.0rotation_penalty: 5.0 # For Lattice node: Penalty to apply only to pure rotate in place commands when using minimum control sets containing rotate in place primitives. This should always be set sufficiently high to weight against this action unless strictly necessary for obstacle avoidance or there may be frequent discontinuities in the plan where it requests the robot to rotate in place to short-cut an otherwise smooth path for marginal path distance savings.lookup_table_size: 20.0 # For Hybrid nodes: Size of the dubin/reeds-sheep distance window to cache, in meters.cache_obstacle_heuristic: True # For Hybrid nodes: Cache the obstacle map dynamic programming distance expansion heuristic between subsiquent replannings of the same goal location. Dramatically speeds up replanning performance (40x) if costmap is largely static. allow_reverse_expansion: False # For Lattice nodes: Whether to expand state lattice graph in forward primitives or reverse as well, will double the branching factor at each step. smooth_path: True # For Lattice/Hybrid nodes: Whether or not to smooth the path, always true for 2D nodes.debug_visualizations: True # For Hybrid/Lattice nodes: Whether to publish expansions on the /expansions topic as an array of poses (the orientation has no meaning) and the path's footprints on the /planned_footprints topic. WARNING: heavy to compute and to display, for debug only as it degrades the performance. smoother:max_iterations: 1000w_smooth: 0.3w_data: 0.2tolerance: 1.0e-10do_refinement: true # Whether to recursively run the smoother 3 times on the results from prior runs to refine the results further
六、话题
Topic | Type |
---|---|
unsmoothed_path | nav_msgs/Path |
七、安装
sudo apt-get install ros-<ros2-distro>-nav2-smac-planner
八、等(重要附注)
8.1 潜在字段
我发现许多用户和默认导航配置文件都忽略了膨胀层的意义。虽然您确实可以简单地在墙壁周围充气一个小半径,但膨胀层的真正价值是在整个地图周围创建一个一致的势场。
一些最受欢迎的导航/导航 2 调整指南甚至特别指出,在应用刻划成本后,在整个地图宽度上创建一个平缓的势场有很大的好处,但很少有用户会这样做。
这种习惯实际上导致 NavFn、Global Planner 和现在的 SmacPlanner 生成的路径有些不理想。它们真正想要寻找的是平滑的潜在区域,而不是开阔的 0 成本空间,以便停留在空间中间,更好地处理近距离移动的障碍物。
因此,我建议在使用此软件包以及 ROS 中所有其他成本感知搜索规划器时,增加膨胀层的成本比例,以便在整个地图上充分生成平滑的势场。对于非常大的开放空间,在中间设置 0 成本区域就可以了,但对于大厅、过道等类似区域,请创建一个平滑的势能,以提供最佳性能。
8.2 混合 A* 和状态网格转弯半径
一个非常合理且合乎逻辑的假设是将最小转弯半径设置为车辆的运动极限。对于阿克曼汽车来说,这是一个物理量;而对于差分或全向机器人来说,则需要考虑机器人能够进行何种转弯。显然,将其设置得非常小(如 20 厘米)意味着您有很多选择,但也可能意味着当您在 2 米多宽的过道上工作时,原始输出方案不会非常平直和顺畅。
我认为,在设置时还应考虑您的工作环境。虽然您绝对不应该将其设置得比您车辆的实际限制还要小,但在实际使用中,增加该值还是有一些有用的副作用的。如果您要在比机器人转弯半径更宽的区域内工作,您可以选择一些选项来最终提高规划器的性能(在 CPU 和计算时间方面),并直接从规划器生成更 “平滑 ”的路径,而不需要任何显式路径平滑。
默认情况下,0.4m 是我认为对于较小规模的工业级机器人(如 Simbe、小型 Fetch 或 Locus 机器人)来说比较 “合理 ”的设置,它能产生更快的计划和更少的 “摇摆 ”运动,无需进行后期平滑处理,从而进一步提高 CPU 性能。我之所以选择 0.4 米,是为了在上述实用机器人与业余爱好者使用的小乌龟机器人-3 之间进行权衡,后者可能仍需要在一些较小的空腔内进行导航。
8.3 成本地图分辨率
我们为 Hybrid-A*、State Lattice 和 2D A* 实现提供了代价图下采样器选项。当在较大空间中规划很长的路径时,这将大有裨益。SE2 规划和 2D 规划中邻域搜索的运动模型与代价图分辨率成正比。通过降低采样率,可以减少实现特定目标所需的扩展次数 N^2。不过,分辨率越低,出现的小障碍物就越大,也就无法超级接近障碍物。这需要进行权衡和测试。我看到的一些数据是,降低 2-3 倍采样率,CPU 规划时间就会减少 2-4 倍。对于长而复杂的路径,我只用了 2 倍的下采样率,就能使规划时间 << 100 毫秒,否则规划时间将高达 400 毫秒。
我建议用户使用 5 厘米分辨率的成本地图,并使用不同的下采样率值,直到达到他们认为的最佳性能(最少的扩展次数与实现精细目标姿势的必要性)。然后,我建议将全局成本映射分辨率改为这个新值。这样你就不需要计算降采样和维护一个没有使用的更高分辨率成本映射。
请记住,全局代价图只是为规划者提供一个工作环境。即使分辨率更高的代价图更 “讨人喜欢”,它也不是用来供人查看的。如果在规划器服务器中使用多个规划器,则应为最需要的规划器使用最高分辨率,然后使用 下采样器将采样率降至 Hybrid-A* 分辨率。
8.4 惩罚函数调整
所有规划器的惩罚函数默认值都是根据 5 厘米成本图调整的。虽然对其进行一些调整不会对默认行为产生很大影响,但还是应该根据具体应用和需求进行调整。默认值的调整是为了在大量平台和分辨率下具有良好的开箱即用性能。在大多数情况下,您应该不需要对它们进行调整。
不过,由于状态网格规划器可以使用任意数量的自定义生成的最小控制集,因此该规划器可能需要进行更多调整才能获得良好的性能。状态网格的默认值是使用本软件包中的 5cm Ackermann 文件作为初始示例生成的。在对 Hybrid-A* 规划器的公式进行修改后,默认的变化惩罚关闭似乎能产生不错的结果,但请根据您的应用需求和运行速度要求进行调整。
调整时,每种惩罚的 “合理 ”范围如下。虽然您显然可以在这些范围之外进行调整,但我发现它们提供了很好的权衡,在这些范围之外的行为很快就会变得不理想。
- Cost(成本):1.7 - 6.0
- Non-Straight(Non-Straight):1.0 - 1.3
- Change(变化): 0.0 - 0.3
- Reverse(反向) 1.3 - 5.0
请注意,变化惩罚必须大于 0.0。非直线、反向和成本惩罚必须严格大于 1.0。
8.5 未找到明确有效的目标或计算时间过长的路径
在讨论以下部分之前,请确保您已适当设置了最大迭代参数。如果你有一个 1 平方公里大小的仓库,5000 次扩展显然是不够的。如果无法实现目标,可以尝试增加该值,或者使用 -1 值禁用该值,看看现在是否能在合理的时间内完成计划。如果您仍有问题,最好注意一下可能出现的次生效应。
在差距或漏洞较小的地图上,您可能会发现在规划某些区域时出现问题。如果空隙小到不可逆转,但又大到通货膨胀无法用膨胀的成本将其关闭,那么建议对地图进行轻微修整或增加通货膨胀,将这些空间从非致命空间中移除。
请看下图,你会发现有人试图在地图上规划出一个 “U ”形区域。第一张图显示了地图上的一个小缺口(来自一次不完美的 SLAM 会话),它几乎可以穿越,但并不完全。从起始位置看,该缺口是通往目标的最短路径,因此启发式方法会尝试将路径引向该方向。然而,在脚印设定的情况下,实际上不可能通过一条运动学上有效的路径。因此,规划器会展开最多 1,000,000 次迭代,试图通过它(红色显示)。如果允许无限次迭代,最终会找到一条有效路径,但可能需要大量时间。
只需增加占地面积(有点麻烦,最好的办法是编辑地图,使该区域无法通行),那么现在该缺口就会被正确地封锁为不可通行区域。在第二张图中,你可以看到启发式方法影响了可导航路线的扩展,并能在不到 10,000 次的迭代(或约 110 毫秒)中找到一条路径。现在很容易了!
因此,如果您的 SLAM 地图比较稀疏,地图上存在缺口或漏洞,建议您轻轻地对其进行后处理,以填补这些缺口或增加足迹的填充或半径,使这些区域无效。如果不这样做,可能会在这条小走廊上浪费扩展空间: A)您不希望您的机器人实际使用这些区域;B)这些区域实际上可能无效,是 SLAM 的伪影;C)如果有更开阔的空间,您更希望机器人使用这些空间。
从第二张图中可以看到一个有趣的现象,那就是在开放空间中出现了一些扩展。这是由于行程/启发式值非常相似,调整惩罚权重值会对其产生相当大的影响。默认设置是大型开放空间和狭窄过道之间的良好中间点(可针对具体环境进行调整,以减少特定地图的扩张数量,从而加快规划器的运行速度)。实际上,搜索区域/环境越是狭窄,规划器的运行速度就越快,但即使是在宽阔的开放区域,规划器的运行速度仍然很快!
有时,可视化扩展对于调试潜在的问题(为什么这个目标需要更长的计算时间,为什么我找不到路径等)非常有用,如果你偶尔遇到问题的话。您可以在 SmacHybrid 的/expansions 主题中使用 debug_visualizations 参数启用扩展的发布: true,但请注意,这只能用于调试,因为它会增加大量的 CPU 占用率。
相关文章:

ROS2 Nav2 - Smac 规划器
系列文章目录 前言 SmacPlanner 是 Nav2 Planner 服务器的插件。它目前包括 3 个不同的插件: SmacPlannerHybrid:高度优化的完全可重新配置的 Hybrid-A* 实现,支持 Dubin 和 Reeds-Shepp 模型(足式、阿克曼和汽车模型)…...

LabVIEW环境中等待FPGA模块初始化完成
这个程序使用的是LabVIEW环境中的FPGA模块和I/O模块初始化功能,主要实现等待FAM(Field-Programmable Gate Array Module,FPGA模块)的初始化完成,并处理初始化过程中的错误。让我们逐步分析各部分的功能: 1.…...

手机TF卡格式化后数据恢复:方法、挑战与预防措施
在现代生活中,手机已经成为我们不可或缺的一部分,而TF卡(即MicroSD卡)作为手机存储的扩展,更是承载了我们大量的重要数据。然而,不慎的格式化操作往往导致数据丢失,给用户带来不…...

ceph对象存储使用的一些思考
导言 我在某司做对象存储约4年时间,作为研发人员,接触过大量的市场项目,对国内市场上对对象存储的使用有一些了解和思考。本文主要是对本人经历的过往对象存储项目中发现的一些问题进行总结。 背景如下: 基于ceph版本进行开发并进…...

单词排序C++实现
代码如下: #include<iostream> #include<string> #include<fstream> #include<map> #include<iomanip> #include<algorithm> #include<vector>int read_file(std::map<std::string,int> &map_words) {std::st…...

828华为云征文 | Flexus X 实例服务器网络性能深度评测
引言 随着互联网应用的快速发展,网络带宽和性能对云服务器的表现至关重要。在不同的云服务平台上,即便配置相同的带宽,实际的网络表现也可能有所差异。因此,了解并测试服务器的网络性能变得尤为重要。本文将以华为云X实例服务器为…...

STL —heap算法源码刨析 make_heap、push_heap、pop_heap、sort_heap操作分析
STL —heap算法源码刨析 heap算法概述push_heap 插入元素pop_heap 取出根节点元素sort_heap 按极值存放元素make_heap 将一段现有数据构造成heap程序测试 heap算法概述 heap的内部是一个完全二叉树,将极值存放在根节点。这个里的极值可分为最大值、最小值。根据极值…...

走进低代码表单开发(一):可视化表单数据源设计
在前文,我们已对勤研低代码平台的报表功能做了详细介绍。接下来,让我们深入探究低代码开发中最为常用的表单设计功能。一个完整的应用是由众多表单组合而成的,所以高效的表单设计在开发过程中起着至关重要的作用。让我们一同了解勤研低代码开…...

简单好用的OCR API
现如今,越来越多的科技产品可以帮助我们改善和提高相应的工作效率。OCR技术的出现,提高了人们的工作效率,其应用领域及其广泛。就拿应用了OCR技术的翔云文档识别服务来说,只需上传文档图片便可自动识别并返回文档中相应的内容。翔…...

c++的拷贝构造函数和赋值函数
拷贝构造函数和赋值函数 什么是拷贝构造 是一种特殊构造函数,如果没有显式的实现,编译器就会自动生成。 class 类名 { public:// 拷贝构造类名(const 类名& that){} }; 什么时候会调用拷贝构造 当使用一个类对象给另一个新的类对象初始化时&…...

什么自动猫砂盆才适合旅游党?4个选购技巧统统告诉你!
有没有能让我们防夹3天不在家都不用担心猫咪铲屎问题的方法?当然有了!自动猫砂盆就是最好的选择,要知道,有个好用合适的自动猫砂盆在家的话,根本不用担心生虫发臭的问题出现,因为自动猫砂盆能及时感应到猫咪…...

算法知识点————双指针【删除重复元素】【反转链表】
删除重复元素 题目://给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数 思路:…...

建造者模式builder
此篇为学习笔记,原文链接 https://refactoringguru.cn/design-patterns/builder 能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象...

IEC103设备数据 转 IEC61850项目案例
目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 配置VFBOX网关采集103设备数是 2 5 用IEC61850协议转发数据 4 6 网关使用多个逻辑设备和逻辑节点的方法 6 7 IEC103协议说明 8 8 案例总结 9 1 案例说明 设置网关采集IEC103设备数据把采集的数据转成IEC61850协议转发…...

438.找到字符串中所有字母异位词
题目 链接:leetcode链接 思路分析(滑动窗口) 很容易想到,这个题目要求我们在字符串s中找到一个定长的窗口让窗口里面出现异位词。 OK,先思考一下怎么快速判断两个字符串是否是异位词? 比较简单的方法是…...

Microsoft SC-100: Microsoft 网络安全架构师
SC-100认证介绍 Microsoft SC-100: Microsoft 网络安全架构师是微软网络安全方向的相关证书, 作为 Microsoft 网络安全架构师,你要将网络安全策略转化为保护组织的资产、业务和运营的功能。 你要设计、指导实现和维护遵循零信任原则和最佳做法的安全性解…...

代码随想录训练营day42|188.买卖股票的最佳时机IV,309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费
188.买卖股票的最佳时机IV 变成了最多可以买卖k只股票 class Solution { public:int maxProfit(int k, vector<int>& prices) {vector<vector<int>> dp(prices.size(),vector<int>(2*k1,0));for(int i1;i<2*k1;i2){dp[0][i]-prices[0];}//初始…...

解决Pynput不能在Ubuntu22.04上正常使用问题
pynput 是一个 Python 库,它提供了一套简单的接口来控制和监控输入设备,包括鼠标和键盘。这个库允许开发者编写跨平台的代码来处理输入事件,无需担心底层操作系统的差异。 下面是pynput的测试程序: from pynput.keyboard import …...

IPV4端口数据有哪些?
关于IPv4的端口数据包括端口号,协议类型,端口状态,扫描时间以及开放时间,这些是常见的实时IPv4端口扫描和分析数据。 IPv4端口号 Ipv4端口号是一个16位的无符号整数,范围从0到65535,这些端口号用于区分运…...

【爱加密_云平台-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...

Open CASCADE学习|按圆离散旋转体
旋转体是一个非常重要的概念,它涉及到三维空间中由二维曲线绕某一轴线旋转形成的立体形状。这种旋转体的形成过程,实际上是一个连续变化的动态过程,但在数学和几何学中,我们往往通过静态的方式来描述和研究它。 旋转体的基本特性…...

无人矿车使用ZMQ消息代理进行跨机互联进行消息收发
目录 背景 前景知识 1.启动一个代理服务器 2.发布者 3.订阅者 实际应用 1.模拟智驾收来自交互箱131的按钮json数据 2.模拟交互箱131收来自智驾137的cjson数据 背景 在调试防爆无轨无人矿车时,出现消息代理不能很好转发,于是在公司通过代理的方式…...

医疗机构关于DIP/DRG信息化建设
推进DIP/DRG支付方式改革是一项系统性工程,牵一发而动全身。作为河北省DIP试点医院,河北医科大学第二医院将信息化与创新性管理理念融合,用好支付工具做好精细化管理,积极应对改革。 ■ 改革背景 国家医疗保障局制定的《DRG/DIP支…...

100个候选人,没一个能讲明白什么是自动化框架?
什么是自动化测试框架 01 什么是框架 框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法。它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间…...

数据结构与算法1: 链表
题目名称: 重排链表 链接: . - 力扣(LeetCode) 介绍:本题的目标是将链表进行重新组合,如下图。 如果按照标准的解法,我们需要实现三步 1. 链表中点的获取 2. 链表的反转 3. 链…...

【专题】2024年8月医药行业报告合集汇总PDF分享(附原数据表)
原文链接:https://tecdat.cn/?p37621 在科技飞速发展的当今时代,医药行业作为关乎人类生命健康的重要领域,正处于前所未有的变革浪潮之中。数智医疗服务的崛起,为医疗模式带来了全新的转变,开启了医疗服务的新时代。…...

这10种人不适合干项目经理,你在其中吗?
在一个项目中,项目经理扮演着至关重要的角色,他们需要协调各种资源、管理团队、制定计划以及应对各种挑战。然而,并非每个人都适合担任项目经理的角色。以下他们天生不适合当项目经理,你会在其中找到自己的类型吗? 1、…...

IT每日英语(三)
系列文章目录 IT每日英语(二) 文章目录 系列文章目录前言1.collie2.century3.farewell4.meme5.hall6.needle7.simulate8.emulate9.arbitray10.laboratory11.jest12.suite13.approach14.satellite15.instance16.representation 前言 这里给出的是本人在…...

【保姆级教程】如何创建一个vitepress项目?
文章目录 安装前的准备工作项目安装创建文件初始化文件安装依赖遇到了 missing peer deps 警告?命令行设置向导 完成 安装前的准备工作 Node.js 18 及以上版本。通过命令行界面 (CLI) 访问 VitePress 的终端。支持 Markdown 语法的编辑器。推荐 VSCode 及其官方 Vu…...

智能头盔语音识别声控芯片,AI离线语音识别ic方案,NRK3301
头盔是交通事故中保护电动车车主安全的最后一道屏障。为了增加骑行用户的安全保护,改善骑行用户的出行体验,让用户从被动使用头盔到主动佩戴头盔,头盔厂家与九芯电子合作,推出了语音智能头盔,它具备首家骑行专用的智能…...