L版本Msensor SELinx限制问题总结

本文总结了L版本中Msensor可能遇到的SELinux限制问题,导致msensor守护进程无法正常运行的情况,并提供了针对具体错误日志的解决方案。

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

L版本Msensor SELinx限制问题总结


[DESCRIPTION]



在L版本上Msensor 要正常工作,可能会遇到一些与SELINUX限制问 题,导致msensor的deamon进程不能正常运行


[SOLUTION]


下面以型号为akm09911的msensor为例,可能出现的log总结如下
<1> [ 16.727421].(0)[1:init]avc: denied { set } for property=ctl.akmd09911
scontext=u:r:msensord:s0 tcontext=u:object_r:ctl_default_prop:s0 tclass=
property_service
<2>[ 11.198963].(0)[155:logd.auditd]type=1400 audit(1262304198.660:4): avc
: denied { open } for pid=208 comm="akmd09911" path="/dev/msensor" dev="
tmpfs" ino=3159 scontext=u:r:akmd09911:s0 tcontext
=u:object_r:msensor_device:s0 tclass=chr_file permissive=0
<3> [ 15.818871].(1)[153:logd.auditd]type=1400 audit(1262304025.210:4):
avc: denied { read write } for pid=279 comm="akmd09911" name="msensor"
dev="tmpfs" ino=3203 scontext=u:r:akmd09911:s0 tcontext
=u:object_r:msensor_device:s0 tclass=chr_file permissive=0
<4>[ 11.114422].(0)[155:logd.auditd]type=1400 audit(1262304014.670:4): avc
: denied { read write } for pid=207 comm="akmd09911" name="gsensor" dev="
tmpfs" ino=3219 scontext=u:r:akmd09911:s0 tcontext
=u:object_r:gsensor_device:s0 tclass=chr_file permissive=0
<5>[ 11.505449].(2)[153:logd.auditd]type=1400 audit(1262304014.800:4): avc
: denied { ioctl } for pid=205 comm="akmd09911" path="/dev/msensor" dev="
tmpfs" ino=61 scontext=u:r:akmd09911:s0 tcontext
=u:object_r:msensor_device:s0 tclass=chr_file permissive=0
对应以上五条解决办法
出现上面<1>的情形
按下面的方法增加语句:
(a)在文件alps/device/mediatek/common/sepolicy/property.te中增加下面的语
句(如果存在,则不需要增加)
type ctl_akmd09911_prop, property_type;
(b)在文件alps/device/mediatek/common/sepolicy/property_contexts中增加下
面的语句(如果存在,则不需要增加)
ctl.akmd09911 u:object_r:ctl_akmd09911_prop:s0
(c)在文件alps/device/mediatek/common/sepolicy/msensord.te中增加下面的语
句(如果存在,则不需要增加)
allow msensord ctl_akmd09911_prop:property_service set;
L: you can add the policy to alps/device/mediatek/common/sepolicy/xxxx.te
上面<2><3><4><5>情形
#====================== akmd09911.te ======================
allow akmd09911 msensor_device:chr_file { read write ioctl open };
allow akmd09911 gsensor_device:chr_file { read write };
如若是其它型号的msensor将名字替换即可

我还是不能生成,其中系统自带的生成函数是void System::SaveTrajectoryTUM(const string &filename) { cout << endl << "Saving camera trajectory to " << filename << " ..." << endl; if(mSensor==MONOCULAR) { cerr << "ERROR: SaveTrajectoryTUM cannot be used for monocular." << endl; return; } vector<KeyFrame*> vpKFs = mpAtlas->GetAllKeyFrames(); sort(vpKFs.begin(),vpKFs.end(),KeyFrame::lId); // Transform all keyframes so that the first keyframe is at the origin. // After a loop closure the first keyframe might not be at the origin. Sophus::SE3f Two = vpKFs[0]->GetPoseInverse(); ofstream f; f.open(filename.c_str()); f << fixed; // Frame pose is stored relative to its reference keyframe (which is optimized by BA and pose graph). // We need to get first the keyframe pose and then concatenate the relative transformation. // Frames not localized (tracking failure) are not saved. // For each frame we have a reference keyframe (lRit), the timestamp (lT) and a flag // which is true when tracking failed (lbL). list<ORB_SLAM3::KeyFrame*>::iterator lRit = mpTracker->mlpReferences.begin(); list<double>::iterator lT = mpTracker->mlFrameTimes.begin(); list<bool>::iterator lbL = mpTracker->mlbLost.begin(); for(list<Sophus::SE3f>::iterator lit=mpTracker->mlRelativeFramePoses.begin(), lend=mpTracker->mlRelativeFramePoses.end();lit!=lend;lit++, lRit++, lT++, lbL++) { if(*lbL) continue; KeyFrame* pKF = *lRit; Sophus::SE3f Trw; // If the reference keyframe was culled, traverse the spanning tree to get a suitable keyframe. while(pKF->isBad()) { Trw = Trw * pKF->mTcp; pKF = pKF->GetParent(); } Trw = Trw * pKF->GetPose() * Two; Sophus::SE3f Tcw = (*lit) * Trw; Sophus::SE3f Twc = Tcw.inverse(); Eigen::Vector3f twc = Twc.translation(); Eigen::Quaternionf q = Twc.unit_quaternion(); f << setprecision(6) << *lT << " " << setprecision(9) << twc(0) << " " << twc(1) << " " << twc(2) << " " << q.x() << " " << q.y() << " " << q.z() << " " << q.w() << endl; } f.close(); // cout << endl << "trajectory saved!" << endl; }
最新发布
03-14
<think>好的,我现在需要解决用户在使用ORB-SLAM3时无法生成轨迹文件的问题。用户提到他已经检查了文件路径权限、代码调用逻辑和系统终止方式,但问题依旧存在。用户还提供了System::SaveTrajectoryTUM函数的代码,并指出系统自带的生成函数可能存在限制。 首先,我需要回顾之前给出的建议,确保用户已经正确调用了Shutdown()并保存轨迹。用户可能已经按照步骤操作,但问题仍未解决,可能需要更深入的分析。 用户提供的SaveTrajectoryTUM函数代码显示,在单目模式下会返回错误,提示不能使用此函数。这可能是一个关键点。用户是否在使用单目模式?如果用户使用的是单目相机,那么调用SaveTrajectoryTUM确实会失败,因为该函数明确不支持单目。需要确认用户的传感器类型,如果是单目,应该改用SaveTrajectoryKITTI或其他支持的函数。 接下来,查看代码中的其他部分。函数内部首先检查传感器类型是否为单目,如果是,输出错误信息并返回。这说明用户可能在单目配置下错误地调用了该函数。需要建议用户检查配置文件中的传感器类型是否正确,并确认是否误用了单目模式下的轨迹保存方法。 另外,函数中涉及关键帧的获取和位姿变换。如果关键帧列表为空,或者第一个关键帧有问题,可能导致轨迹文件无法生成。需要检查mpAtlas->GetAllKeyFrames()是否返回了有效的关键帧,是否有足够的跟踪成功帧。如果跟踪失败较多,可能没有数据保存。 此外,代码中遍历mlRelativeFramePoses、mlpReferences等列表,如果这些列表为空,也会导致无输出。需要用户确认是否有有效的跟踪数据,例如是否视频处理过程中大部分帧丢失跟踪,导致没有数据可保存。 还可能存在时间戳的问题,如果时间戳没有正确生成或非单调递增,可能导致数据被跳过。用户需要检查时间戳生成逻辑是否正确,确保每一帧的时间戳递增。 另外,用户提到地图可以生成,但轨迹不行,这可能说明系统部分功能正常,但轨迹保存部分有特定问题。需要确认保存路径是否有效,是否有写入权限,路径中是否包含中文或空格,这些因素可能导致文件无法创建。 用户可能在Docker或ROS环境中运行,路径映射或权限问题也可能导致保存失败。需要确认输出目录是否正确挂载,是否有足够的权限。 最后,建议用户添加调试输出,例如在保存轨迹前后打印状态信息,确认函数是否被正确调用,是否有异常抛出。还可以检查ORB-SLAM3的日志,查看是否有其他错误信息被忽略。 总结可能的原因:传感器类型不匹配(单目模式下使用错误的保存函数)、关键帧数据不足、跟踪失败过多、时间戳问题、路径权限问题、环境配置问题等。需要逐一排查这些可能性,帮助用户找到根本原因。</think>根据你提供的 `System::SaveTrajectoryTUM` 函数代码,结合你提到的无法生成轨迹的问题,以下是 **针对性分析** 和 **解决方案**: --- ### 一、关键问题定位 #### 1. **传感器类型限制** ```cpp if(mSensor==MONOCULAR) { cerr << "ERROR: SaveTrajectoryTUM cannot be used for monocular." << endl; return; // 直接退出,不会生成文件 } ``` **根本原因**: 若你的系统配置为 **单目模式(MONOCULAR)**,调用 `SaveTrajectoryTUM` 会直接触发此错误并返回,导致轨迹文件无法生成。 **验证方法**: - 检查配置文件(如 `EuRoC.yaml` 或 `TUM.yaml`)中的传感器类型参数: ```yaml # 关键参数 Sensor: 0 # 0=MONOCULAR, 1=STEREO, 2=IMU-STERE0 ``` - 若 `Sensor` 设置为 `0`,则需要改用 **单目专用轨迹保存函数**: ```cpp SLAM.SaveTrajectoryKITTI("KITTI_traj.txt"); // 单目模式下使用 KITTI 格式 ``` --- ### 二、代码层深度分析 #### 1. **关键帧有效性检查** ```cpp vector<KeyFrame*> vpKFs = mpAtlas->GetAllKeyFrames(); if (vpKFs.empty()) { // 隐含风险:若关键帧列表为空,后续操作会崩溃 cerr << "WARNING: No keyframes to save trajectory!" << endl; return; } Sophus::SE3f Two = vpKFs[0]->GetPoseInverse(); // 依赖第一个关键帧 ``` **潜在问题**: - 若 SLAM 系统未成功追踪到任何关键帧(如视频输入中断、特征点不足),`vpKFs` 为空,代码会直接崩溃(但原代码未做判空保护)。 - 第一个关键帧位姿无效(如 `isBad()`)会导致后续位姿转换错误。 **解决方案**: - 在代码中添加判空保护: ```cpp if (vpKFs.empty()) { cerr << "ERROR: Keyframe list is empty!" << endl; return; } ``` - 在调用保存函数前,添加关键帧数量监控: ```cpp int num_keyframes = SLAM.GetKeyFrameCount(); if (num_keyframes < 10) { // 阈值根据场景调整 cerr << "WARNING: 关键帧数量不足,可能跟踪失败!" << endl; } ``` --- #### 2. **跟踪失败帧过滤** ```cpp for(...) { if(*lbL) continue; // 跳过跟踪失败的帧 // 仅保存跟踪成功的帧 } ``` **隐含条件**: 若视频中大部分帧追踪失败(`mlbLost` 列表多数为 `true`),轨迹文件可能为空或内容过少。 **调试方法**: - 在保存轨迹前统计跟踪失败率: ```cpp int total_frames = mpTracker->mlFrameTimes.size(); int lost_frames = count(mpTracker->mlbLost.begin(), mpTracker->mlbLost.end(), true); cout << "跟踪失败率: " << (lost_frames*100.0)/total_frames << "%" << endl; ``` - 若失败率过高,需检查: - 视频分辨率是否与配置文件匹配 - ORB 特征点提取参数(如 `nFeatures`) - 运动是否过快导致模糊 --- ### 三、针对性修复步骤 #### 1. **单目模式适配** ```cpp // 正确调用单目轨迹保存函数 SLAM.Shutdown(); if (mSensor == MONOCULAR) { SLAM.SaveTrajectoryKITTI("KITTI_Traj.txt"); // 单目专用 } else { SLAM.SaveTrajectoryTUM("TUM_Traj.txt"); // 非单目模式 } ``` #### 2. **时间戳对齐验证** 确保视频帧的时间戳严格单调递增(参考函数中 `lT` 的依赖): ```cpp // 错误示例:使用固定时间间隔(可能不符合实际帧率) // double timestamp = frame_id * 0.1; // 正确做法:根据实际帧率生成时间戳 double timestamp = cv::getTickCount() / cv::getTickFrequency(); ``` #### 3. **强制数据刷新** 在 `SaveTrajectoryTUM` 函数末尾添加: ```cpp f.flush(); // 强制写入磁盘 fsync(fileno(f)); // Linux 确保文件描述符同步 ``` --- ### 四、验证流程 1. **最小测试用例**: ```cpp // 添加调试输出 cout << "当前传感器类型: " << SLAM.GetSensorType() << endl; // 0=单目,1=双目,2=IMU SLAM.Shutdown(); SLAM.SaveTrajectoryTUM("debug_traj.txt"); ``` 2. **查看控制台输出**: - 如果输出 `ERROR: SaveTrajectoryTUM cannot be used for monocular.`,则确认传感器类型冲突。 - 若输出 `Saving camera trajectory to ...` 但无文件生成,检查文件系统权限。 --- ### 五、特殊案例参考 #### 案例 1:单目模式误用 TUM 格式 **现象**: - 配置文件设置为单目,但调用 `SaveTrajectoryTUM`,导致函数直接返回。 **修复**: ```cpp // 修改配置文件中的传感器类型为双目或 IMU Sensor: 1 # STEREO ``` 或改用 KITTI 格式保存: ```cpp SLAM.SaveTrajectoryKITTI("kitti_traj.txt"); ``` #### 案例 2:关键帧过早被剔除 **现象**: - 第一个关键帧 `vpKFs[0]` 被标记为 `bad`,导致 `Two` 计算异常。 **调试方法**: 在获取关键帧后添加状态检查: ```cpp KeyFrame* pFirstKF = vpKFs[0]; if (pFirstKF->isBad()) { cerr << "首个关键帧已被标记为 bad!" << endl; // 尝试使用下一个有效关键帧 for (auto& kf : vpKFs) { if (!kf->isBad()) { Two = kf->GetPoseInverse(); break; } } } ``` --- 请提供以下信息以进一步诊断: 1. 运行时的完整控制台输出(过滤敏感信息) 2. 实际使用的传感器配置文件内容(`.yaml`) 3. 视频的前 5 帧和最后 5 帧的时间戳(通过 `cout << timestamp << endl;` 输出) 若仍无法解决,建议在 `SaveTrajectoryTUM` 函数内添加以下调试代码: ```cpp // 在函数开头添加 cout << "[DEBUG] 进入保存函数,传感器类型: " << mSensor << endl; cout << "[DEBUG] 关键帧数量: " << vpKFs.size() << endl; cout << "[DEBUG] 相对位姿列表长度: " << mpTracker->mlRelativeFramePoses.size() << endl; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值