evince: error while loading shared libraries: liblzma.so.0: cannot open shared object file: ......

今天在一个打开多天的terminal里,使用evince命令打开PDF文档时,提示如下error:

evince: error while loading shared libraries: liblzma.so.0: cannot open shared object file: No such file or directory

经过多次尝试,发现原因是terminal打开时间久了,重新开一个terminal,问题解决了。

你看到的错误: ``` No tf data. Actual error: Frame [livox_frame] does not exist ``` 是 ROS 2(或 ROS)中非常常见的 TF(Transform)问题,表示:**系统尝试查询某个坐标系的变换时,发现名为 `livox_frame` 的坐标系不存在。** --- ## 🔍 错误含义详解 ### 📌 核心问题: TF 系统无法找到名为 `livox_frame` 的坐标系(frame),可能是因为: 1. **没有发布该 frame 的 tf 变换** 2. **传感器(如 Livox 激光雷达)节点未启动或配置错误** 3. **URDF 中未定义该 link** 4. **tf 发布延迟或频率太低** 5. **frame 名称拼写错误(大小写敏感!)** --- ## ✅ 解决方案分步排查 ### ✅ 步骤 1:确认 `livox_frame` 是否在 URDF 或 xacro 中定义 如果你使用了机器人模型(`.urdf` 或 `.xacro`),检查是否定义了名为 `livox_frame` 的 `<link>`。 示例: ```xml <link name="livox_frame"> <visual> <geometry> <box size="0.1 0.1 0.1"/> </geometry> </visual> </link> ``` 并且有对应的 `<joint>` 连接到 base_link: ```xml <joint name="lidar_joint" type="fixed"> <parent link="base_link"/> <child link="livox_frame"/> <origin xyz="0.5 0 0.3" rpy="0 0 0"/> </joint> ``` > ⚠️ 如果没定义这个 link,则 TF 树里就不会存在 `livox_frame`。 --- ### ✅ 步骤 2:检查 TF 树实际状态 运行以下命令查看当前 TF 树结构: ```bash ros2 run tf2_tools view_frames ``` 这会生成一个 `frames.pdf` 文件(通常在当前目录): ```bash # 执行后生成 frames.pdf ros2 run tf2_tools view_frames evince frames.pdf # 查看 PDF(需要安装 evince) ``` 🔍 在图中查找是否有 `livox_frame` 节点。 如果没有 → 表明没有任何节点在发布它。 --- ### ✅ 步骤 3:检查是否有节点在发布 livox_frame 的 tf 运行: ```bash ros2 node list ros2 topic echo /tf ros2 topic echo /tf_static ``` - `/tf`:动态变换(如移动关节) - `/tf_static`:静态变换(如传感器固定位置) 观察输出中是否包含: ```yaml - header: frame_id: base_link child_frame_id: livox_frame transform: translation: {x: 0.5, y: 0.0, z: 0.3} rotation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0} ``` ✅ 如果没有,请确保你的 **robot_state_publisher** 正确加载了包含 `livox_frame` 的 URDF。 启动示例: ```bash ros2 run robot_state_publisher robot_state_publisher your_robot.urdf ``` 或者通过 launch 文件加载 xacro。 --- ### ✅ 步骤 4:Livox 驱动是否手动发布了错误的 frame? 某些 Livox SDK 的 ROS 包(如 `livox_ros_driver2`)会在代码中硬编码 `frame_id`。 检查其参数配置。 例如,在启动 `livox_ros_driver2` 时,应设置正确的 frame_id: ```xml <param name="frame_id" value="livox_frame"/> ``` 或通过命令行: ```bash ros2 launch livox_ros_driver2 msg_MID360_launch.py frame_id:=livox_frame ``` 📌 确保: - 参数 `frame_id` 设置为 `livox_frame` - 且该 frame 已被其他部分(如 URDF)声明为合法 link 否则会出现“孤立 frame”或找不到的问题。 --- ### ✅ 步骤 5:等待 tf 初始化完成(时间同步问题) 有时你在节点刚启动时就请求 tf 变换,但 tf 尚未发布。 解决方法:使用 `tf2_ros::BufferClient` 或带超时等待的 lookup: #### 示例代码(C++): ```cpp #include <tf2_ros/transform_listener.h> #include <tf2_ros/buffer.h> tf2_ros::Buffer buffer(this->get_clock()); tf2_ros::TransformListener listener(buffer); try { geometry_msgs::msg::TransformStamped transform = buffer.lookupTransform( "map", "livox_frame", tf2::TimePointZero, // 最新可用 std::chrono::duration<double>(2.0) // 等待最多 2 秒 ); } catch (const tf2::TransformException &ex) { RCLCPP_ERROR(this->get_logger(), "TF Error: %s", ex.what()); } ``` > 使用 `tf2::TimePointZero` + 超时机制避免立即失败。 --- ### ✅ 步骤 6:临时添加 static_transform_publisher(测试用) 如果你想快速验证是否是 tf 缺失导致的问题,可以手动补一个静态 tf: ```bash ros2 run tf2_ros static_transform_publisher 0.5 0.0 0.3 0.0 0.0 0.0 base_link livox_frame ``` 这条命令表示: - 把 `livox_frame` 固定在 `base_link` 前方 0.5m、上方 0.3m 处 - 无旋转 ✅ 执行后再次查看 `view_frames` 或运行你的程序,应该不再报错。 > ✔️ 成功说明:确实是缺少 tf 发布;你需要将此变换写入 URDF 或 launch 文件。 --- ## ✅ 总结:修复流程清单 | 步骤 | 操作 | |------|------| | 1 | 检查 URDF/xacro 是否定义了 `<link name="livox_frame">` | | 2 | 启动 `robot_state_publisher` 并正确加载 URDF | | 3 | 使用 `ros2 topic echo /tf_static` 确认是否发布了该 frame | | 4 | 若使用 Livox 驱动,检查 `frame_id` 参数是否设为 `livox_frame` | | 5 | 使用 `ros2 run tf2_tools view_frames` 生成 TF 树图谱 | | 6 | 必要时用 `static_transform_publisher` 测试补丁 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值