半小时入门具身智能:手动创建第一个 Isaac Lab 项目

2026年8月13日星期四·#学习文档具身智能/IsaacLab/强化学习/Robotics·3184 字 16 分钟·
-浏览量
·
简介

具身智能零基础入门教程,从创建 IsaacSim 仿真项目、完成 MDP 配置与 Gym 环境注册,到训练、验证、可视化及奖励函数优化的完整闭环。

提示

本文完整走一遍从创建 IsaacSim 仿真项目,到完成基本项目配置(MDP 配置、机器人模型配置、Gym 接口注册),再到训练、验证及可视化,最后完成策略优化的闭环流程。文章基于宇树 Go2 机器人,完整 Demo 已开源在 menoking/Go2-Demo。主要参考猫师傅的《米雪儿教你从零开始编写 Isaac Lab 强化学习环境》教程以及 Isaac Lab 官方 Quickstart Guide。

一、基础知识#

1、强化学习扫盲#

强化学习(RL):通过让智能体(Agent)与环境(Environment)交互,学习出能够最大化累积奖励(Cumulative Reward)的策略(Policy)。

核心四要素:

  • 智能体 Agent
  • 奖励 Reward
  • 环境 Environment
  • 策略 Policy

2、领域术语#

机器人领域常见的文件格式:

格式说明
USD皮克斯开发的通用场景描述框架,以分层、非破坏式编辑为核心,是 Isaac Sim 的原生格式,支持复杂材质、动画和大规模场景合成
URDF基于 XML 的机器人描述格式,定义连杆、关节、运动学和动力学属性,是 ROS 生态中机器人的标准表示
SDFGazebo 专用的仿真描述格式,能完整描述整个世界(多机器人、地形、传感器、灯光等),比 URDF 更强大
MJCFMuJoCo 物理引擎的原生 XML 格式,描述紧凑、接触建模高效,广泛用于高频控制和足式机器人仿真
XACROURDF 的宏语言扩展,支持参数化、模块化生成 URDF 文件,用于避免重复代码
STL / OBJ / COLLADA (DAE)仅用于存储 3D 网格几何数据的静态格式,不包含运动学或动力学信息,常被 URDF/USD 作为视觉或碰撞网格引用
GLTF / GLB面向实时渲染和 Web 传输的 3D 格式,集成了网格、材质、动画和皮肤,在图形交换中越来越普及

3、MDP 与 Isaac Lab 工作流#

MDP(马尔可夫决策过程) 是强化学习问题形式化的数学基础,也是 Isaac Lab 中每个环境(Env)核心逻辑的设计依据。

  • 在 Manager-based 工作流中,MDP 的各部分被拆解为独立的配置模块:
    • Observation Manager:定义如何从物理状态映射到观测。
    • Action Manager:定义动作空间及映射到实际控制量。
    • Reward Manager:累加多个奖励项。
    • Termination Manager:判断任务失败/成功条件。
  • 在 Direct 工作流中,直接覆写 _get_observations()、_get_rewards()、_get_done_terminations() 等方法。

二、项目创建#

1、创建项目#

键入以下命令新建项目:

Terminal window
isaaclab.bat -n

进入配置页面(上下箭头移动,空格选中,回车确认):

  • 工作流:Manager-based 是官方推荐的声明式主流框架,模块化结构化,适合复杂任务、快速原型开发和团队协作;Direct 是命令式框架,灵活自由度高,适合简单精细任务。
  • RL 框架:
    • rsl-rl:简单、专注且高效,是足式机器人任务快速验证的首选方案,由 ETH Zurich 研发,核心理念是”提供紧凑且易于修改的代码库”。
    • SKRL(Skrl):灵活多样的”瑞士军刀”,提供 PPO、SAC 等丰富算法库,适合快速横向对比研究。
    • RL Games:工业级”性能猛兽”,训练效率和稳定性极佳,适合超长时间大规模训练任务。

创建成功后,安装项目扩展:

Terminal window
python -m pip install -e source/<given-project-name>

这条命令的作用:

  1. 安装基础环境,确保 Python 环境能够识别和导入 Isaac Lab 的核心功能。
  2. 以”可编辑”模式安装项目扩展,代码的任何修改都能立即生效,无需重新安装,便于开发。

用 VS Code 打开项目后,定位到 Manager-based 的配置文件 go2_demo_env_cfg.py,并在同目录下新建自己的配置文件(这里命名为 go2_demo_velocity.py)。

2、官方示例与仓库#

以下两个官方源可以提前打开,其中机器人文件来源于 unitreerobotics/unitree_rl_lab 项目,官方模板参考的是 IsaacLab 中的 velocity_env_cfg.py 文件。

  • IsaacLab 官方示例:velocity_env_cfg.py,一个基于 Manager-based 工作流的四足机器人速度追踪训练环境完整配置文件,定义了宇树 Go2 机器人在复杂地形上学习奔跑的强化学习任务。
  • Unitree 宇树官方仓库:unitreerobotics/unitree_rl_lab,宇树机器人的强化学习专用环境仓库。

官方示例代码中,各代码块对应的 MDP 要素:

代码块对应 MDP 要素具体内容与作用
MySceneCfg场景与环境包含带纹理的粗糙地形、Go2 机器人、射线高度扫描传感器(感知地形)、接触传感器(检测脚掌/大腿触地)以及天空光照
CommandsCfg高层指令(任务目标)生成随机线速度命令 (vx, vy) 和朝向角速度命令 (ang_vel_z),机器人需要追踪这个动态变化的指令,即”速度追踪任务”的核心
ActionsCfg动作空间输出目标关节位置(JointPositionActionCfg),范围缩放 0.5,使用默认偏移量(机器人站立时的关节角度)
ObservationsCfg观测状态 (S)定义策略网络输入,共 7 项:机体线速度/角速度、投影重力、速度命令、关节相对位置/速度、上一次动作、地形高度扫描,并对每项添加均匀噪声
EventCfg域随机化与初始化分三类:startup(随机化物理材质、增加机身质量、改变质心位置)、reset(随机重置机器人根部位姿、关节位置/速度)、interval(随机时间间隔用力推机器人,提高抗干扰能力)
RewardsCfg奖励函数 (R)速度追踪误差的指数奖励(线速度权重 1.0,角速度权重 0.5)+ 多项惩罚(竖向线速度、横向/俯仰角速度、关节力矩/加速度、动作变化率),奖励脚掌离地时间,惩罚大腿非预期触地
TerminationsCfg终止条件超时(步数达到 episode_length_s / dt)和机身触地(base_contact)
CurriculumCfg课程学习根据机器人追踪速度的表现,自动提升地形难度等级
LocomotionVelocityRoughEnvCfg总配置类组合上述所有模块,decimation=4(动作每 4 个仿真步执行一次,即控制频率 50Hz,仿真频率 200Hz),episode_length_s=20.0

三、项目配置#

1、基本配置#

新建 py 配置文件,导入所需包,并复制 LocomotionVelocityRoughEnvCfg 总配置类到自定义文件中,将类名修改为自定义名称,这里改为 GO2RobotDemoEnv。

2、MDP 类配置#

以下所配置的 MDP 要素的每个参数都能在 IsaacLab 官方文档中搜索到释义与用法。

2.1 场景配置类 scene#

构建包含地形、机器人和传感器的虚拟环境:

# 环境配置
@configclass
class RobotSceneCfg(InteractiveSceneCfg):
# 超平坦地形
terrain = TerrainImporterCfg(
prim_path="/World/ground",
terrain_type="plane",
collision_group=-1,
physics_material=sim_utils.RigidBodyMaterialCfg(
friction_combine_mode="multiply",
restitution_combine_mode="multiply",
static_friction=1.0,
dynamic_friction=1.0,
),
visual_material=sim_utils.MdlFileCfg(
mdl_path=f"{ISAACLAB_NUCLEUS_DIR}/Materials/TilesMarbleSpiderWhiteBrickBondHoned/TilesMarbleSpiderWhiteBrickBondHoned.mdl",
project_uvw=True,
texture_scale=(0.25, 0.25),
),
debug_vis=False,
)
robot: ArticulationCfg = RobotCFG.replace(prim_path="{ENV_REGEX_NS}/Robot")

克隆 Go2 宇树官方 USD 文件:

Terminal window
git clone https://huggingface.co/datasets/unitreerobotics/unitree_model

新建 assets/robot 目录(注意:assets 要和 task 同根目录),在此目录下克隆,并新建 unitree.py 文件对模型进行配置(注意脚本里路径应用正斜杠 /):

import os
import isaaclab.sim as sim_utils
from isaaclab.actuators import IdealPDActuatorCfg, ImplicitActuatorCfg, DCMotorCfg
from isaaclab.assets.articulation import ArticulationCfg
from isaaclab.utils import configclass
# 定义模型路径
UNITREE_MODEL_DIR = "D:/EI/Project/go2_demo/source/go2_demo/go2_demo/assets/robot/unitree_model"
# Go2机器人配置
UNITREE_GO2_CFG = ArticulationCfg(
# 定义加载方式
spawn=sim_utils.UsdFileCfg(
usd_path=f"{UNITREE_MODEL_DIR}/Go2/usd/go2.usd", # USD文件路径
activate_contact_sensors=True, # 读取传感器信息
rigid_props=sim_utils.RigidBodyPropertiesCfg(
disable_gravity=False,
retain_accelerations=False,
linear_damping=0.0,
angular_damping=0.0,
max_linear_velocity=1000.0,
max_angular_velocity=1000.0,
max_depenetration_velocity=1.0,
),
articulation_props=sim_utils.ArticulationRootPropertiesCfg(
enabled_self_collisions=False,
solver_position_iteration_count=4,
solver_velocity_iteration_count=0,
),
),
# 定义机器人初始状态
init_state=ArticulationCfg.InitialStateCfg(
pos=(0.0, 0.0, 0.4),
joint_pos={
".*R_hip_joint": -0.1,
".*L_hip_joint": 0.1,
"F[L,R]_thigh_joint": 0.8,
"R[L,R]_thigh_joint": 1.0,
".*_calf_joint": -1.5,
},
joint_vel={".*": 0.0},
),
# 软限位系数
soft_joint_pos_limit_factor=0.9,
# 核心:执行器模型
actuators={
"legs": DCMotorCfg(
joint_names_expr=[".*"],
effort_limit=23.5, # 输出力矩上限
saturation_effort=23.5,
velocity_limit=30.0,
stiffness=25.0, # PD控制中的P
damping=0.5, # PD控制中的D
friction=0.01, # 执行器摩擦系数
),
},
)

注意:这里把宇树的子类换成对应的父类(如 IdealPDActuatorCfg → DCMotorCfg),可在 IsaacLab 中查看对应配置项的参数信息。

回到 go2_demo_velocity.py 导入自定义机器人配置,并补充传感器:

# 导入自定义机器人配置
from go2_demo.assets.robot.unitree import UNITREE_GO2_CFG as RobotCFG
robot: ArticulationCfg = RobotCFG.replace(prim_path="{ENV_REGEX_NS}/Robot")
# 传感器
height_scanner = RayCasterCfg(
prim_path="{ENV_REGEX_NS}/Robot/base",
offset=RayCasterCfg.OffsetCfg(pos=(0.0, 0.0, 20.0)),
ray_alignment="yaw",
pattern_cfg=patterns.GridPatternCfg(resolution=0.1, size=[1.6, 1.0]),
debug_vis=False,
mesh_prim_paths=["/World/ground"],
)
contact_forces = ContactSensorCfg(prim_path="{ENV_REGEX_NS}/Robot/.*", history_length=3, track_air_time=True)
sky_light = AssetBaseCfg(
prim_path="/World/skyLight",
spawn=sim_utils.DomeLightCfg(
intensity=750.0,
texture_file=f"{ISAAC_NUCLEUS_DIR}/Materials/Textures/Skies/PolyHaven/kloofendal_43d_clear_puresky_4k.hdr",
),
)

2.2 观测配置类 observations#

定义策略网络可获取的状态信息(如关节角度、速度、地形扫描)。注意先导入 mdp 包,再定义策略网络和评价网络的观测项框架:

@configclass
class ObservationsCfg:
# 策略网络
@configclass
class PolicyCfg(ObsGroup):
"""Observations for policy group."""
# 机体线速度
base_lin_vel = ObsTerm(func=mdp.base_lin_vel, noise=Unoise(n_min=-0.1, n_max=0.1))
# 机体角速度
base_ang_vel = ObsTerm(func=mdp.base_ang_vel, noise=Unoise(n_min=-0.2, n_max=0.2))
# 投影重力
projected_gravity = ObsTerm(
func=mdp.projected_gravity,
noise=Unoise(n_min=-0.05, n_max=0.05),
)
# 速度指令
velocity_commands = ObsTerm(func=mdp.generated_commands, params={"command_name": "base_velocity"})
# 关节位置
joint_pos = ObsTerm(func=mdp.joint_pos_rel, noise=Unoise(n_min=-0.01, n_max=0.01))
# 关节速度
joint_vel = ObsTerm(func=mdp.joint_vel_rel, noise=Unoise(n_min=-1.5, n_max=1.5))
# 上一次动作
actions = ObsTerm(func=mdp.last_action)
# 高度扫描
height_scan = ObsTerm(
func=mdp.height_scan,
params={"sensor_cfg": SceneEntityCfg("height_scanner")},
noise=Unoise(n_min=-0.1, n_max=0.1),
clip=(-1.0, 1.0),
)
def __post_init__(self):
self.enable_corruption = True
self.concatenate_terms = True
# observation groups
policy: PolicyCfg = PolicyCfg()
# 评价网络
@configclass
class CriticCfg(ObsGroup):
base_lin_vel = ObsTerm(func=mdp.base_lin_vel, noise=Unoise(n_min=-0.1, n_max=0.1))
base_ang_vel = ObsTerm(func=mdp.base_ang_vel, noise=Unoise(n_min=-0.2, n_max=0.2))
projected_gravity = ObsTerm(
func=mdp.projected_gravity,
noise=Unoise(n_min=-0.05, n_max=0.05),
)
velocity_commands = ObsTerm(func=mdp.generated_commands, params={"command_name": "base_velocity"})
joint_pos = ObsTerm(func=mdp.joint_pos_rel, noise=Unoise(n_min=-0.01, n_max=0.01))
joint_vel = ObsTerm(func=mdp.joint_vel_rel, noise=Unoise(n_min=-1.5, n_max=1.5))
actions = ObsTerm(func=mdp.last_action)
height_scan = ObsTerm(
func=mdp.height_scan,
params={"sensor_cfg": SceneEntityCfg("height_scanner")},
noise=Unoise(n_min=-0.1, n_max=0.1),
clip=(-1.0, 1.0),
)
critic: CriticCfg = CriticCfg()

2.3 动作配置类 actions#

指定智能体输出的控制指令类型(如关节位置、速度或力矩):

# 动作配置
@configclass
class ActionsCfg:
"""Action specifications for the MDP."""
joint_pos = mdp.JointPositionActionCfg(
asset_name="robot",
joint_names=[".*"],
scale=0.5,
use_default_offset=True,
)

2.4 指令配置类 commands#

生成任务目标(如期望速度或朝向),供策略追踪:

@configclass
class CommandsCfg:
"""Command specifications for the MDP."""
base_velocity = mdp.UniformVelocityCommandCfg(
asset_name="robot",
resampling_time_range=(10.0, 10.0),
rel_standing_envs=0.02,
rel_heading_envs=1.0,
heading_command=True,
heading_control_stiffness=0.5,
debug_vis=True,
ranges=mdp.UniformVelocityCommandCfg.Ranges(
lin_vel_x=(-1.0, 1.0),
lin_vel_y=(-1.0, 1.0),
ang_vel_z=(-1.0, 1.0),
heading=(-math.pi, math.pi),
),
)

2.5 奖励配置类 rewards#

计算每一步的奖励信号,引导策略学习期望行为:

# 奖励函数
@configclass
class RewardsCfg:
track_lin_vel_xy_exp = RewTerm(
func=mdp.track_lin_vel_xy_exp,
weight=1.0,
params={"command_name": "base_velocity", "std": math.sqrt(0.25)},
)
track_ang_vel_z_exp = RewTerm(
func=mdp.track_ang_vel_z_exp,
weight=0.5,
params={"command_name": "base_velocity", "std": math.sqrt(0.25)},
)

2.6 终止条件配置类 terminations#

设定环境结束条件(如机器人摔倒或超时):

# 终止条件
@configclass
class TerminationsCfg:
# 时间终止
time_out = DoneTerm(func=mdp.time_out, time_out=True)
# 机身碰撞地面
base_contact = DoneTerm(
func=mdp.illegal_contact,
params={"sensor_cfg": SceneEntityCfg("contact_forces", body_names="base"), "threshold": 1.0},
)
# 倾斜角度
bad_orientation = DoneTerm(func=mdp.bad_orientation, params={"limit_angle": 0.8})

2.7 事件配置类 events#

配置域随机化、初始状态扰动等事件,增强策略鲁棒性:

# 事件配置
@configclass
class EventCfg:
reset_base = EventTerm(
func=mdp.reset_root_state_uniform, # 触发函数
mode="reset", # 触发时机--复位
params={
"pose_range": {"x": (-0.5, 0.5), "y": (-0.5, 0.5), "yaw": (-3.14, 3.14)},
"velocity_range": {
"x": (-0.0, 0.0),
"y": (-0.0, 0.0),
"z": (-0.0, 0.0),
"roll": (-0.0, 0.0),
"pitch": (-0.0, 0.0),
"yaw": (-0.0, 0.0),
},
},
)

2.8 课程学习配置类 curriculum#

根据智能体当前表现动态调整任务难度(如地形等级),实现渐进式训练以加速策略收敛。本次暂不对其进行配置,直接注释即可。

3、注册 Gym 环境#

复制 __init__.py 文件中的注册部分代码,修改如下:

gym.register(
id="Go2-velocity-v0", # 环境ID
entry_point="isaaclab.envs:ManagerBasedRLEnv",
disable_env_checker=True,
kwargs={
"env_cfg_entry_point": f"{__name__}.go2_demo_velocity:GO2RobotDemoEnv", # 环境文件名:环境类名
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:PPORunnerCfg",
},
)

4、调整 PPO 网络#

文件位置在 agents/rsl_rl_ppo_cfg.py,调整至以下:

@configclass
class PPORunnerCfg(RslRlOnPolicyRunnerCfg):
num_steps_per_env = 124
max_iterations = 50000
save_interval = 100
experiment_name = "go2_demo"
policy = RslRlPpoActorCriticCfg(
init_noise_std=1.0,
actor_hidden_dims=[512, 256, 128],
critic_hidden_dims=[32, 32],
activation="elu",
)
algorithm = RslRlPpoAlgorithmCfg(
value_loss_coef=1.0,
use_clipped_value_loss=True,
clip_param=0.2,
entropy_coef=0.005,
num_learning_epochs=5,
num_mini_batches=4,
learning_rate=1.0e-3,
schedule="adaptive",
gamma=0.99,
lam=0.95,
desired_kl=0.01,
max_grad_norm=1.0,
)

四、验证与训练#

1、验证环境#

在 conda 环境下运行随机策略:

Terminal window
python scripts\random_agent.py --task Go2-velocity-v0 --num_envs 14

跑通后机器人开始运动。再运行零策略验证(机器人静止状态):

Terminal window
python scripts\zero_agent.py --task Go2-velocity-v0 --num_envs 14

2、正式训练#

无窗口渲染训练:

Terminal window
python scripts\rsl_rl\train.py --task Go2-velocity-v0 --num_envs=400 --max_iterations 1000 --headless

3、参数可视化#

TensorBoard 查看训练曲线:

Terminal window
tensorboard --logdir logs

4、评估策略#

运行下列命令,观察训练的最终模型效果并保存模型权重文件:

Terminal window
python scripts\rsl_rl\play.py --task Go2-velocity-v0 --num_envs 16

在仿真器中可以观察到四足机器人的行走姿态。

五、优化策略#

主要针对奖励函数作优化,将速度追踪权重调大,并添加了几个约束惩罚项:

# 奖励函数
@configclass
class RewardsCfg:
# 线速度追踪
track_lin_vel_xy_exp = RewTerm(
func=mdp.track_lin_vel_xy_exp,
weight=3.0,
params={"command_name": "base_velocity", "std": math.sqrt(0.25)},
)
# 角速度追踪
track_ang_vel_z_exp = RewTerm(
func=mdp.track_ang_vel_z_exp,
weight=1.5,
params={"command_name": "base_velocity", "std": math.sqrt(0.25)},
)
# 约束姿态
flat_orientation_l2 = RewTerm(func=mdp.flat_orientation_l2, weight=-2.5)
# 限制某些部位不着地
undesired_contacts = RewTerm(
func=mdp.undesired_contacts,
weight=-1.0,
params={
"sensor_cfg": SceneEntityCfg(
"contact_forces",
body_names=["Head_.*", ".*_hip", ".*thigh", ".*_calf"],
),
"threshold": 1.0,
},
)
# 惩罚关节速度
joint_vel = RewTerm(func=mdp.joint_vel_l2, weight=-0.001)
# 惩罚关节加速度
joint_acc = RewTerm(func=mdp.joint_acc_l2, weight=-2.5e-7)
# 惩罚输出力矩过大
joint_torques = RewTerm(func=mdp.joint_torques_l2, weight=-2e-4)
# 惩罚相邻时刻动作变化过大
action_rate = RewTerm(func=mdp.action_rate_l2, weight=-0.1)

重新训练后再评估,四足机器人的姿态会明显改善。

六、总结#

本文完整走了一遍 IsaacLab 中的机器人仿真训练流程,从环境搭建、MDP 配置到训练与奖励调优。主要参考 猫猫烤肉师傅的 B 站免费教程 与 Isaac Lab 官方文档,并对视频中未放出的代码和概念做了补充。如有错误,欢迎指正。

半小时入门具身智能:手动创建第一个 Isaac Lab 项目
https://www.hellorx.site/posts/ai/ai-embodied-isaaclab-first-project/
作者
RanXian
发布于
2026-08-13
许可协议
CC BY-NC-SA 4.0

评论区

公告
友链互换友链

正在招募技术类博客友链,要求原创、稳定更新。点击了解更多。

查看详情
音乐音乐功能提示

音乐功能第一首歌曲源出现一定问题暂时无法播放,跳过第一首歌曲即可

维护服务器升级

每周末凌晨 2:00-4:00 进行服务器维护,期间站点可能短暂无法访问。

欢迎关于我的介绍

欢迎来到我的博客,我是深耕云计算、网络安全和人工智能技术开发。热爱技术、持续学习,欢迎同好交流探讨,也欢迎大佬互换友链。

查看详情
音乐
封面

音乐

暂未播放

0:00
0:00
暂无歌词
标签
# 运维5# Linux4# 大学3# 信创3# 竞赛1# 组织1# 基础1# AI1# DeepSeek Harness1# 具身智能1# IsaacLab1# 强化学习1# Robotics1
目录
工具

隐私政策

更新日期: 2026 年 7 月 15 日
生效日期: 2026 年 7 月 15 日

适用范围#

本政策适用于 RanXian 的博客(以下简称“本站”)。本站是个人博客,用于发布和分享内容;不提供账户注册、支付、定位或广告投放服务。访问本站、发表文章评论或在留言板留言前,请阅读本政策。

信息收集与使用#

本站只在提供内容、评论和留言功能,以及维护站点安全所需的范围内处理信息。

  • 访问与统计信息:访问页面时,统计服务可能处理访问时间、页面地址、来源页、浏览器和设备相关信息,用于了解内容访问情况、排查故障和改进站点。
  • 评论信息:使用文章评论功能时,Waline 可能处理您主动提交的昵称、邮箱、站点链接和评论内容;还可能处理 IP 地址等必要信息,用于防止垃圾评论、滥用和维护服务安全。评论内容、昵称和站点链接(如填写)可能公开展示在文章下方;邮箱不会公开展示。
  • 留言信息:留言板使用 Waline /guestbook/ 频道。Waline 可能处理您主动提交的昵称、可选邮箱、站点链接、留言内容和图片,以及浏览器、操作系统、IP 地址等必要的反滥用信息。默认情况下,留言图片以内嵌数据随留言提交;如站点维护者配置了远程图片上传接口,图片会先发送至该接口并在留言中保存返回的图片地址。留言内容、昵称、图片和站点链接(如填写)可能公开展示;邮箱和 IP 地址不会在留言板公开展示。
  • AI 对话信息:使用 AI 搜索时,本站会处理您提交的问题以及最近 6 条对话历史,用于检索博客内容并生成回答。问题和对话历史会发送至 ModelScope,或在第三方接口不可用时由 Cloudflare Workers AI 处理。请勿在 AI 对话中提交密码、Token、身份证件、联系方式或其他敏感信息。

请不要在评论或留言中提交身份证件、银行卡、住址、密码或其他不必要的敏感个人信息。

第三方服务#

为实现本站功能,以下第三方会在各自服务范围内处理相关数据:

  • Umami:用于匿名化的网站访问统计和出站链接点击统计,帮助我了解本站的使用情况。
  • Waline:用于文章评论、留言板及访问量统计。服务会按照其自身规则处理您在评论或留言时提交的信息及必要的反滥用信息。
  • Cloudflare:为本站提供静态资源分发、AI Worker、Vectorize 和相关基础设施。留言板不使用项目 Worker 或 KV 存储。
  • ModelScope:为 AI 搜索提供文本向量和对话模型服务,会处理您提交的问题及发送给模型的最近对话历史。
  • Cloudflare Workers AI:在未配置第三方 AI 接口时提供文本向量和对话模型服务,并处理相同的 AI 请求数据。
  • unpkg:用于加载 Waline 的前端脚本、样式和表情资源;请求这些资源时,您的浏览器会与该服务建立连接。

第三方服务可能有独立的隐私政策和数据保存规则。请在使用相关功能前查阅其规则;本站无法控制其独立的数据处理活动。

本站主要使用浏览器本地存储(Local Storage 或 Session Storage)保存使用偏好,例如主题颜色、明暗模式、文章列表视图和音乐播放设置。留言板会在本地保存匿名资料、未发送草稿和登录状态,以便恢复输入与会话;管理员登录状态仅保存在当前会话。AI 搜索的会话标题和完整对话也会保存在当前浏览器的 Local Storage 中,最长保存 7 天;您可以在 AI 面板中使用“清空全部会话”立即删除这些数据。

本站不主动设置用于广告定向的第一方 Cookie。评论、统计或资源服务可能按照其自身规则使用 Cookie 或类似技术。您可以通过浏览器设置查看、删除或限制 Cookie 和本地存储;清除后,部分偏好或互动状态可能会恢复为默认值,评论功能也可能受到影响。

信息公开、保存与安全#

评论和留言属于公开互动内容,提交后可能被搜索引擎收录、被他人引用或在缓存中短暂保留。请谨慎决定发布内容。除非您提出删除请求、内容违反规则或法律法规另有要求,公开内容会持续保留以维持讨论上下文。

本站会采取合理措施保护数据安全,包括使用 HTTPS、输入校验、内容转义和访问频率限制。但互联网传输和第三方服务均无法保证绝对安全,请理解并自行承担公开发布信息的相应风险。

你的权利#

你可以通过 2639840766@qq.com 联系我,申请查询、更正或删除由本站直接保存的评论、留言或相关公开内容。为保护他人权益,请在请求中提供足以定位内容的信息,并说明你与该内容的关系;必要时可能需要进行合理核验。

对于由 Waline、Umami、Cloudflare 或 unpkg 独立处理的数据,你也可以直接向对应服务提供方行使相关权利。删除公开评论或留言后,第三方缓存、搜索引擎索引或他人转载的副本可能无法立即同步删除。

未成年人条款#

未满 14 周岁的未成年人应在监护人同意和指导下使用本站的评论、留言等互动功能。监护人如发现未成年人未经同意提交了个人信息,可通过上述联系方式与我联系,我会在合理范围内协助处理。

政策更新与联系#

我可能因本站功能或适用规则变化更新本政策,更新后的版本将在本站公布并标明日期。继续使用相关功能即表示你已阅读并理解更新后的政策。

如对本政策或数据处理有疑问,请联系 2639840766@qq.com。

用户协议

更新日期: 2026 年 5 月 19 日
生效日期: 2026 年 5 月 19 日

适用范围#

本协议适用于你访问 RanXian 的博客,以及使用文章评论、留言板等互动功能的行为。继续浏览本站或提交评论、留言,即表示你已阅读、理解并同意遵守本协议及本站的隐私政策。

评论及留言规则#

请在交流中保持友善、理性和尊重。你不得利用本站发布、传播或实施以下行为:

  • 发布任何违反中华人民共和国法律法规的内容。
  • 发布任何侵犯他人合法权益的内容,包括但不限于隐私、名誉、肖像、著作权、商标权和其他知识产权。
  • 恶意攻击、辱骂、骚扰、威胁、歧视其他用户或任何第三方。
  • 发布垃圾广告、恶意推广、刷屏、灌水,或与讨论主题明显无关的重复内容。
  • 利用本站进行网络诈骗、钓鱼、传播恶意软件,或发布可能危害网络和信息安全的内容。
  • 绕越或试图绕越本站的审核、限流、封禁等管理措施。
  • 冒充他人、伪造身份,或收集、公开他人的个人信息。

内容与访问管理#

你应对自己发布的评论和留言负责,并保证拥有发布该等内容所需的合法权利。论坛管理员有权在不另行通知的情况下删除违规内容、限制或封禁违规账号,或限制其继续使用本站互动功能。

如发现涉嫌违法犯罪、严重侵权或危及本站安全的内容,本站可保留相关记录,并在法律法规要求或必要时向有关部门提供协助。对管理措施有疑问时,可通过文末联系方式说明情况;本站会结合实际情况处理,但不承诺恢复已删除内容或访问权限。

知识产权与内容授权#

本站原创文章、页面设计和其他受保护内容的权利归作者或权利人所有。未经授权,请勿复制、转载、镜像或用于商业用途;法律法规允许的合理使用除外。

你发布评论或留言时,授予本站为展示、存储、备份、审核、删除和维护互动功能所必需的非独占、免费的使用许可。该许可不改变你对原创内容依法享有的权利。

免责声明#

本站内容仅用于个人记录、学习交流和一般信息参考,不构成任何专业意见、承诺或担保。你应结合自身情况独立判断,并对据此采取的行动负责。

评论、留言和外部链接中的内容由其发布者或运营者负责,不代表本站立场。本站会在合理范围内处理明显违规内容,但不保证所有内容均及时发现,也不对第三方网站的可用性、内容、安全性或隐私实践承担责任。

因网络故障、不可抗力、第三方服务异常、维护升级或超出合理控制范围的原因导致本站暂时无法访问、内容延迟或数据丢失的,本站会尽力恢复,但不承担由此产生的间接损失。

未成年人条款#

未满 14 周岁的未成年人应在监护人同意和指导下使用评论、留言等互动功能。监护人应协助未成年人理解本协议,并对其使用行为进行必要的引导。

其他条款#

我可以根据本站功能、管理需要或法律法规变化更新本协议,更新后的版本将在本站公布并标明日期。继续使用本站即视为接受更新后的协议。

本协议的订立、执行和解释适用中华人民共和国法律。因本协议或使用本站产生争议时,双方应先友好协商;协商不成的,依法向有管辖权的人民法院解决。

如对本协议或内容管理有疑问,请联系 2639840766@qq.com。