ROS实践(四)机器人建图及导航
一、概念
机器人导航是指机器人在环境中自主地从一个地点移动到另一个地点的过程。这个过程涉及到多个关键技术,包括定位、路径规划、避障等。机器人导航通常包括以下几个重要部分。
1. 定位
定位是机器人确定自己在环境中的位置的过程。常用的定位方法包括:
(1)GPS定位:适用于室外环境,利用卫星信号确定机器人的位置。
(2)里程计(Odometry):根据轮子的转动来估算机器人的位置,但容易受到误差累积的影响。
(3)激光雷达(Lidar)/传感器定位:利用激光扫描仪或其他传感器获取环境数据,进行位置修正。常用的方法有:①粒子滤波(Particle Filter):常用于基于激光雷达的定位。扩展②卡尔曼滤波(EKF):用于融合多个传感器数据。
(4)视觉定位(SLAM):通过相机和其他传感器(如激光雷达)进行同时定位与地图构建。
2. 地图构建
地图构建(Mapping)是机器人在运动过程中逐步建立和更新其所处环境的地图。常见的地图构建方法包括:
(1)SLAM(Simultaneous Localization and Mapping):结合定位和地图构建,是一种实时的在线建图技术。
(2)网格地图(Grid Map):环境划分为一系列的栅格,机器人通过传感器的输入来判断哪些区域是障碍物,哪些是自由的。
3. 路径规划
路径规划是机器人从起点到目标点之间寻找一条最佳路径的过程。路径规划可以分为以下几种:
(1)全局路径规划
全局路径规划是在已知整个环境地图的情况下进行的路径规划。它的目标是找到一条从起点到终点的最优路径,这条路径通常是在不考虑动态障碍物的情况下计算得出的。全局路径规划常用的算法包括:
(1)全局路径规划
A*算法:
A算法是一种启发式搜索算法,它结合了最佳优先搜索的高效性和Dijkstra算法的完备性。A算法使用启发式函数来估计从当前节点到目标节点的代价,从而指导搜索过程。这个启发式函数通常基于欧几里得距离或曼哈顿距离等简单度量。A*算法广泛应用于静态障碍物环境中的路径规划,因为它能够高效地找到最短路径。Dijkstra算法:
Dijkstra算法是一种基于图的路径搜索算法,它适用于所有边的权重为正数的图。该算法从起点开始,逐步扩展最短路径树,直到包含终点。在每一步中,它选择具有最小累积权重的边来扩展树。虽然Dijkstra算法不直接考虑目标节点的启发式信息,但它保证了找到从起点到图中所有其他节点的最短路径。在全局路径规划中,Dijkstra算法可以用于在权重图中找到最短路径,其中权重可能代表距离、时间或其他相关成本。(2)局部路径规划
局部路径规划是在全局路径的基础上,考虑动态障碍物和环境变化进行的路径规划。它的目标是生成一条能够安全避开动态障碍物并沿全局路径前进的局部路径。常见的局部规划方法包括:
动态窗口法(DWA):
动态窗口法是一种基于采样的局部路径规划算法,它考虑了机器人的动力学约束(如速度和加速度限制)。DWA算法在速度空间中采样多个速度组合,并模拟这些速度组合在未来一段时间内的轨迹。然后,它根据这些轨迹的成本函数(通常考虑与障碍物的距离、与全局路径的偏差等因素)来选择最优速度。DWA算法能够实时响应动态环境的变化,并生成平滑且安全的局部路径。虚拟力场(VFH)方法:
虚拟力场方法是一种基于势场的局部路径规划算法。它将环境表示为一个由吸引力和排斥力组成的力场。目标点产生吸引力,而障碍物产生排斥力。机器人根据这些力的合力来决定其运动方向。VFH方法的一个变种是基于当前环境的危险度图来生成避障路径。危险度图根据障碍物的位置、速度和形状等信息来评估环境中每个点的危险程度。机器人然后根据危险度图来选择安全的路径。需要注意的是,局部路径规划算法通常与全局路径规划算法结合使用。全局路径规划提供了一条大致的路径方向,而局部路径规划则负责在这条路径上安全地避开动态障碍物。这种结合使用的方法能够充分利用两种规划算法的优点,从而提高机器人的导航性能和安全性。
二、常用工具和传感器
激光雷达(LiDAR):用于生成环境的高精度地图。
RGBD相机:能够提供深度信息的相机,用于地图构建和障碍物检测。
超声波传感器:常用于短距离的障碍物检测。
IMU(惯性测量单元):用于机器人姿态估计。
轮式里程计(Odometry):通过机器人轮子的转动估算机器人的位置和姿态。
三、相关功能包
1.
导航(robot_navigation
)
robot_navigation是一个基于ROS(Robot Operating System)的导航堆栈,设计用于处理复杂的室内和室外环境。robot_navigation是一个由第三方团队开发并开源的导航堆栈项目。它基于ROS系统构建,提供了全面的导航功能,并支持多种算法和应用场景。
该项目的目的是简化机器人系统的集成,通过提供一套全面的导航工具包,使得开发者可以专注于特定的应用需求而不是基础架构的构建。
下面这些组件虽然都是相对独立的功能包,但它们在ROS的导航堆栈中紧密协作,共同实现机器人的自主导航功能。robot_navigation并不是一个具体的软件包名,而是可能指代整个导航堆栈或相关软件包的集合。在ROS的官方文档和社区中,这些组件通常被归类为导航堆栈的一部分。相关功能包如下:
(1)move_base
- 定义:move_base是ROS导航栈中的核心节点,负责全局路径规划和局部路径规划。
- 功能:它根据目标位置和当前地图信息生成一条从起点到终点的路径。在机器人行进过程中,move_base还会通过避障算法动态调整路径,以确保机器人能够顺利到达目标位置。
- 组件:move_base包括全局规划器、全局代价地图、局部规划器、局部代价地图及恢复行为等组件。
- 交互方式:move_base通过action API与客户端交互,并订阅和发布主题来实现机器人导航功能。
(2)amcl
- 定义:amcl(Adaptive Monte Carlo Localization)是ROS中的一个软件包,提供节点用于在静态地图中对机器人进行定位。
- 功能:该节点通过粒子滤波算法结合激光雷达数据和地图信息,估算机器人在环境中的位置。
- 应用场景:在已知地图中,机器人可以使用amcl进行定位,并根据当前位置进行路径规划。amcl节点高度可配置,可以根据实际需求调整参数。
(3)csotmap_2d
- 定义:costmap_2d是ROS中的一个功能包,用于生成代价地图。
- 功能:代价地图表示环境中每个位置的“成本”,每个区域会根据障碍物的距离、机器人行驶的安全性等因素分配不同的代价。
- 重要性:costmap_2d对于路径规划和避障非常重要,它帮助move_base生成可行路径,并确保机器人在行进过程中能够避开障碍物。
(4)map_server
- 定义:map_server是ROS中的一个功能包,用于加载和保存地图。
- 功能:在启动时,map_server可以加载一个地图(如.pgm格式的地图),并通过ROS话题和服务提供地图数据。
- 命令:使用
rosrun map_server map_server map_file.yaml
命令可以启动map_server节点,其中map_file.yaml
是描述地图的YAML文件。而rosrun map_server map_saver -f map
命令用于保存当前地图数据到文件中。
(5)base_local_planner
- 定义:base_local_planner是ROS中的一个软件包,用于实现局部路径规划。
- 功能:在给定的全局路径基础上,base_local_planner负责计算如何局部避障并规划实际的运动轨迹。
- 实现方式:它提供了一组接口和实现,可以让机器人在给定地图和当前位置的情况下,规划并执行一条安全、平滑的轨迹。
2. gmapping建图功能包
gmapping
是一种基于粒子滤波算法的 SLAM工具,它可以帮助机器人在未知环境中创建地图的同时定位自己。具体来说,
gmapping
是 ROS 中实现激光SLAM的一个软件包,它结合了激光扫描器数据和机器人运动信息,实时生成并更新地图。常用在需要通过激光雷达进行建图的机器人系统中,尤其适用于移动机器人、无人车等场景。
gmapping
包含了完成 SLAM所需的所有核心算法,它会自动利用激光扫描数据和机器人的运动信息来进行地图构建和位置估算。只要你正确配置了相关参数和话题,就可以通过启动gmapping
节点来实现SLAM功能,而不必从头实现复杂的 SLAM 算法。(1)下载
gmapping
并不是 ROS 系统自带的核心组件,而是一个额外的 ROS 软件包。通常在使用 ROS 时,gmapping
需要单独安装并配置。sudo apt-get install ros-<ros_version>-gmapping
其中,<ros_version> 需要替换为你使用的 ROS 版本名称(如 melodic、noetic 等)。
(2)使用
为了使用gmapping功能包,需要配置相应的参数,如激光雷达的topic、里程计信息、地图分辨率等。这些参数通常通过launch文件或命令行参数进行设置。在运行gmapping节点时,它会订阅指定的传感器数据和里程计信息,并输出构建的地图数据。
四、实验
1. SLAM 建图
(1)配置gmapping(launch文件)
功能:下面这段代码的主要功能是启动
gmapping
节点,使用激光雷达和机器人自身的运动数据来进行 SLAM(同步定位与地图构建)。具体来说,它通过激光扫描获取环境信息,并将这些信息转化为地图,同时估算机器人在该地图中的位置。通过 SLAM,机器人可以在没有事先地图的情况下自动探索并创建自己的环境地图。要完成的工作:我们只需要配置好机器人坐标系和激光数据的相关参数。启动
gmapping
节点。让机器人在环境中移动,gmapping
会实时构建地图并定位机器人,它会帮你自动完成 SLAM 的工作。目录: 在功能包的launch目录下编写gmapping_slam.launch文件,如下所示:
<!-- 启动 gmapping 节点进行SLAM建图 --><node pkg="gmapping" type="slam_gmapping" name="gmapping" output="screen"><!-- 设置基本坐标框架 --><param name="base_frame" value="$(arg set_base_frame)"/><!-- 设置里程计坐标框架 --><param name="odom_frame" value="$(arg set_odom_frame)"/><!-- 设置地图坐标框架 --><param name="map_frame" value="$(arg set_map_frame)"/><!-- 设置地图更新的时间间隔(单位:秒) --><param name="map_update_interval" value="2.0"/><!-- 设置最大激光扫描距离 --><param name="maxUrange" value="5.0"/><!-- 设置激光噪声模型的标准差 --><param name="sigma" value="0.05"/><!-- 设置高斯滤波的核大小 --><param name="kernelSize" value="1"/><!-- 设置激光扫描的最小步长 --><param name="lstep" value="0.05"/><!-- 设置角度步长 --><param name="astep" value="0.05"/><!-- 设置迭代次数 --><param name="iterations" value="5"/><!-- 设置局部地图更新时的标准差 --><param name="lsigma" value="0.075"/><!-- 设置扫描增益 --><param name="ogain" value="3.0"/><!-- 设置跳过的局部地图更新数 --><param name="lskip" value="0"/><!-- 设置地图匹配的最低得分 --><param name="minimumScore" value="50"/><!-- 设置机器人运动噪声的标准差 --><param name="srr" value="0.1"/><param name="srt" value="0.2"/><param name="str" value="0.1"/><param name="stt" value="0.2"/><!-- 设置线性和角度更新的阈值 --><param name="linearUpdate" value="1.0"/><param name="angularUpdate" value="0.2"/><!-- 设置时间更新的阈值 --><param name="temporalUpdate" value="0.5"/><!-- 设置重采样的阈值 --><param name="resampleThreshold" value="0.5"/><!-- 设置粒子滤波的粒子数 --><param name="particles" value="100"/><!-- 设置地图边界 --><param name="xmin" value="-10.0"/><param name="ymin" value="-10.0"/><param name="xmax" value="10.0"/><param name="ymax" value="10.0"/><!-- 设置地图分辨率 --><param name="delta" value="0.05"/><!-- 设置激光采样器的范围和步长 --><param name="llsamplerange" value="0.01"/><param name="llsamplestep" value="0.01"/><param name="lasamplerange" value="0.005"/><param name="lasamplestep" value="0.005"/><!-- 将扫描话题重映射为传入的扫描话题名称 --><remap from="scan" to="$(arg scan_topic)"/></node> </launch>
代码中做了以下几件事:
①设置坐标系:定义了机器人、里程计(机器人位置数据)、和地图之间的坐标关系。
②配置 SLAM 参数:包括地图更新频率、激光扫描最大范围、噪声标准差、地图分辨率等。这些参数影响到地图的精度、更新速度以及机器人对环境的感知。
③设置激光传感器的行为:通过设置激光扫描的步长、增益、采样范围等来调整扫描的精度。
④重映射扫描话题:将接收到的激光数据从指定的
scan_topic
输入到slam_gmapping
,用于创建地图。
(2)启动机器人仿真(含机器人以及传感器)
ROS实践(三)xacro文件基础(urdf扩展)第4章节内容。
https://blog.csdn.net/qq_48361010/article/details/146174461?spm=1001.2014.3001.5501详情查看上文。
(3)运行gmapping节点
使用代码:roslaunch my_package gmapping_slam.launch simulation:=true ,这里会发布一个/map的话题,用于后面rviz来订阅这个话题显示地图。
(4)启动rviz可视化工具
使用命令:rviz启动。启动完成后需要添加以下组件。
(5)保存地图文件
启动rviz仿真后,通过:rosrun teleop_twist_keyboard teleop_twist_keyboard.py遥控节点来使得机器人运动去扫描建图。
完成建图以后使用命令:roscd my_package/map/ && rosrun map_server map_saver -f my_map,来保存当前地图为my_map,并保存到map文件夹中。保存后退出所有进程即可。
2. 导航
编写launch文件,如下所示:
<launch><!-- Arguments部分定义了可以在启动文件外部传递的参数,也可以在文件内部设置默认值 --><!-- map_file参数指定了地图文件的路径,这里默认使用my_package包下的map文件夹中的my_map.yaml文件 --><arg name="map_file" default="$(find my_package)/map/my_map.yaml"/><!-- simulation参数用于指示是否在模拟环境中运行,默认为false,表示真实环境 --><arg name="simulation" default="false"/><!-- planner参数指定路径规划算法,默认使用DWA(动态窗口法),另一个选项是TEB(时序弹性带) --><arg name="planner" default="dwa" doc="opt: dwa, teb"/><!-- move_forward_only参数用于限制机器人只能前进,不能后退或旋转,默认为false --><arg name="move_forward_only" default="false"/><!-- use_dijkstra参数指定路径搜索算法,默认为true,表示使用Dijkstra算法,否则可能使用其他算法如A* --><arg name="use_dijkstra" default="true"/><!-- Map server部分启动地图服务器节点,用于加载和提供地图数据 --><node pkg="map_server" name="map_server" type="map_server" args="$(arg map_file)"><!-- frame_id参数指定地图的参考坐标系,这里设置为"map" --><param name="frame_id" value="map"/></node><!-- AMCL部分启动自适应蒙特卡洛定位节点,用于根据传感器数据和地图估计机器人的位置 --><node pkg="amcl" type="amcl" name="amcl" output="screen"><!-- 加载AMCL的参数配置,参数文件路径依赖于环境变量BASE_TYPE的值 --><rosparam file="$(find robot_navigation)/param/$(env BASE_TYPE)/amcl_params.yaml" command="load" /><!-- 初始位置参数,用于设置机器人启动时的估计位置(x, y, theta) --><param name="initial_pose_x" value="0.0"/><param name="initial_pose_y" value="0.0"/><param name="initial_pose_a" value="0.0"/></node><!-- move_base部分通过包含另一个launch文件来启动移动基础节点,该节点负责路径规划和导航控制 --><include file="$(find robot_navigation)/launch/move_base.launch"><!-- 传递之前定义的参数给move_base.launch文件 --><arg name="planner" value="$(arg planner)"/><arg name="simulation" value="$(arg simulation)"/><arg name="move_forward_only" value="$(arg move_forward_only)"/><arg name="use_dijkstra" value="$(arg use_dijkstra)"/></include> </launch>
相关文章:
ROS实践(四)机器人建图及导航
一、概念 机器人导航是指机器人在环境中自主地从一个地点移动到另一个地点的过程。这个过程涉及到多个关键技术,包括定位、路径规划、避障等。机器人导航通常包括以下几个重要部分。 1. 定位 定位是机器人确定自己在环境中的位置的过程。常用的定位方法包括…...
Excel 中如何实现数据透视表?
Excel 中如何实现数据透视表? 数据透视表(PivotTable)是 Excel 中强大的数据分析工具,能够快速汇总、分析和展示大量数据。本文将详细介绍如何在 Excel 中创建和使用数据透视表。 1. 数据透视表的基本概念 数据透视表是一种交互…...
SQLiteStudio:一款免费开源跨平台的SQLite管理工具
目录 1.简介 2.下载与安装 3.实现分析 4.总结 1.简介 SQLiteStudio 是一款专门用于管理 SQLite 数据库的图形化工具,由波兰开发者开发并维护。由于 SQLite 以其轻量级、零配置、嵌入式等特性被广泛应用于各种小型项目、移动应用和桌面应用中,而 SQLi…...
实现Django和Transformers 构建智能客服大模型(模拟订单系统)
一、环境安装准备 #git拉取 bert-base-chinese 文件#创建 虚拟运行环境python -m venv myicrplatenv#刷新source myicrplatenv/bin/activate#python Django 集成nacospip install nacos-sdk-python#安装 Djangopip3 install Django5.1#安装 pymysql settings.py 里面需要 # 强制…...
【沐渥科技】氮气柜日常如何维护?
氮气柜的维护是确保其长期稳定运行、延长使用寿命和保持环境控制精度的关键。以下是沐渥氮气柜的日常维护和定期保养指南: 一、日常维护 柜体清洁 定期用软布擦拭柜体表面和内部,避免灰尘堆积。避免使用腐蚀性清洁剂,防止损伤密封条或传感器。…...
数据安全之策:备份文件的重要性与自动化实践
在信息化高速发展的今天,数据已成为企业运营和个人生活中不可或缺的重要资源。无论是企业的财务报表、客户资料,还是个人的家庭照片、学习笔记,数据的丢失或损坏都可能带来无法挽回的损失。因此,备份文件的重要性日益凸显…...
windows下玩转vllm:vllm简介;Windows下不能直接装vllm;会报错ModuleNotFoundError: No module named ‘vllm._C‘
文章目录 -1. Windows下不能直接装vllm前言ollama vs vllmOllamavLLMvllm简介核心特点PagedAttention内存优化高效推理应用场景安装与使用-1. Windows下不能直接装vllm 我其实很久之前就意识到这个事儿,后来太久没搞就又忘了。 昨天忙活了半宿,得来的确实一个无法解决的报错…...
目录《Vue 3 + TypeScript + DeepSeek 全栈开发实战》
在快速迭代的软件开发世界里,技术的融合与创新始终是推动行业前行的不竭动力。今天,我们站在了前端技术与大数据搜索技术交汇的十字路口,手中的工具不再仅仅是编码的利器,更是解锁未来应用无限可能的钥匙。正是基于这样的时代背景…...
for...of的用法与介绍
一、定义 for...of 是 ES6(ECMAScript 2015)引入的一种用于 遍历可迭代对象(Iterable)的循环语句 二、语法 for (const item of iterable) {// 代码块 }参数: iterable:一个可迭代对象(如数组…...
快速使用PPASR V3版不能语音识别框架
前言 本文章主要介绍如何快速使用PPASR语音识别框架训练和推理,本文将致力于最简单的方式去介绍使用,如果使用更进阶功能,还需要从源码去看文档。仅需三行代码即可实现训练和推理。 源码地址:https://github.com/yeyupiaoling/P…...
Aliyun CTF 2025 web ezoj
文章目录 ezoj ezoj 进来一看是算法题,先做了试试看,gpt写了一个高效代码通过了 通过后没看见啥,根据页面底部提示去/source看到源代码,没啥思路,直接看wp吧,跟算法题没啥关系,关键是去看源码 def audit_checker(even…...
推理模型对SQL理解能力的评测:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet
引言 随着大型语言模型(LLMs)在技术领域的应用日益广泛,评估这些模型在特定技术任务上的能力变得越来越重要。本研究聚焦于四款领先的推理模型——DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet在SQL理解与分析方面的能力,…...
【H2O2 | 软件开发】事件循环机制
目录 前言 开篇语 准备工作 正文 概念 流程 事件队列类型 示例 结束语 前言 开篇语 本系列为短篇,每次讲述少量知识点,无需一次性灌输太多的新知识点。该主题文章主要是围绕前端、全栈开发相关面试常见问题撰写的,希望对诸位有所帮…...
LVTTL(Low Voltage Transistor-Transistor Logic)电平详解
一、LVTTL电平的定义与核心特性 LVTTL(低压晶体管-晶体管逻辑)是传统TTL(5V)的低电压版本,工作电压通常为3.3V,旨在降低功耗并适配现代低电压集成电路,同时保持与TTL的逻辑兼容性。其核心特点如…...
Manus:成为AI Agent领域的标杆
一、引言 官网:Manus 随着人工智能技术的飞速发展,AI Agent(智能体)作为人工智能领域的重要分支,正逐渐从概念走向现实,并在各行各业展现出巨大的应用潜力。在众多AI Agent产品中,Manus以其独…...
批量测试IP和域名联通性
最近需要测试IP和域名的联通性,因数量很多,单个ping占用时间较长。考虑使用Python和Bat解决。考虑到依托的环境,Bat可以在Windows直接运行。所以直接Bat处理。 方法1 echo off for /f %%i in (E:\封禁IP\ipall.txt) do (ping %%i -n 1 &…...
网络安全之tcpdump工具
引言 wireshark是一款非常不错的抓包软件,在图形化界面占绝对统治地位;尽管其在字符界面下有些许选项可供使用,但终究不太方便,下面我再介绍一款NB的终端抓包工具 tcpdump 1、混杂模式 linux的网卡有混杂模式一说,当开…...
TMS320F28P550SJ9学习笔记8:I2C通信的结构体寄存器配置的了解
继续学习IIC通信的寄存器配置方式:尝试使用寄存器方式配置了解I2C a 没条件完整测试IIC功能,具体的修改与测试留在下文,这里只贴出全部代码,就不提供工程了 文章提供测试代码讲解、完整工程下载、测试效果图 目录 IIC通信引脚&a…...
TypeScript类:面向对象编程的基石
一、从现实世界到代码世界 想象你要建造一栋房子,首先需要一张设计蓝图——它定义了房屋的结构(几个房间)、功能(卧室/厨房)和特性(材料/颜色)。在TypeScript中,class就是这个设计蓝…...
C语言学习笔记-进阶(10)自定义类型:结构体
1. 结构体类型的声明 前面我们在学习操作符的时候,已经学习了结构体的知识,这里稍微复习一下。 1.1 结构体回顾 结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1.1 结构体的声明 struct tag {member-…...
Java 大视界 -- Java 大数据在智能家居能源管理与节能优化中的应用(120)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
upload-labs-master通关攻略(9~12)
Pass-9 建立1.php <?php phpinfo();?> 上传时抓包 修改代码 在1.php后面加点号空格点号 放行后得到 Pass-10 将1.php放入 上传时抓包 修改代码 将1.php改为1.pphphp 上传后得到 Pass-11 将1.php改为1.png 上传时抓包 修改代码 ../upload/2.php%00 放行后得到 Pass…...
python语言总结(持续更新)
本文主要是总结各函数,简单的函数不会给予示例,如果在平日遇到一些新类型将会添加 基础知识 输入与输出 print([要输出的内容])输出函数 input([提示内容]如果输入提示内容会在交互界面显示,用以提示用户)输入函数 注释 # 单行注释符&…...
UI自动化测试 —— web端元素获取元素等待实践!
前言 Web UI自动化测试是一种软件测试方法,通过模拟用户行为,自动执行Web界面的各种操作,并验证操作结果是否符合预期,从而提高测试效率和准确性。 目的: 确保Web应用程序的界面在不同环境(如不同浏览器、操作系统)下…...
【CXX】6.6 UniquePtr<T> — std::unique_ptr<T>
std::unique_ptr 的 Rust 绑定称为 UniquePtr。有关 Rust API 的文档,请参见链接。 限制: 目前仅支持 std::unique_ptr<T, std::default_delete>。未来可能会支持自定义删除器。 UniquePtr 不支持 T 为不透明的 Rust 类型。对于在语言边界传递不…...
【网络协议安全】任务10:三层交换机配置
CSDN 原创主页:不羁https://blog.csdn.net/2303_76492156?typeblog三层交换机是指在OSI(开放系统互连)模型中的第三层网络层提供路由功能的交换机。它不仅具备二层交换机的交换功能,还能实现路由功能,提供更为灵活的网…...
C语言每日一练——day_4
引言 针对初学者,每日练习几个题,快速上手C语言。第四天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…...
文件系统调用(上) ─── linux第17课
目录 linux 中man 2和man 3的区别 文件内容介绍 C语言文件接口 示例: 输出信息到显示器,你有哪些方法 总结: 系统文件I/O 文件类的系统调用接口介绍 示例 open 函数具体使用哪个,和具体应用场景相关, write read close lseek ,类比C文件相关接…...
在 Spring Boot 中实现基于 TraceId 的日志链路追踪
1 前言 1.1 什么是 TraceId? TraceId 是一个唯一的标识符,用于跟踪分布式系统中的请求。每个请求从客户端发起到服务端处理,再到可能的多个微服务调用,都会携带这个 TraceId,以便在整个请求链路中进行追踪和调试。 1.2 日志链路追踪的意义 日志链路追踪可以帮助开发者…...
STM32 HAL库 CAN过滤器配置
之前在STM32 f407 CAN收发 基于HAL库和Cubemx配置_stm32f407can收发程序-CSDN博客这篇博文里写了一下配置CAN收发的方法,当时由于并没有使用过滤器的现实需求,所以就也没仔细研究。现在工作中确实需要用到过滤器了,有些项目中控制器和发动机E…...
C++ 控制结构与函数全面解析
引言 在 C 编程中,控制结构和函数是构建程序逻辑的关键要素。控制结构能够决定程序的执行流程,而函数则可以将代码模块化,提高代码的复用性和可维护性。本文将深入介绍 C 中的控制结构和函数的相关知识。 一、控制结构 1. if - else 语句 …...
基于django+pytorch(Faster R-CNN)的钢材缺陷识别系统
一、训练数据来源以及数据标注 数据来源于阿里云天池实验室公开数据集中的铝型材缺陷检测数据集APDDD 数据标注通过labelme进行标注,图片所有标注以转化为矩形标注,存放成json格式。 二、模型训练方式及结果 缺陷识别模型基于Faster R-CNN ResNet5…...
C++多态
多态 多态分为:静态多态(函数重载,运算符重载)和动态多态(派生类、虚函数) 二者区别:静态多态是在地址编译时绑定,而动态多态是在地址运行时绑定 动态多态的特点: 1.有继承关系 2.子类重写父类虚函数(就是跟父类行为函数名称一样,但是是作为子类的行为) 动态多态的…...
【一句话经验】ubuntu vi/vim 模式自动设置为paste
从centos过来,发现ubutun有些地方不习惯,尤其是vi的粘贴,默认自动进去了代码模式,导致每次粘贴必须得set paste,否则会出现问题。 解决办法非常简单,按照下面命令执行即可: cd ~ echo "…...
MongoDB 触发器实现教程
在传统的关系型数据库(如 MySQL)中,触发器是一种强大的工具,它可以在特定的数据库操作(如插入、更新或删除)发生时自动执行一段代码。然而,MongoDB 并没有原生内置的触发器概念。不过࿰…...
ESP8266 NodeMCU 与 Atmega16 微控制器连接以发送电子邮件
NodeMCU ESP8266 AVR 微控制器 ATmega16 的接口 Atmega16 是一款低成本的 8 位微控制器,比以前版本的微控制器具有更多的 GPIO。它具有所有常用的通信协议,如 UART、USART、SPI 和 I2C。由于其广泛的社区支持和简单性,它在机器人、汽车和自动化行业有广泛的应用。 Atmega1…...
《算法笔记》8.1小节——搜索专题->深度优先搜索(DFS)问题 C: 【递归入门】组合+判断素数
题目描述 已知 n 个整数b1,b2,…,bn 以及一个整数 k(k<n)。 从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。 例如当 n4,k=3,4 个整数分别为 3,7,12…...
重生之我在学Vue--第8天 Vue 3 UI 框架(Element Plus)
重生之我在学Vue–第8天 Vue 3 UI 框架(Element Plus) 文章目录 重生之我在学Vue--第8天 Vue 3 UI 框架(Element Plus)前言一、Element Plus 基础:从安装到组件革命1.1 安装与两种引入模式全量引入(适合快速…...
从前端视角理解消息队列:核心问题与实战指南
消息队列(Message Queue)是现代分布式系统的核心组件之一,它在前后端协作、系统解耦、流量削峰等场景中发挥着重要作用。本文从前端开发者视角出发,解析消息队列的关键问题,并结合实际场景给出解决方案。 一、为什么要…...
Mysql配置文件My.cnf(my.ini)配置参数说明
一、my.cnf 配置文件路径:/etc/my.cnf,在调整了该文件内容后,需要重启mysql才可生效。 1、主要参数 basedir path # 使用给定目录作为根目录(安装目录)。 datadir path # 从给定目录读取数据库文件。 pid-file filename # 为mysq…...
Docker 安装成功后,安装 Dify 中文版本的步骤
Docker 安装成功后,安装 Dify 中文版本的步骤如下1: 克隆 Dify 代码仓库:在终端中执行以下命令,将 Dify 源代码克隆至本地环境。 bash git clone https://github.com/langgenius/dify.git进入 Dify 的 docker 目录: b…...
Spring(4)——响应相关
一、返回静态页面 1.1**RestController和Controller** 想返回如下页面: 如果我们依旧使用原来的**RestController** 可以看到的是仅仅返回了字符串。 此时将**RestController改为Controller** 可以看到这次返回的是html页面。 那么**RestController和Controller…...
LPDDR5x电源使用Si电容对PI和PSIJ影响分析
SoC可能包含许多高速接口,其中LPDDR5X目前因为高带宽、低功耗、大容量等性能优势开始逐渐在AI计算、5G通信、视频处理等领域开始使用。LPDDR5X目前的速率高达8.533 GT/s,以及多个为这些接口供电的IO电压轨,而这些IO轨的PDN需要提供低阻抗&…...
[网络爬虫] 动态网页抓取 — Selenium 介绍 环境配置
🌟想系统化学习爬虫技术?看看这个:[数据抓取] Python 网络爬虫 - 学习手册-CSDN博客 0x01:Selenium 工具介绍 Selenium 是一个开源的便携式自动化测试工具。它最初是为网站自动化测试而开发的,类似于我们玩游戏用的按…...
MySQL数据库操作
目录 SQL语句 1、SQL的背景 2、SQL的概念 SQL的分类 SQL的书写规范 MySQL数据库 1、MySQL数据库的编码 (1)utf8和utf8mb4的区别 (2)MySQL的字符集 (3)MySQL默认编码为 latin1 ,如何更改…...
java之uniapp实现门店地图
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、后台实现1. 获取门店的经纬度2.api查询对应的sql 二 、小程序实现 前言 实现查询门店地址的功能,可以按照距离排序。使用技术:java…...
Git基本概念及使用
目录 一、git安装 二、git仓库基本概念 1. 远程仓库(Remote): 2. 本地库(Repository): 3. 分支(Branch): 4.本地库和远程库的关系 三、git仓库的工作流程 四、gi…...
游戏引擎学习第147天
仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾 具体来说,我们通过隐式计算来解决问题,而不是像数字微分分析器那样逐步增加数据。我们已经涵盖了这个部分,并计划继续处理音量问题。不过,实际上我们现在不需要继续处理…...
docker私有仓库配置
基于 harbor 构建docker私有仓库 1、机器准备 os:openEuler 、rockylinux mem:4G disk:100G 2、关闭防火墙、禁用SELinux 3、安装docker和docker-compose yum install docker-ce -y配置加速 vim /etc/docker/d…...
PostgreSQL 18新特性之虚拟生成列
PostgreSQL 12 提供了生成列(GENERATED ALWAYS AS STORED)功能,但是只能支持存储型的生成列,需要占用存储空间,更新成本高。 为此,PostgreSQL 18 即将引入一个新的增强:虚拟生成列。这种类型的…...