解决QDebug打印中文乱码问题
在使用 Qt 开发时,qDebug 打印包含中文的 QString 可能会出现乱码。这通常是由于字符编码不一致导致的。
1 |
|
在使用 Qt 开发时,qDebug 打印包含中文的 QString 可能会出现乱码。这通常是由于字符编码不一致导致的。
1 | #include <QDebug> |
Windows Server 2016默认情况下只允许一个用户通过远程桌面连接登录。通过配置远程桌面服务,可以实现多用户同时远程登录服务器,提高团队协作效率,避免用户争抢登录权限。

Win + R 打开运行对话框gpedit.msc 并回车
确保防火墙允许远程桌面连接:
1 | # 允许远程桌面连接 |
解决方案:
解决方案:
解决方案:
1 | # 查看远程桌面服务状态 |
通过以上配置,Windows Server 2016可以支持多用户同时远程登录,显著提高团队协作效率。关键配置步骤包括:
建议在生产环境中部署前进行充分测试,确保配置满足业务需求和安全要求。定期维护和监控是保证系统稳定运行的重要保障。
1 | sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' |
1 | sudo apt update |
完整桌面版 (推荐,包含 GUI 工具、仿真器和常用库):
1 | sudo apt install ros-melodic-desktop-full |
其他可选版本:
1 | sudo apt install ros-melodic-desktop # 基础桌面版(无仿真器) |
1 | sudo rosdep init |
1 | echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc |
1 | sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential |
1 | mkdir -p ~/catkin_ws/src |
打开新终端,运行:
1 | roscore |
如果看到类似以下输出,说明安装成功:
1 | ... logging to /home/username/.ros/log/xxx/roslaunch-hostname-xxx.log |
如果 apt-key adv 失败,可以手动下载并添加:
1 | curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add - |
如果下载速度慢,可以替换为国内镜像源(如清华源):
1 | sudo sh -c '. /etc/lsb-release && echo "deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list' |
确保系统中已安装 Python 2.7:
1 | python --version # 应显示 Python 2.7.x |
安装完成后,可以使用以下命令测试 ROS 功能:
roscore - 启动 ROS masterrosrun roscpp_tutorials talker - 运行发布者节点rosrun roscpp_tutorials listener - 运行订阅者节点LIO-SAM (Lidar Inertial Odometry and Mapping) 是一个紧耦合的激光雷达惯性里程计框架,集成了 IMU 预积分和 GPS 数据,适用于机器人建图和定位。
| 组件 | 版本 | 下载地址 |
|---|---|---|
| Ubuntu | 18.04+ | - |
| ROS | Melodic | - |
| gtsam | 4.0.2 | GitHub |
| Eigen | 3.3.7 | GitLab |
| LIO-SAM | 最新版 | GitHub |
1 | # 更新系统包列表 |
1 | # 下载并解压 Eigen |
1 | # 设置 ROS 软件源(清华镜像) |
1 | # 将 ROS 环境变量添加到 bashrc |
1 | # 克隆 gtsam 仓库 |
1 | # 创建工作空间 |
1 | # 启动 ROS 核心 |
1 | # 检查 LIO-SAM 包是否存在 |
问题:编译时出现 fatal error: Eigen/Dense: No such file or directory
解决方案:
1 | # 确保 Eigen 头文件在正确位置 |
问题:需要特定版本的 gtsam
解决方案:
1 | # 确保使用 gtsam 4.0.2 版本 |
问题:缺少 ROS 包依赖
解决方案:
1 | # 安装所有缺失的依赖 |
1 | # 启动 LIO-SAM 主要节点 |
1 | # 播放 bag 文件 |
1 | ~/catkin_ws/ |
config/params.yamlnvidia-smi 是 NVIDIA 的系统管理界面(System Management Interface),用于监控和管理 NVIDIA GPU 设备。它是 NVIDIA 驱动安装包的一部分,无需额外安装。
核心功能:
支持的产品:
命令:nvidia-smi
这是最常用的命令,显示所有 GPU 的实时状态摘要。

输出字段详解:
| 字段 | 含义 |
|---|---|
| GPU | 本机中的 GPU 编号(从 0 开始) |
| Name | GPU 型号(如 Tesla V100) |
| Fan | 风扇转速(百分比) |
| Temp | GPU 核心温度(摄氏度) |
| Perf | 性能状态(P0-P12,P0 为最高性能) |
| Pwr:Usage/Cap | 当前功耗 / 最大设计功耗 |
| Bus-Id | PCI 总线 ID(格式:domain:bus:device.function) |
| Disp.A | Display Active,显示是否初始化 |
| Memory-Usage | 显存使用情况(已用 / 总量) |
| Volatile GPU-Util | GPU 计算单元利用率(百分比) |
| Uncorr. ECC | 未纠正的 ECC 错误计数 |
| Compute M. | 计算模式(Default, Exclusive_Process 等) |
| Processes | 显示占用该 GPU 的进程及其显存使用量 |
命令:nvidia-smi -L
以简洁格式列出系统中所有 NVIDIA GPU 设备。
1 | GPU 0: Tesla V100-SXM2-32GB (UUID: GPU-xxxxxx) |
命令:nvidia-smi topo --matrix
显示 GPU 之间以及 GPU 与 CPU、其他 PCIe 设备(如 InfiniBand 网卡)的互连拓扑。这对于配置 GPUDirect 等高级功能至关重要。

命令:nvidia-smi -q
显示指定 GPU(或所有 GPU)的极其详细的信息报告。可以通过 -i <gpu_id> 指定 GPU。
报告包含的主要部分:

查看当前时钟:nvidia-smi -q -d CLOCK
显示 GPU 的当前图形、内存和 SM 时钟速度,以及默认和最大时钟。
查看支持的时钟列表:nvidia-smi -q -d SUPPORTED_CLOCKS
列出 GPU 支持的所有可用时钟速度组合。
命令:nvidia-smi vgpu
查看虚拟化环境中 vGPU 的状态信息。如果系统未启用 vGPU,会提示不支持。
动态监控 vGPU 进程:nvidia-smi vgpu -p
以滚动刷新的方式循环显示虚拟桌面中应用程序对 GPU 资源的占用情况。
命令:nvidia-smi -pm <0/1>
0 或 DISABLED:禁用持久化模式(默认)。GPU 驱动在最后一个客户端断开连接后会卸载。1 或 ENABLED:启用持久化模式。驱动始终保持加载状态,减少后续应用启动的延迟。1 | # 为 GPU 0 启用持久化模式 |
nvidia-smi -e <0/1>0 或 DISABLED:禁用 ECC。1 或 ENABLED:启用 ECC(需要重启生效)。nvidia-smi -p <0/1>0 或 VOLATILE:重置易失性错误计数。1 或 AGGREGATE:重置聚合性错误计数。命令:nvidia-smi -c <MODE>
控制 GPU 如何被计算应用程序共享。
| 模式值 | 模式名称 | 描述 |
|---|---|---|
0 |
DEFAULT |
多个计算应用可以共享 GPU(默认)。 |
1 |
EXCLUSIVE_THREAD |
已弃用。 |
2 |
PROHIBITED |
禁止任何计算应用使用 GPU。 |
3 |
EXCLUSIVE_PROCESS |
一个计算进程可以独占 GPU,该进程内的多个线程可共享。 |
1 | # 将 GPU 0 设置为独占进程模式 |
命令:nvidia-smi -r
在 GPU 无响应或状态异常时,尝试触发 GPU 复位。此操作可能导致正在运行的进程崩溃,请谨慎使用。
nvidia-smi -l <秒数>nvidia-smi -l 2 每 2 秒刷新一次显示。nvidia-smi -lms <毫秒数>nvidia-smi -lms 500 每 500 毫秒刷新一次。使用 -f 或 --filename 参数将输出重定向到文件,便于后续分析。
1 | # 将详细查询结果保存到文件 |
使用 -i 或 --id 参数对特定的 GPU 进行操作。
1 | # 仅查看 GPU 1 的详细信息 |
使用 -x 或 --xml-format 参数,便于脚本解析。
1 | nvidia-smi -q -x |
| 参数类别 | 参数 | 功能描述 |
|---|---|---|
| 帮助 | -h, --help |
打印帮助信息。 |
| 列表 | -L, --list-gpus |
列出所有连接的 GPU。 |
| 查询 | -q, --query |
查询 GPU 详细信息。 |
-d, --display= |
选择性显示信息(如 MEMORY, CLOCK)。 |
|
| 目标 | -i, --id= |
指定目标 GPU ID(如 0, 0,2)。 |
| 输出 | -f, --filename= |
将输出保存到文件。 |
-x, --xml-format |
以 XML 格式输出。 | |
| 监控 | -l, --loop= |
按指定秒数间隔循环刷新。 |
-lms, --loop-ms= |
按指定毫秒数间隔循环刷新。 | |
| 管理 | -pm, --persistence-mode= |
设置持久化模式 (0/1)。 |
-e, --ecc-config= |
启用/禁用 ECC (0/1)。 | |
-c, --compute-mode= |
设置计算模式 (0-3)。 | |
-r, --gpu-reset |
触发 GPU 复位。 |
nvidia-smi 是管理和监控 NVIDIA GPU 不可或缺的工具。掌握其核心用法:
nvidia-smi 或 nvidia-smi -l 1 实时查看 GPU 状态。nvidia-smi -q 获取详细报告,分析温度、功耗、ECC 错误和进程占用。-pm、-c 等参数调整 GPU 运行模式以适应不同工作负载。-f、-x 参数将输出重定向或格式化为 XML,便于集成到监控系统中。官方资源:
nvidia-ml-py):http://pypi.python.org/pypi/nvidia-ml-py/建议准备一个干净、换好源的 Ubuntu 16.04 及以上版本(建议 清华源 ),本教程也适用其他 ROS1版本。
查看ubuntu 版本
1 | lsb_release -a |
根据自己的 Ubuntu 的版本选择 ROS 版本 (示例是 Ubuntu 18.04 所以对应ROS版本为 melodic)
![[Ubuntu部署ROS/IMG-20250829234441526.png]]
1 | sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list' |
1 | sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 |
1 | sudo apt update |
1 | echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc |
在使用许多 ROS 工具之前,需要初始化 rosdep,有些功能包源码编译需要rosdep 来安装这些系统依赖项,不配置也不影响ros使用,所以后面需要时再来配置也可以。 rosdep 请求的文件都放在 github 上的, 推荐使用代理。
1 |
|
1 | roscore |
参考
官方文档(melodic)
ubuntu18.04安装ROS Melodic(最详细配置)-CSDN博客
基于Ubuntu18.04的ROS Melodic环境详细配置(含各种大坑及填坑)
[ROS 系列学习教程] ROS与操作系统版本对应关系_ros版本-CSDN博客
目标检测模型的效果高度依赖三个核心参数的调优:置信度阈值、IoU 阈值和图像尺寸。本文详细解析这三个参数的作用、推荐值及实战组合。
置信度是模型对「检测框内存在目标」的确信程度,取值范围 0~1。
过滤低置信度预测框,减少误报。
1 | results = model(img, conf=0.5) |
| 场景 | 推荐值 | 说明 |
|---|---|---|
| 高召回(不漏检) | 0.3~0.4 |
安防监控,宁可误报不漏检 |
| 平衡精度与召回 | 0.5 |
通用推荐 |
| 高精度(少误报) | 0.6~0.7 |
自动报警系统 |
⚠️ 太高漏检,太低误报
IoU 是两个边界框的重叠程度:
$$IoU = \frac{交集面积}{并集面积}$$
0 → 完全不重叠1 → 完全重合用于非极大值抑制(NMS),去除重复检测框。
1 | results = model(img, iou=0.45) |
| IoU 值 | 效果 |
|---|---|
0.2~0.3 |
严格,易漏检 |
0.4~0.5 |
推荐,平衡去重与保留 |
0.6~0.7 |
宽松,可能保留多框 |
⚠️ 太低过度去重,太高重复框多
推理时输入模型的图像尺寸,如 640x640。训练时固定尺寸,推理时自动缩放。
1 | results = model(img, imgsz=640) |
图像保持比例缩放,短边拉伸,长边补灰边。
| imgsz | 精度 | 速度 | 适用场景 |
|---|---|---|---|
320 |
较低 | 快 | 实时性高、大目标 |
480 |
中等 | 快 | 小目标不多 |
640 |
高 | 一般 | 通用推荐 |
800~960 |
更高 | 慢 | 小目标多(远处物体) |
⚠️ 太小小目标丢失,太大计算慢
| 参数 | 全称 | 作用 | 默认值 | 推荐值 |
|---|---|---|---|---|
conf |
Confidence | 过滤低置信预测 | 0.25 |
0.5 |
iou |
Intersection over Union | 去除重复框 | 0.45 |
0.45 |
imgsz |
Image Size | 输入分辨率 | 640 |
640 |
1 | from ultralytics import YOLO |
| 场景 | conf | iou | imgsz | 说明 |
|---|---|---|---|---|
| 通用检测 | 0.5 |
0.45 |
640 |
推荐起点 |
| 安全报警 | 0.6 |
0.45 |
640 |
减少误报 |
| 小目标检测 | 0.4 |
0.45 |
800 |
提高召回率 |
| 实时检测 | 0.5 |
0.45 |
480 |
提升速度 |
conf=0.5, iou=0.45, imgsz=640conf 或增大 imgsziouimgsz当 Linux 系统的物理内存(RAM)耗尽时,内核会将内存中不活跃的“页面”移动到硬盘上的一个预配置区域,这个区域就是 SWAP 空间。物理内存与 SWAP 空间的总和称为虚拟内存。
注意:在虚拟机中安装 Ubuntu 时,系统通常不会自动创建 SWAP 空间,需要手动配置。
在开始操作前,首先检查系统当前的 SWAP 配置。
1 | sudo swapon --show |
如果输出为空,则表示系统未启用任何 SWAP 空间。
1 | sudo free -h |
该命令会显示物理内存和 SWAP 的总量、已用量及空闲量。
与分区相比,SWAP 文件更灵活,可以轻松调整大小,且不涉及磁盘分区操作。以下是创建 2GB SWAP 文件的完整步骤。
1 | sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 |
if=/dev/zero:输入源,一个输出全零字节的特殊设备。of=/swapfile:输出文件路径。bs=1M:块大小为 1MB。count=2048:块数量。计算:1MB × 2048 = 2GB。提示:要创建不同大小的文件,只需修改
count值(例如count=1024为 1GB)。
SWAP 文件必须严格限制访问权限,防止被普通用户读取。
1 | sudo chmod 600 /swapfile |
1 | sudo mkswap /swapfile |
此命令会在文件上设置特殊的 SWAP 签名。
1 | sudo swapon /swapfile |
现在,SWAP 文件已加入系统交换池并立即生效。
编辑 /etc/fstab 文件,在末尾添加一行:
1 | sudo nano /etc/fstab |
添加以下内容:
1 | /swapfile swap swap defaults 0 0 |
保存并退出(Ctrl+X,然后按 Y 确认)。
再次运行检查命令,确认 SWAP 文件已成功激活:
1 | sudo swapon --show |
swappiness 是一个内核参数(范围 0-100),用于控制内核使用 SWAP 空间的积极程度。
601 | cat /proc/sys/vm/swappiness |
例如,设置为 40(对服务器更友好):
1 | sudo sysctl vm.swappiness=40 |
编辑 /etc/sysctl.conf 文件:
1 | sudo nano /etc/sysctl.conf |
在文件末尾添加或修改以下行:
1 | vm.swappiness=40 |
保存后,运行以下命令使更改立即生效:
1 | sudo sysctl -p |
最佳实践建议:
30-60(平衡响应性与内存使用)。10-30(减少慢速交换,优先使用 RAM)。1-10(几乎禁用交换,除非紧急)。如果您不再需要某个 SWAP 文件,请按以下步骤安全移除。
1 | sudo swapoff -v /swapfile |
-v 参数显示详细过程。
/etc/fstab 中移除配置编辑 /etc/fstab 文件,删除或注释掉之前添加的 /swapfile 那一行。
1 | sudo nano /etc/fstab |
1 | sudo rm /swapfile |
调整分区大小通常需要:
swapoff 停用分区。GParted 等图形化分区工具或 parted 命令行工具调整分区边界。mkswap 重新格式化。swapon 重新激活。注意:此操作有风险,且需要分区后方有未分配的连续空间。
这是 SWAP 文件的最大优势。例如,将现有的 2GB 文件扩容到 4GB:
步骤 1:停用当前 SWAP 文件
1 | sudo swapoff /swapfile |
步骤 2:调整文件大小
1 | # 方法A:使用 dd 追加 2GB(总大小变为 4GB) |
步骤 3:重新设置权限并格式化
1 | sudo chmod 600 /swapfile |
步骤 4:重新激活 SWAP 文件
1 | sudo swapon /swapfile |
步骤 5:验证新大小
1 | sudo swapon --show |
| 系统物理内存 (RAM) | 推荐 SWAP 大小 | 休眠支持所需 SWAP |
|---|---|---|
| ≤ 2 GB | RAM 的 2 倍 | RAM 的 2-3 倍 |
| 2 - 8 GB | 等于 RAM 大小 | RAM 的 1.5 倍 |
| 8 - 64 GB | 至少 4 GB | RAM 的 1 倍 |
| > 64 GB | 至少 4 GB(主要用于休眠) | RAM 的 0.5 倍 |
说明:
swapon --show 和 free -h 了解当前状态。/etc/fstab 和 /etc/sysctl.conf。free -h 或 htop 监控 SWAP 使用率。如果 SWAP 被频繁使用(>20%),应考虑增加物理内存。从 GitHub Releases 下载:
1 | # 重命名简化 |
编辑 ~/.bashrc,添加Qt路径(根据实际安装路径调整):
1 | #add qt env |
使配置生效:
1 | source ~/.bashrc |
注意:最关键的是
PATH环境变量,其他变量可能非必需。
准备目录结构:
1 | mkdir -p TestSetup/Test |
执行依赖拷贝:
1 | cd TestSetup/Test |
重要提示:
- 确保应用为 Release 版本
linuxdeployqt内部使用ldd,仅能处理隐式加载的.so文件- 对于显式加载的
.so(如dlopen),需手动处理其依赖:
1
2
3 # 示例:若 A.so 显式加载 B.so,而 B.so 隐式依赖 C.so
# 需对 B.so 单独执行:
linuxdeployqt B.so -appimage
清除Qt环境变量后测试:
1 | # 清除环境变量(仅当前终端) |
1 | TestSetup/ |
创建目录:
1 | mkdir -p TestSetup/{output,source/{DEBIAN,opt/Test}} |
编辑 TestSetup/source/opt/Test/Test.desktop:
1 | [Desktop Entry] |
注意:
- 路径必须是安装后的绝对路径(非打包路径)
- 需赋予执行权限:
chmod +x Test.desktop- 准备图标文件:
Test.png
TestSetup/source/DEBIAN/control:
1 | Package: mytest # 包名(卸载时使用) |
TestSetup/source/DEBIAN/postinst:
1 | #!/bin/sh |
TestSetup/source/DEBIAN/postrm:
1 | #!/bin/sh |
脚本要求:
- 首行必须为
#!/bin/sh- 赋予执行权限:
chmod +x DEBIAN/{postinst,postrm}
1 | cd TestSetup/source |
1 | cd TestSetup/output |
验证效果:
/opt/Test/1 | # 使用control文件中的Package字段值 |
卸载效果:
/opt/Test/ 目录postrm 中配置)删除应用日志.so 需单独处理依赖.desktop 文件中的路径必须匹配安装路径DEBIAN 目录下的脚本必须有执行权限control 中的 Package 字段需全局唯一通过 linuxdeployqt + dpkg 组合,可高效生成符合 Linux 发行版规范的安装包,实现依赖自动管理、快捷方式集成和干净卸载。