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

Mujoco 学习系列(二)基础功能与xml使用

这篇文章是 Mujoco 学习系列第二篇,主要介绍一些基础功能与 xmI 使用,重点在于如何编写与读懂 xml 文件。

运行这篇博客前请先确保正确安装 Mujoco 并通过了基本功能与GUI的验证,即至少完整下面这个博客的 第二章节 内容:

  • Mujoco 学习系列(一)安装与部署

1. 启动仿真器

在第一篇博客中已经介绍了如何通过命令启动仿真器,但实际上mujoco提供了很多种方式启动,不同启动方式在后面的工作中会有不同的作用。

1.1 python 命令行启动

  • 只启动仿真器,不加载模型
(mojoco) $ python -m mujoco.viewer

在这里插入图片描述

  • 启动仿真器,同时加载模型(这里加载自带的小车模型)
(mojoco) $ python -m mujoco.viewer --mjcf=./model/car/car.xml

在这里插入图片描述

1.2 python 脚本启动

  • 启动仿真器,不加载模型(阻塞)
import mujocomojoco.viewer.launch()
  • 启动仿真器,同时加载模型(阻塞)
import mujocomodel_xml_path = "./model/car/car.xml"
mujoco.viewer.launch_from_path(model_xml_path)

上面两种阻塞方式启动后 terminal 会一直等待你在仿真器中操作完并关闭。mujoco 也提供了非阻塞方式启动仿真器 launch_passive(model, data),但在启动时必须将模型加载进来,同时需要手动管理 mj_step() 函数,而以阻塞方式启动的仿真器不需要显示调用该函数。因为是非阻塞方式启动,需要将仿真器放在一个循环中,否则一启动就会立刻关闭。

  • 启动仿真器,同时加载模型(非阻塞)
import timeimport mujoco
import mujoco.viewermodel_xml_path = "./model/car/car.xml"
model = mujoco.MjModel.from_xml_path(model_xml_path)
data = mujoco.MjData(model)with mujoco.viewer.launch_passive(model=model, data=data) as viewer:while viewer.is_running():step_start = time.time()        # 每一帧仿真的开始时间,用于控制仿真的时间步长mujoco.mj_step(model, data)     # [核心] 手动推进一次仿真# 给 simulate GUI 加锁,防止数据修改线程与渲染线程出现冲突with viewer.lock():# 这行主要是提升交互体验,你在运行后可以发现环境中每个接触点都会有黄色的圆柱在闪烁viewer.opt.flags[mujoco.mjtVisFlag.mjVIS_CONTACTPOINT] = int(data.time % 2)viewer.sync()   # 将最新的数据同步给GUI中并显示# 到达此处说明当前帧的运算和渲染已经结束了,计算一下到下一帧的时间间隔,用于控制仿真节奏# 如果仿真在这一步消耗了很长时间,那么该值是有可能为负time_until_next_step = model.opt.timestep - (time.time() - step_start)if time_until_next_step > 0:time.sleep(time_until_next_step)    # 休眠一下后准备计算下一帧

在这里插入图片描述

运行之后就可以看到上图中的效果,可以发现在小车三个轮子的位置处有黄色的矮圆柱体在闪烁,这就是代码中 viewer.opt.flags 部分起的作用。


2. 编写 xml 文件

在上一章节中其实遗留了一个问题:多个模型的加载在机器人仿真中是必要的,但 mujoco 本身是不支持同时加载多个 xml 文件的,因为 mujoco 是 面向单物理场景 设计的,只不过有方法来实现这点,上面例子中的小车本质上就是在一个 xml 文件中创建了不同元素并将其组合,多个模型加载问题可以被转化成不同元素但不进行组合。

在编写之前需要先理解 mujoco 如何解析 xml 文件的,特别是哪些标签是核心的、哪些是可以以类形式定义等。

  • 官方解释链接:XMLreference.html

我将 xml 的标签分为两类:

  • 环境标签:这类标签定义了全局仿真配置,包括重力、第三人称相机视角、密度、时间步长等;
  • 对象标签:这类标签是可以继承、包含、相互作用,有点类似代码中的 class;

这种分类方式实际上不严谨,但对于初学者而言可以先这样简化地去理解。

2.1 立方体与平面

首先是最简单的一个例子,在一个空间中有一个立方体和一个平面,期望立方体自由落体后掉在平面上:

<mujoco><!-- 场景 --><worldbody><!-- 光源 --><light diffuse="0.5 0.5 0.5" pos="0 0 3" dir="0 0 -1"/> <!-- 平面 --><geom name="ground" type="plane" size="1 1 0.1" rgba="0.5 0.5 0.5 1"/><!-- 对象 --><body name="cube" pos="0 0 1"><joint type="free"/>	<!-- 该对象与外界的链接方式 --><geom type="box" size="0.1 0.1 0.1" rgba="0.0 0.0 0.5 1"/></body></worldbody>
</mujoco>

上面的例子中顶级标签为 <mujoco>,其他所有对象都在 <worldbody> 标签下,在这个标签中有两个对象 平面立方体

【Note】:虽然mujoco官方文档和很多教程都告诉你可以省略 name 字段,没有显示声明的情况下会自动分配一个匿名值,但我会将 name 字段一直写上去,因为 mujoco 不允许出现同名对象,同时有 name 字段可以帮你更快定位到问题。

直接运行就可以看到一个立方体自由落体到平面上:

(mujoco) $ python -m mujoco.viewer --mjcf=./merge.xml

在这里插入图片描述

实际上在xml中的 平面 也是一个对象,但我个人习惯地面对象不用 body 标签包裹以区分运动对象和地面,所以下面的写法也是正确的:

<mujoco><!-- 场景 --><worldbody><!-- 光源 --><light diffuse="0.5 0.5 0.5" pos="0 0 3" dir="0 0 -1"/> <!-- 平面 --><body name="ground" pos="0 0 0" ><geom type="plane" size="1 1 0.1" rgba="0.5 0.5 0.5 1"/></body><!-- 对象 --><body name="cube" pos="0 0 1"><joint type="free"/><geom type="box" size="0.1 0.1 0.1" rgba="0.0 0.0 0.5 1"/>  <!-- 对象的几何形状 --></body></worldbody>
</mujoco>

同理,如果想要在不同位置添加一个新的立方体则如下所示,新的立方体中多了一个 euler 属性表示其初始角度信息,更多属性以及其默认值可以在官网文档中找到:

<mujoco><worldbody><light diffuse="0.5 0.5 0.5" pos="0 0 3" dir="0 0 -1"/> <geom name="ground" type="plane" size="1 1 0.1" rgba="0.5 0.5 0.5 1"/><!-- 立方体1 --><body name="cube1" pos="0 0 1"><joint type="free"/><geom type="box" size="0.1 0.1 0.1" rgba="0.0 0.0 0.5 1"/> </body><!-- 立方体2 --><body name="cube2" pos="0.5 0.5 0.5" euler="0 20 30"><joint type="free"/><geom type="box" size="0.1 0.1 0.1" rgba="0.5 0.0 0.0 1"/></body></worldbody>
</mujoco>

运行后也是两个立方体自由落体,只不过初试高度和角度不同,因此最终落地姿势也不同。

(mujoco) $ python -m mujoco.viewer --mjcf=./merge.xml

在这里插入图片描述

2.2 环境标签

通常情况下环境标签是在第一步就需要做的,为了避免不同平台中存在差异,虽然 mujoco 允许在运行过程中修改环境标签的值,例如更改重力方向,但在没有特殊需求的情况下这些值应该被定义为一个静态值。

在 mujoco 中通过 xml 里的 <option> 标签定义环境,可以修改的属性值有以下几个:

在这里插入图片描述

我最常用的是下面几个:

  • timestep:仿真时间步长,默认 0.002 0.002 0.002s,影响计算速度与精度的最重要参数;
  • gravity:重力方向,默认 ( 0 , 0 , − 9.81 ) (0,0,-9.81) (0,0,9.81)
  • density:环境介质密度,默认 0 0 0,可以修改你的仿真环境是在水下还是空气中,默认在空气中;

xml 文件示例如下:

<mujoco><!-- 环境标签 --><option gravity="0 0 -1" /><worldbody><light diffuse="0.5 0.5 0.5" pos="0 0 3" dir="0 0 -1"/> <geom name="ground" type="plane" size="1 1 0.1" rgba="0.5 0.5 0.5 1"/><body name="cube" pos="0 0 1"><joint type="free"/><geom type="box" size="0.1 0.1 0.1" rgba="0.0 0.0 0.5 1"/> </body></worldbody>
</mujoco>

【Note】:注意环境标签 <option> 的位置,由于环境标签是全局作用的,因此需要将其放在顶级域名之下。

2.3 单位与轴

因为存在 万向节死锁 的问题,有些算法会调整 rpy 的旋转顺序,mujoco 提供了标签 <compile> 来定义单位与轴旋转顺序;在没有明确定义的情况下度数单位为 弧度,但也可以通过修改来确定度的单位为 角度

在这里插入图片描述

示例如下:

<mujoco><compiler angle="degree" eulerseq="yzx"/><worldbody><light diffuse="0.5 0.5 0.5" pos="0 0 3" dir="0 0 -1"/> <geom name="ground" type="plane" size="1 1 0.1" rgba="0.5 0.5 0.5 1"/><body name="cube" pos="0 0 1"><joint type="free"/><geom type="box" size="0.1 0.1 0.1" rgba="0.0 0.0 0.5 1"/> </body></worldbody></mujoco>

这些本质上和环境标签是同一类型,都是确定好后不会频繁变化的,因此在曾经结构上也是顶级位置。

2.4 通用资产定义

有些属性或变量可能会被多个对象使用,如果每个对象都重新写一遍会非常冗余,mujoco 提供了 <asset> 标签用来定义通用资产,并且允许对象直接使用。

<mujoco><asset><!-- 定义材质 --><material name="blue" rgba="0 0 0.5 1"/><!-- 定义凸包 -->      <mesh name="tetrahedron" vertex="0 0 0  1 0 0  0 1 0  0 0 1"/></asset><worldbody><light diffuse="0.5 0.5 0.5" pos="0 0 3" dir="0 0 -1"/> <geom name="ground" type="plane" size="1 1 0.1" rgba="0.5 0.5 0.5 1"/><body name="cube" pos="0 0 1"><joint type="free"/><!-- 使用材质和凸包 --><geom type="box" size="0.1 0.1 0.1" material="blue" mesh="tetrahedron"/> </body></worldbody></mujoco>

上面的示例中使用了 mesh 这个标签,本质是表面网格,但 网格也可以定义成不带面的网格(本质上是点云)。在这种情况下,即使编译器属性 convexhull 为 false,凸包也会自动构建。这使得直接在 XML 中构建简单形状变得非常简单。例如,可以如下创建金字塔:

如果你想要使用 mesh 原本的含义,即物体表面渲染方式,那么这样写即可:

<mujoco><asset><material name="blue" rgba="0 0 0.5 1"/><!-- 前提是同级目录下有这个文件 --><mesh name="forearm" file="forearm.stl"/></asset><worldbody><light diffuse="0.5 0.5 0.5" pos="0 0 3" dir="0 0 -1"/> <geom name="ground" type="plane" size="1 1 0.1" rgba="0.5 0.5 0.5 1"/><body name="cube" pos="0 0 1"><joint type="free"/><geom type="box" size="0.1 0.1 0.1" material="blue" mesh="forearm"/> </body></worldbody></mujoco>

【Note】:由于 mujoco 不允许相同的 name 属性,因此定义 <asset> 标签时可以用一些带有前缀的变量,如 name="asset_blue",这样可以避免在复杂工程中存在名称冲突的情况,特别是有些厂商提供的模型文件中也定义了颜色和材质等对象。

2.5 文件包含

如果把所有的配置都写在一个文件中会非常难以梳理,mujoco 提供了 <include> 标签实现文件包含,我通常会将环境、单位、通用资产的定义写在一个 common.xml 文件中,在主文件中只关注对象的运动关系:

【Note】:所有包含与被包含文件中的元素都必须在 <mujoco> 这个根标签下,这是mujoco识别的依据。

  • common.xml 文件
<mujoco><asset><material name="blue" rgba="0 0 0.5 1"/></asset>
</mujoco>
  • merge.xml 文件
<mujoco><!-- 包含公共变量与资产 --><include file="./common.xml"/> <worldbody><light diffuse="0.5 0.5 0.5" pos="0 0 3" dir="0 0 -1"/> <geom name="ground" type="plane" size="1 1 0.1" rgba="0.5 0.5 0.5 1"/><body name="cube" pos="0 0 1"><joint type="free"/><geom type="box" size="0.1 0.1 0.1" material="blue"/> </body></worldbody></mujoco>

2.6 关节约束

重头戏来了 <joint> 关节约束。mujoco 对关节约束的定义和 urdf 文件基本一致,允许一下几种形式的约束:

  • free:三个平移自由度 + 三个旋转自由度;
  • ball:三个旋转自由度的球形关节,四元数 (1,0,0,0) 对应于定义初始状态;
  • slide:一个平移自由度的滑动或平移关节,需要明确平移方向;
  • hinge:铰链类型创建具有一个旋转自由度的铰链关节,需要明确旋转轴;

【Note】:为了更好的交互效果,这里提前引入了<actuator> 标签,否则无法在仿真器中拖拽。

示例如下:

<mujoco><worldbody><light diffuse="0.5 0.5 0.5" pos="0 0 3" dir="0 0 -1"/><geom name="ground" type="plane" size="5 5 0.1" rgba="0.5 0.5 0.5 1" friction="0.1 0.05 0.05"/><!-- 可拖拽立方体 --><body name="draggable_cube" pos="0 0 1"><joint name="x_slide" type="slide" axis="1 0 0" damping="5" stiffness="50" range="-3 3"/><joint name="y_slide" type="slide" axis="0 1 0" damping="5" stiffness="50" range="-3 3"/><geom name="cube" type="box" size="0.1 0.1 0.1" rgba="0 0.5 0.8 1" mass="5"/></body></worldbody><actuator><!-- 位置伺服控制器 --><position name="x_pos" joint="x_slide" kp="500" kv="20"/><position name="y_pos" joint="y_slide" kp="500" kv="20"/></actuator></mujoco>

启动仿真器后可以在右侧的 Control 面板中拖动滑块以观察立方体运动。

在这里插入图片描述

2.7 定义执行器

在上面的小节中提前用到了执行器 <actuator> ,这一小节将更细致介绍如何定义执行器标签来控制环境中的对象。

【未完待续】

相关文章:

Mujoco 学习系列(二)基础功能与xml使用

这篇文章是 Mujoco 学习系列第二篇&#xff0c;主要介绍一些基础功能与 xmI 使用&#xff0c;重点在于如何编写与读懂 xml 文件。 运行这篇博客前请先确保正确安装 Mujoco 并通过了基本功能与GUI的验证&#xff0c;即至少完整下面这个博客的 第二章节 内容&#xff1a; Mujoc…...

8 定时任务与周期性调度

在构建复杂的分布式系统时&#xff0c;我们经常会遇到需要“定时”或“周期性”执行的任务。比如&#xff0c;每天凌晨生成报表&#xff0c;每小时同步一次数据&#xff0c;或者在特定时间发送提醒邮件。这些任务如果都依赖人工触发&#xff0c;不仅效率低下&#xff0c;而且容…...

idea 插件开发自动发布到 nexus 私服中(脚本实例)

如下脚本内容为 idea 插件开发项目中的 build.gradle.kts 文件示例&#xff0c;其中自定了 updatePluginsXml 和 uploadPluginToNexus 两个任务&#xff0c;一个用来自动修改 nexus 中的配置文件&#xff0c;一个用来自动将当前插件打包后的 zip 文件上传到 nexus 私服中。 脚…...

关于 APK 反编译与重构工具集

一、apktool — APK 解包 / 重打包 apktool 是一款开源的 Android APK 工具&#xff0c;用于&#xff1a; 反编译 APK 查看资源和布局文件 生成 smali 文件&#xff08;DEX 的反汇编&#xff09; 对 APK 进行修改后重新打包 它不能还原 Java 源码&#xff0c;只能将 D…...

【课堂笔记】核方法和Mercer定理

文章目录 Kernal引入定义Mercer定理描述有限情形证明一般情形证明 Kernal 引入 在实际数据中常常遇到不可线性分割的情况&#xff0c;此时通常需要将其映射到高维空间中&#xff0c;使其变得线性可分。例如二维数据&#xff1a; 通过映射 ϕ ( x 1 , x 2 ) ( x 1 2 , 2 x 1…...

Cribl 中 Parser 扮演着重要的角色 + 例子

先看文档: Parser | Cribl Docs Parser The Parser Function can be used to extract fields out of events or reserialize (rewrite) events with a subset of fields. Reserialization will preserve the format of the events. For example, if an event contains comma…...

MVDR源码(可直接运行)

该代码可正常运行&#xff0c;信号使用的是模拟信号&#xff0c;可改为指定信号。 本代码使用了一个基于MVDR&#xff08;最小方差无失真响应&#xff09;算法的麦克风阵列声源定位方法。代码首先设置了麦克风阵列的参数&#xff0c;包括阵元数量、采样率、信号频率等&#xff…...

MyBatis实战指南(一)MyBatis入门基础与利用IDEA从零开始搭建你的第一个MyBatis系统

MyBatis实战指南&#xff08;一&#xff09;MyBatis入门基础与利用IDEA从零开始搭建你的第一个MyBatis系统 一、什么是MyBatis1. MyBatis 是什么&#xff1f;2. JDBC 的三大痛点3. MyBatis 的核心优势1. 告别重复代码&#xff0c;专注核心逻辑2. 灵活控制 SQL&#xff0c;适应各…...

React Flow 数据持久化:Django 后端存储与加载的最佳实践(含详细代码解析)

在构建 React Flow 应用时&#xff0c;前端呈现的节点与连线构成的可视化流程只是冰山一角&#xff0c;其背后的数据持久化与灵活调取才是确保应用稳定运行、支持用户数据回溯与协作的关键。因此&#xff0c;后端存储与加载 React Flow 信息的环节&#xff0c;就如同整个应用的…...

第32节:基于ImageNet预训练模型的迁移学习与微调

1. 引言 在深度学习领域,迁移学习(Transfer Learning)已经成为解决计算机视觉任务的重要方法,特别是在数据量有限的情况下。其中,基于ImageNet数据集预训练的模型因其强大的特征提取能力而被广泛应用于各种视觉任务。本文将详细介绍迁移学习的概念、ImageNet预训练模型的特…...

接口自动化可视化展示

目的将接口返回的实际对比返回 前端&#xff1a;使用Geeker-Admin二次开发使用 后端 flaskpythonrequests 实际实现展示 接口测试通过 接口测试不通过 接口数据的增删改查...

Hbuilder X4.65新建vue3项目存在的问题以及解决办法

有关Vue的多篇文章&#xff1a; 1.使用Vue创建前后端分离项目的过程&#xff1a;使用Vue创建前后端分离项目的过程&#xff08;前端部分&#xff09;_vue前端项目打包的dish-CSDN博客 2.vue3实现自定义导航菜单&#xff1a;vue3实现自定义导航菜单_vue3 导航栏-CSDN博客 3…...

SpringBoot 项目实现操作日志的记录(使用 AOP 注解模式)

本文是博主在做关于如何记录用户操作日志时做的记录&#xff0c;常见的项目中难免存在一些需要记录重要日志的部分&#xff0c;例如权限和角色设定&#xff0c;重要数据的操作等部分。 博主使用 Spring 中的 AOP 功能&#xff0c;结合注解的方式&#xff0c;对用户操作过的一些…...

C/C++ 整数类型的长度

参考 cppreference.cn 在某些语言中&#xff0c;整数类型的长度是固定的&#xff0c;如java中 char 8short 16int 32long 64 可是C/C 与机器相关&#xff0c;整数类型长度与平台有关 先可以记一个简单的 按照C标准&#xff1a; char > 8short > 16int > 16long &g…...

解决npm install报错:getaddrinfo ENOTFOUND registry.nlark.com

问题背景 在使用 npm install 安装依赖时&#xff0c;突然遇到以下错误&#xff1a; npm ERR! network request to https://registry.nlark.com/fsevents/download/fsevents-2.3.2.tgz failed, reason: getaddrinfo ENOTFOUND registry.nlark.com这表明 npm 在尝试从 registr…...

PostgreSQL简介安装

目录 一. PostgreSQL 1. 简介 2. 特点 3. 优势 4. 架构 5. 应用场景 二. 安装PostgerSQL 1. 编译安装 (1) 安装编译安装所需环境 (2) 编译安装 (3) 配置环境变量 (4) 登录数据库 2. DNF安装 (1) 安装postgreSQL (2) 初始化数据库 (3) 登录数据库 三. postgreSQ…...

vue3+elementPlus穿梭框拖拽

安装 npm install sortablejs --save <template><div class"transfer" ref"transfer"><div><el-transfer v-model"inputForm" :data"data" :titles"titles"><template #default"{ option }…...

牛客周赛 Round 93题解(个人向A-E)

牛客周赛 Round 93题解&#xff08;个人向A-E&#xff09; 题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/109904 a题 签到题&#xff0c;直接按题意模拟即可 #include <bits/stdc.h> using namespace std; #define ll long long int main() {ios::sync_…...

MySQL高可用之ProxySQL + MGR 实现读写分离实战

部署MGR 1、MGR 前置介绍 阿里云RDS集群方案用的就是MGR模式&#xff01; 1.1、什么是 MGR MGR&#xff08;MySQL Group Replication&#xff09;是MySQL 5.7.17版本诞生的&#xff0c;是MySQL自带的一个插件&#xff0c;可以灵活部署。保证数据一致性又可以自动切换&#x…...

React TS中如何化简DOM事件的定义

概要 我们在做TS开发时候&#xff0c;总要面对各种类型的定义。React使用自己的Sythetic Event机制管理DOM事件&#xff0c;不同于原生的DOM事件定义&#xff0c;所以在TS中&#xff0c;事件的类型定义更加繁琐。 本文提供一中简化定义的方法&#xff0c;在使用中&#xff0c…...

BigemapPro蒙版使用技巧:精准导出地图范围

在地图制图过程中&#xff0c;我们常常会遇到需要按照特定边界裁剪地图&#xff0c;或者对指定范围以外的地图进行模糊处理等情况&#xff0c;这时"添加蒙版"功能就非常实用。 BigemapPro的蒙版功能&#xff0c;可满足用户按自定义形状裁剪地图、控制区域外显示效果&…...

CesiumEarth v1.15 更新

更新&#xff1a;​ CesiumEarth 更新至1.15.0版本&#xff0c;包含浏览器在线版、Desktop Windows版本、Desktop 安卓版本 界面优化&#xff1a;​ 项目列表已适配手机屏幕 功能​ 扩展模块更新 1、在底部工具栏区域&#xff0c;所有已生效&#xff08;已勾选&#xff0…...

SOC-ESP32S3部分:2-2-VSCode进行编译烧录

飞书文档https://x509p6c8to.feishu.cn/wiki/CTzVw8p4LiaetykurbTciA42nBf?fromScenespaceOverview 无论是使用Window搭建IDF开发环境&#xff0c;还是使用Linux Ubuntu搭建IDF开发环境&#xff0c;我们都建议使用VSCode进行代码编写和编译&#xff0c;VSCode界面友好&#x…...

机器学习 day05

文章目录 前言一、模型选择与调优1.交叉验证2.超参数搜索 前言 通过今天的学习&#xff0c;我掌握了机器学习中模型的选择与调优&#xff0c;包括交叉验证&#xff0c;超参数搜索的概念与基本用法。 一、模型选择与调优 模型的选择与调优有许多方法&#xff0c;这里主要介绍较…...

关于element-ui的table type=“expand“ 嵌套表格展开异常问题解决方案

也许是很久没用这个库了 今天找这个问题还花了一会儿时间 也是蛮简单的一个问题 排查过程就不说了 直接说结果吧 记录一下 发现问题 展开第一列的时候表格没问题 收起的时候 莫名其妙多了一个展开的按钮 代码咋一看没什么问题 百思不解不得其解 甚至怀疑row-key的问题 检查了数…...

Pichome 开源网盘程序index.php 文件读取漏洞(CVE-2025-1743)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…...

[SpringBoot]Spring MVC(6.0)----图书管理系统(初)

图书管理系统 需求: 1. 登录: 用户输入账号,密码完成登录功能. 2. 列表展示: 展示图书. 准备工作 将前端代码复制到 static 目录下. 约定前后端交互接口 两个功能: 用户登录 和 图书列表展示. 需求分析: 1. 用户登录 url : /user/login param : userName 和 password return …...

C语言:基础篇之常见概念

文章目录 1.C语言是什么&#xff1f;2.C语言的历史和辉煌3.编译器的选择VS20223.1 编译和链接3.2 编译器的对比3.3 VS2022 的优缺点 4.VS项目和源文件、头文件介绍5.第一个C语言程序6.main函数7.printf和库函数8.关键字介绍9.字符和ASCII编码10.字符串和\011.转义字符12.语句和…...

Ansible模块——管理100台Linux的最佳实践

使用 Ansible 管理 100 台 Linux 服务器时&#xff0c;推荐遵循以下 最佳实践&#xff0c;以提升可维护性、可扩展性和安全性。以下内容结合实战经验进行总结&#xff0c;适用于中大型环境&#xff08;如 100 台服务器&#xff09;&#xff1a; 一、基础架构设计 1. 分组与分层…...

算法与数据结构:质数、互质判定和裴蜀定理

文章目录 质数质数判定质数筛选质因数分解互质判定裴蜀定理 质数 首先回顾「质数」的定义&#xff1a;若一个正整数无法被除了 1 ​和它自身之外的任何自然数整除&#xff0c;则称该数为质数&#xff08;或素数&#xff09;&#xff0c;否则称该正整数为合数。 根据上述定义&…...

基于C#的Modbus通信协议全面解析与实现指南

目录 1. Modbus协议概述 1.1 Modbus网络结构 1.2 Modbus功能码 2. Modbus RTU模式实现 2.1 RTU模式特点 2.2 CRC-16校验算法 2.3 使用NModbus4库实现RTU通信 3. Modbus TCP/IP模式实现 3.1 TCP模式特点 3.2 MBAP报文头结构 3.3 使用NModbus实现TCP通信 3.4 原生TCP套…...

IVX:重构 AI 原生开发范式,让模型调用成为指尖艺术​

一、AI 原生开发的技术跃迁&#xff1a;从黑箱集成到白盒重构 在传统 AI 开发范式中&#xff0c;将 GPT-4o、Mediapipe 等模型集成到业务系统往往需要经历 "模型训练 - API 对接 - 前端适配" 的复杂流程。开发团队需同时掌握机器学习框架&#xff08;如 TensorFlow&…...

源码分析之Leaflet中TileLayer

概述 TileLayer 是 Layer 的子类&#xff0c;继承自GridLayer基类&#xff0c;用于加载和显示瓦片地图。它提供了加载和显示瓦片地图的功能&#xff0c;支持自定义瓦片的 URL 格式和参数。 源码分析 源码实现 TileLayer的源码实现如下&#xff1a; export var TileLayer …...

Java虚拟机 - 程序计数器和虚拟机栈

运行时数据结构 Java运行时数据区程序计数器为什么需要程序计数器执行流程虚拟机栈虚拟机栈作用虚拟机栈核心结构运行机制 Java运行时数据区 首先介绍Java运行时数据之前&#xff0c;我们要了解&#xff0c;对于计算机来说&#xff0c;内存是非常重要的资源&#xff0c;因为内…...

大语言模型 15 - Manus 超强智能体 开源版本 OpenManus 案例与原理深入解析

写在前面 Manus 是由中国初创公司 Monica.im 于 2025 年 3 月推出的全球首款通用型 AI 智能体&#xff08;AI Agent&#xff09;&#xff0c;旨在实现“知行合一”&#xff0c;即不仅具备强大的语言理解和推理能力&#xff0c;还能自主执行复杂任务&#xff0c;直接交付完整成…...

开源CMS系统中哪些常见的安全漏洞最需要注意?

在当今数字化时代&#xff0c;开源内容管理系统&#xff08;CMS&#xff09;因其灵活性和低成本广受欢迎。然而&#xff0c;开源CMS的安全漏洞也频频成为黑客攻击的突破口。本文将带大家全面了解下开源CMS中需要警惕的安全漏洞以及防护建议&#xff0c;以帮助开发者和管理员更好…...

文件包含靶场实现

文件包含漏洞&#xff08;File Inclusion Vulnerability&#xff09;是 Web 安全中常见的高危漏洞&#xff0c;主要分为 本地文件包含&#xff08;LFI&#xff09; 和 远程文件包含&#xff08;RFI&#xff09; 1、典型利用方式 利用方式示例 Payload说明路径遍历?page../../…...

在 JavaScript 中正确使用 Elasticsearch,第二部分

作者&#xff1a;来自 Elastic Jeffrey Rengifo 回顾生产环境中的最佳实践&#xff0c;并讲解如何在无服务器环境中运行 Elasticsearch Node.js 客户端。 想获得 Elastic 认证&#xff1f;查看下一期 Elasticsearch Engineer 培训的时间&#xff01; Elasticsearch 拥有大量新…...

DataLight(V1.7.12)版本更新发布

DataLight&#xff08;V1.7.12&#xff09;版本更新发布 亲爱的 DataLight 用户们&#xff0c; DataLight 发布 V1.7.12 版本&#xff0c;此版本带来了新服务 DINKY 的支持&#xff0c;以及多项问题修复&#xff0c;进一步提升了平台的易用性和稳定性。 一. 更新日志 在此次…...

LeetCode-前缀和-和为K的子数组

LeetCode-前缀和-和为K的子数组 ✏️ 关于专栏&#xff1a;专栏用于记录 prepare for the coding test。 文章目录 LeetCode-前缀和-和为K的子数组&#x1f4dd; 和为K的子数组&#x1f3af;题目描述&#x1f50d; 输入输出示例&#x1f9e9;题目提示&#x1f9ea;前缀和❓什么…...

MySQL基础关键_014_MySQL 练习题

目 录 一、有以下表&#xff0c;请用一条 SQL 语句查询出每门课程都大于 80 分的学生 二、综合题1&#xff08;数据自行模拟&#xff09; 1.查询身份证号为“440401430103082”的申请日期 2.查询同一个身份证号有两条及以上记录的身份证号码及记录个数 3.将身份证号码为“4…...

femap许可与云计算集成

随着云计算技术的迅猛发展&#xff0c;越来越多的企业开始将关键应用和服务迁移到云端&#xff0c;以享受其带来的弹性扩展、高效管理和成本优化等优势。Femap作为一款强大的电磁仿真工具&#xff0c;通过与云计算的集成&#xff0c;将为企业带来前所未有的许可管理和仿真分析体…...

uni-app项目从0-1基础架构搭建全流程

前情 最近新接了一个全新项目&#xff0c;我负责从0开始搭建小程序&#xff0c;我选用的技术栈是uni-app技术栈&#xff0c;UI库选择的是uview-plus&#xff0c;CSS引入现在流行的tainlwindcss&#xff0c;实现CSS原子化书写&#xff0c;实现小程序分包&#xff0c;分包中实现…...

轻量级高性能推理引擎MNN 学习笔记 04.线性回归

1. 线性回归 MNN 官方给的iOS Demo中&#xff0c;输入是图片&#xff0c;输出是分类结果&#xff0c;相对来讲&#xff0c;略微有些复杂&#xff0c;我们现在用一个最简单的线性回归模型&#xff0c;来说明MNN的用法。 该线性回归是yaxb &#xff08;其中a2,b0.01&#xff09…...

使用 React PDF 构建 React.js PDF 查看器的指南

在本文中&#xff0c;我们将重点介绍在React.js中制作 PDF 查看器的最受欢迎的开源库。具体来说&#xff0c;我们将利用著名的开源库react-pdf的功能&#xff0c;指导您完成创建 React.js PDF 查看器的过程。 通过本教程&#xff0c;您将在第一部分学习如何使用 React-PDF 在 …...

动力电池点焊机厂家:驱动新能源制造的精密力量|比斯特自动化

在新能源汽车、储能系统等产业蓬勃发展的背景下&#xff0c;动力电池点焊机作为电池模组生产的核心设备&#xff0c;正经历着技术迭代与市场需求的双重升级。这类厂家通过持续研发与创新&#xff0c;不仅满足了电池制造企业对焊接精度、效率与稳定性的严苛要求&#xff0c;更推…...

React的合成事件(SyntheticEventt)

文章目录 前言 前言 React的合成事件&#xff08;SyntheticEvent&#xff09;是React为了统一不同浏览器的事件处理行为而封装的一套跨浏览器事件系统。它与原生事件的主要区别如下&#xff1a; 1. 事件绑定方式 • 合成事件&#xff1a;使用驼峰命名法绑定事件&#xff08;如…...

知识中台Top5:Baklib上榜推荐

Baklib知识中台优势 在数字化转型浪潮中&#xff0c;Baklib凭借其知识中台的核心设计理念&#xff0c;构建了企业级知识管理的差异化竞争力。区别于传统文档管理系统&#xff0c;该平台通过四库体系&#xff08;知识资源库、场景规则库、服务模型库、应用组件库&#xff09;实…...

在Windows系统中使用C++与Orthanc交互:基于DICOMweb的医学影像应用开发

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

视频太大?用魔影工厂压缩并转MP4,画质不打折!

在日常生活中&#xff0c;我们常常需要将视频文件转换成不同的格式以适应各种设备或平台的播放需求。魔影工厂作为一款功能强大且操作简单的视频转换工具&#xff0c;深受用户喜爱。本文中简鹿办公将手把手教你如何使用魔影工厂将视频转换为MP4格式&#xff0c;并进行个性化设置…...