linux内核中时间的辨析

本文讲述了在Linux内核5.4.89中遇到的获取当前时间戳的问题。原来使用的CURRENT_TIME宏已过时,现在inode的a_time、c_time和m_time改为timespec64类型。作者发现使用ktime_get_ts64得到的是1970年的初始时间,原因是混淆了CLOCK_MONOTONIC和CLOCK_REALTIME的区别。解决办法是改用ktime_get_real_ts64以获取CLOCK_REALTIME时间,但内核中已有current_time函数可以直接使用。此外,作者还推荐了ctags作为比SourceInsight更有效的代码搜索工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在samplefs中遇到了一个获取当前时间戳的问题,源代码中使用的是过时的宏CURRENT_TIME获取当前时间,在新内核中,inode的a_timec_timem_time
都调整为timespec64类型,而且内核的时间模块也经过了相当大的调整,所以需要进行修改来适应当前的内核(5.4.89)。

经过一番查阅后,使用如下的代码获取当前时间戳:

struct timespec64 ts;
ktime_get_ts64(&ts);
inode->m_time = ts;

但是发现得到的时间是1970年的初始时间戳,这个问题是因为对于linux的时间理解不够详细,主要是对于CLOCK_MONOTONICCLOCK_REALTIME的理解出现了偏差。简单来说,CLOCK_MONOTONIC指的是系统启动到当前的时间,这个时间是不可以修改的,而CLOCK_REALTIME也就是我们常说的墙钟时间,即从1970年到现在经过的时间。

而在ktime_get_real的官方文档中也提到:

This is used for all timestamps that need to persist across a reboot, like inode times, but should be avoided for internal uses, since it can jump backwards due to a leap second update, NTP adjustment settimeofday() operation from user space.

所以对于inode的三个时间成员的时间戳获取应该使用CLOCK_REALTIME,代码中改成ktime_get_real_ts64即可正常获取当前时间戳。

顺便说一下,上文文档中提到避免internal use,之后发现在新内核中,fs/inode.c中实现了一个struct timespec64 current_time(struct inode *inode)函数,所以可以不用ktime_get_real_ts64这个函数了。

另外:ctags真好用,比source insight高到不知道哪里去了。就拿current_time这个函数来说,Source Insight一直表示找不到定义,ctags瞬间就找到了。。。

参考资料:CLOCK_MONOTONIC与CLOCK_REALTIME区别kernel.org/core-api/timekeeping.cLinux下安装和使用ctags

<think>好的,我需要回答用户关于LIO架构的问题。首先,用户提到的LIO可能指的是激光雷达-惯性里程计(Lidar-Inertial Odometry)系统,比如LIO-SAM,也可能涉及Linux中的LIO(Linux-IO)存储框架。但根据用户提供的引用内容,引用1、4提到了LIO-SAM建图,引用2、3涉及Linux的LIO工具。因此,我需要区分这两种可能性,并给出相应的解释。 首先,确认用户的需求。用户询问的是“LIO架构”,但引用中既有关于SLAM的LIO-SAM,也有Linux存储的LIO。需要进一步分析用户可能的意图。用户之前的问题可能涉及机器人建图或SLAM,因为引用了IMU和激光雷达融合的LIO-SAM,而Linux的LIO工具可能与之无关。但为了全面,可能需要简要提及两种可能性,但重点放在LIO-SAM上,因为引用1和4更相关,且用户提到了“使用方法”或“教程”,这可能指向LIO-SAM的应用。 接下来,我需要整理LIO-SAM的架构。根据引用1,LIO-SAM的配置文件包括基本参数、内参、外参和其他参数。处理流程可能包括IMU预积分、激光运动畸变校正(引用4提到的),以及融合方法。架构部分应包括传感器数据输入、预处理、因子图优化、输出模块等。 另外,用户可能想知道如何使用LIO-SAM,比如安装、配置参数(如params.yaml中的设置)、运行步骤等。引用1提到了配置文件的路径和修改部分,需要详细说明各部分的配置项,如传感器参数、坐标系外参、算法参数等。 同时,引用4提到了IMU数据用于运动畸变校正,这部分需要解释LIO-SAM如何处理激光点云的运动畸变,利用IMU的旋转和平移增量进行校正。 此外,可能还需要比较LIO与其他SLAM架构(如LOAM、VINS等)的区别,突出LIO-SAM的紧耦合和因子图优化的优势。 关于Linux的LIO存储框架,引用2和3提到的是SCSI target配置,用户可能混淆了这两个概念,但根据上下文,用户更可能关注机器人领域的LIO。不过,为了全面,还是需要简要说明,但明确区分两者。 最后,生成相关问题,引导用户进一步提问,例如关于配置细节、优化方法、实际应用中的问题等。</think>### LIO架构解析与使用指南 #### 一、LIO架构的两种含义辨析 1. **机器人领域的LIO(Lidar-Inertial Odometry)** 指激光雷达与惯性测量单元(IMU)紧耦合的SLAM架构,典型代表为$LIO-SAM$[^1]。其核心思想是通过因子图优化实现多传感器数据融合,适用于机器人定位与建图。 2. **Linux存储系统的LIO(Linux-IO Target)** 是Linux内核实现的SCSI target框架[^2],用于构建存储服务器(如iSCSI)。其架构包含backstores(存储后端)、targets(目标设备)和ACL管理模块[^3]。 根据引用内容和问题上下文,以下重点解析机器人领域的LIO-SAM架构。 --- #### 二、LIO-SAM架构详解(机器人领域) ##### 1. 系统组成 $$系统架构 = \begin{cases} \text{传感器输入层} & (激光雷达+IMU+可选GPS)\\ \text{预处理模块} & (IMU预积分/点云去畸变)\\ \text{因子图优化层} & (IMU/激光/GPS多因子融合)\\ \text{输出层} & (位姿/地图/闭环检测) \end{cases}$$ 引用[4]指出其关键点云畸变校正方法:**利用IMU积分计算相邻激光帧间的位姿变化,将点云投影到统一坐标系**。 ##### 2. 数据处理流程 ```mermaid graph TD A[IMU数据] --> B[IMU预积分] C[激光点云] --> D[运动畸变校正] B --> E[因子图优化] D --> E E --> F[全局地图更新] F --> G[闭环检测] ``` ##### 3. 配置文件结构(以params.yaml为例) ```yaml # 引用[1]示例配置 lio_sam: # 1. 基本参数 sensor: "velodyne" # 激光雷达型号 imuTopic: "/imu_data" # IMU话题名称 # 2. 内参校准 lidar2imu: [0.1, 0, 0.2, 0, 0, 0] # 雷达与IMU的外参 # 3. 算法参数 mappingSurfLeafSize: 0.2 # 点云降采样分辨率 loopSearchRadius: 15.0 # 闭环检测半径 ``` --- #### 三、LIO-SAM使用教程(关键步骤) 1. **环境部署** ```bash # 安装ROS依赖 sudo apt-get install ros-noetic-lio-sam # 克隆代码库 git clone https://github.com/TixiaoShan/LIO-SAM.git ``` 2. **参数配置** - 修改`params.yaml`中的传感器话题名 - 校准`lidar2imu`外参(需标定工具) - 调整点云处理参数(如`mappingSurfLeafSize`) 3. **运行指令** ```bash roslaunch lio_sam run.launch # 实时显示建图效果 rosrun rviz rviz -d src/LIO-SAM/config/mapping.rviz ``` --- #### 四、性能优化建议 1. **IMU去噪**:增加IMU低通滤波器参数`imuFilterCutoff` 2. **计算加速**:调整`edgeFeatureMinValidNum`减少特征点数量 3. **内存优化**:设置`globalMapVisualizationInterval`降低地图更新频率 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值