深感智护 SenseGuard

第一周任务

11 月 11 日(周三)调研汇报会前完成。先做学习任务,调研只做自己组的部分。

这周要做到什么

11 月 11 日调研汇报会前,每个人只需要交一个 Pull Request(合并请求),里面是你自己写的 FFT 小作业。走完它,Linux、Git、Python 三门必修就都碰过一遍了。预计 5 小时左右,可以分几个晚上做。

顺序 做什么 预计用时 做完的样子
1 装好环境 30–60 分钟 3 条检查命令都输出版本号
2 Linux 命令行 1 小时 能进目录、看日志、管文件、SSH 登录
3 Git 和 GitHub 1.5 小时 解决一次冲突,代码出现在 GitHub 上
4 Python 和 FFT 1.5 小时 找出信号频率,提交 Pull Request

做完后把 PR 链接发到飞书群。调研任务另算,只做自己组的部分,见调研任务书。

可以用大模型学习和查错,但不许直接贴它的回答。组会上会随机问“这行代码为什么这样写”,要能自己讲清楚。

第 1 步:按你的电脑装好环境

这一步的目标是得到一个能跑 Linux 命令的黑色窗口,它叫“终端”。装好之后,后面所有命令在三种系统上写法都一样。

Windows:用 WSL

WSL 是 Windows 自带的 Linux 子系统,不用装双系统,也不用虚拟机软件。

  1. 右键点开始菜单,选“终端(管理员)”,运行下面的命令。它会下载并安装 Ubuntu,需要几分钟。
wsl --install -d Ubuntu-24.04
  1. 重启电脑,从开始菜单打开 Ubuntu。
  2. 第一次打开时要设置用户名和密码。用户名用小写英文。输入密码时屏幕不显示任何字符,这是正常的,输完回车即可。
  3. 在 Ubuntu 窗口里运行下面的命令,安装这周要用的软件。sudo 表示用管理员权限运行,会要你输入刚设置的密码。
sudo apt update && sudo apt install -y git python3-venv openssh-server

以后做任务都在 Ubuntu 窗口里,不要用 PowerShell。如果窗口里显示 PS C:\Users\...>,说明你还在 PowerShell,输入 wsl 回车就能进入 Ubuntu。

macOS:用自带的“终端”

macOS 不需要 WSL。按 Cmd+空格,搜索“终端”并打开,运行下面的命令,在弹窗里点“安装”。它会装好 git 和 python3。

xcode-select --install

Ubuntu:直接用

按 Ctrl+Alt+T 打开终端,运行上面 Windows 第 4 步的 sudo apt 命令。

检查是否装好

依次运行下面三条,每条都输出版本号就过关,版本号不用和别人一样。

git --version
python3 --version
ssh -V

三种系统只差这几处

要做的事 Windows(WSL) macOS Ubuntu
粘贴命令 Ctrl+Shift+V Cmd+V Ctrl+Shift+V
用文件管理器打开当前目录 explorer.exe . open . xdg-open .
启动 SSH 服务 sudo service ssh start 系统设置 > 通用 > 共享 > 打开“远程登录” sudo service ssh start

终端里的 Ctrl+C 不是复制,而是停止当前程序。Windows 用户把项目放在 ~ 下,不要放在 /mnt/c 下,那里读写慢,也容易出权限问题。

写代码推荐用 VS Code。Windows 用户再装一个 WSL 扩展,之后在 Ubuntu 窗口的项目目录里运行 code . 就能打开。

参考教程:微软官方 WSL 安装说明 · CSDN:Windows 11 WSL + Ubuntu 24.04 安装指南

第 2 步:Linux 命令行

以后的雷达和开发板大多没有图形界面,只能靠命令行操作。这一步用一段模拟雷达日志,练看日志、管文件和远程登录。这段日志是脚本生成的,不是真实设备的输出。

先学会看路径

~ 是你的主目录,. 是当前目录,.. 是上一级目录。Linux 里的路径用 / 分隔,大小写敏感。按 Tab 键可以自动补全文件名,按上方向键可以调出上一条命令,这两个键能省掉大部分打字和拼写错误。

建项目目录

mkdir -p ~/senseguard-week1/data ~/senseguard-week1/scripts ~/senseguard-week1/output
cd ~/senseguard-week1
pwd
ls

mkdir -p 建目录,cd 进入目录,pwd 显示当前位置,ls 列出文件。你应该看到路径以 senseguard-week1 结尾,并列出 data、output、scripts。后面所有命令都在这个目录里运行。

生成模拟日志

运行 nano scripts/fake_radar.py 打开编辑器,粘贴下面的代码,按 Ctrl+O、回车保存,再按 Ctrl+X 退出。用 VS Code 新建这个文件也可以。

import random
import time

with open("data/radar.log", "w") as f:
    for i in range(60):
        distance = max(1.5, 4.0 - 0.1 * i) + random.gauss(0, 0.05)
        if random.random() < 0.1:
            distance = -1.0  # 这一帧没测到
        f.write(f"{i * 0.5:.1f},{distance:.2f}\n")
        f.flush()
        time.sleep(0.5)

它模拟一个人从 4 米外走到 1.5 米处,写 30 秒。每行是“时间(秒),距离(米)”,距离为 -1.00 的是坏帧。

实时看日志

开两个终端窗口,都先运行 cd ~/senseguard-week1。

窗口 A 运行脚本:

python3 scripts/fake_radar.py

窗口 B 运行下面的命令,你会看到日志一行行冒出来。以后看设备运行情况,用的就是这个办法。看完按 Ctrl+C 退出。

tail -f data/radar.log

练这几个命令

每条都自己敲一遍,并看懂输出。

命令 它做什么 你应该看到
tail -n 5 data/radar.log 看文件最后 5 行 5 行“时间,距离”
grep ",-1.00" data/radar.log 找出包含这段文字的行 所有坏帧
grep -c ",-1.00" data/radar.log 只统计行数 一个数字,每次运行结果可能不同
cp data/radar.log output/a.log 复制文件 没有输出,就是成功
mv output/a.log output/b.log 改名,也可以用来移动文件 没有输出
rm output/b.log 删除文件 没有输出,文件不进回收站

Linux 命令成功时通常什么都不输出,没有报错就是成功。这周不要练 rm -rf,它会不提示地删掉整个目录。

SSH 远程登录

SSH 用来登录另一台机器。这周先登录自己的电脑,等连开发板时,把 localhost 换成 用户名@板子IP 就行。

先按上面的表启动 SSH 服务,然后运行:

ssh localhost

第一次连接会问是否信任,输入 yes 回车,再输入你的 Ubuntu 或 Mac 登录密码。登录成功后运行 whoami 看一眼,再输入 exit 退出。

自查

参考教程:菜鸟教程:Linux · 菜鸟教程:grep · 菜鸟教程:tail · CSDN:30 个常用 Linux 命令和实战场景 · MIT 计算机教育中缺失的一课(中文)

第 3 步:Git 和 GitHub

Git 记录代码的每一次改动,GitHub 是放代码的网站。项目的代码以后都要经过分支和合并请求,所以这一步用自己的练习仓库走一遍。

代码会经过四个位置:改文件时在工作区,git add 放进暂存区,git commit 存进本地仓库,git push 送到 GitHub。不确定现在是什么状态时,就运行 git status,它还会提示下一步能做什么。

告诉 Git 你是谁

每台电脑只需设置一次。邮箱用你注册 GitHub 的邮箱。

git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --global init.defaultBranch main
git config --global core.editor nano

第一次提交

.gitignore 列出不进仓库的文件。虚拟环境、缓存和生成的日志都能重新生成,不需要保存。

cd ~/senseguard-week1
printf '.venv/\n__pycache__/\ndata/*.log\n' > .gitignore
echo "# SenseGuard week 1" > README.md
git init
git add .gitignore README.md scripts
git commit -m "chore: init project"

最后一条会输出类似 3 files changed 的提示,说明提交成功。

造一次冲突,再解决它

两个分支改了同一行,Git 不知道听谁的,就会冲突。下面故意造一次,以后真遇到就不慌了。分三段依次运行:

先在 main 分支上建一个文件。

echo "雷达帧率:待定" > notes.txt
git add notes.txt && git commit -m "docs: add notes"

开一个新分支,把这一行改成 10 fps。git switch -c 的意思是新建分支并切换过去。

git switch -c set-fps
echo "雷达帧率:10 fps" > notes.txt
git add notes.txt && git commit -m "docs: set fps to 10"

回到 main,把同一行改成 20 fps,再合并。这时会看到 CONFLICT,这正是我们要的结果。

git switch main
echo "雷达帧率:20 fps" > notes.txt
git add notes.txt && git commit -m "docs: set fps to 20"
git merge set-fps

用 nano notes.txt 打开文件,内容是这样的:

<<<<<<< HEAD
雷达帧率:20 fps
=======
雷达帧率:10 fps
>>>>>>> set-fps

======= 上面是当前分支的内容,下面是要合并进来的内容。解决冲突就是决定最后留什么:把文件改成只剩你想要的一行,三行标记也要删掉。保存后提交:

git add notes.txt && git commit -m "merge: resolve fps conflict"
git log --oneline --graph

在输出的图里看到两条线分开又合拢,就成功了。

把代码推到 GitHub

  1. 在 github.com 注册账号。
  2. 生成 SSH 密钥,提示时一路回车。它相当于你这台电脑的身份证,配好之后推送不用输密码。
ssh-keygen -t ed25519 -C "你的邮箱"
cat ~/.ssh/id_ed25519.pub
  1. 复制第二条命令输出的整行内容。这是公钥,可以公开。没有 .pub 后缀的是私钥,不要发给任何人。
  2. 在 GitHub 右上角头像打开 Settings > SSH and GPG keys > New SSH key,粘贴后保存。
  3. 测试连接。第一次会问是否信任,输入 yes。看到 Hi 你的用户名! 就成功了。
ssh -T git@github.com
  1. 在 GitHub 新建仓库,名字填 senseguard-week1,选 Public,不要勾选添加 README。
  2. 把本地仓库和它关联并推送,“你的用户名”换成自己的:
git remote add origin git@github.com:你的用户名/senseguard-week1.git
git push -u origin main

刷新 GitHub 页面,能看到你的文件就完成了。

自查

参考教程:Learn Git Branching(网页互动练习) · 菜鸟教程:Git · 廖雪峰:Git 教程 · B 站:40 分钟学会 Git · CSDN:GitHub 配置 SSH Key(新手版) · CSDN:Git 冲突处理 · Pro Git 中文版

第 4 步:Python 和 FFT 小作业

这是这周唯一要交的作业:用 NumPy 生成“正弦 + 噪声”,用 FFT 找出频率,画图,提交 PR。这就是雷达信号处理最小的一步。FMCW 雷达的差频信号也是正弦,频率和距离成正比,找到频谱上的峰,就找到了距离。

先弄懂三个词

看不太明白,就先看 B 站这个 3Blue1Brown 的傅里叶变换动画。

建虚拟环境

虚拟环境把这个项目用的 Python 包关在项目目录里,不影响系统和其他项目。

cd ~/senseguard-week1
python3 -m venv .venv
source .venv/bin/activate
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy matplotlib

激活后,提示符前面会多出 (.venv)。每开一个新窗口,都要重新运行一次 source .venv/bin/activate。安装命令里用的是清华镜像,国内下载更快。

写作业

先开一个分支,作业都在这个分支上做:

git switch -c fft-homework

新建 scripts/fft_homework.py,复制下面的骨架,然后按注释把六步补全。每个人的频率不同:f0 等于 20 加学号后两位。

import numpy as np
import matplotlib.pyplot as plt

fs = 1000       # 采样率(Hz)
duration = 1.0  # 信号时长(秒)
f0 = 20 + 37    # 把 37 换成你的学号后两位
noise = 0.8     # 噪声大小

# 1. 生成时间轴 t:np.arange(0, duration, 1 / fs)
# 2. 生成信号 x:np.sin(2 * np.pi * f0 * t) 加上噪声
#    噪声写法:noise * np.random.default_rng().normal(size=t.size)
# 3. 算频谱:np.abs(np.fft.rfft(x))
# 4. 算每个点对应的频率:np.fft.rfftfreq(t.size, 1 / fs)
# 5. 用 np.argmax 找频谱最高点的下标,打印这个下标对应的频率
# 6. 用 plt.subplots(2, 1) 上下画两张图:
#    上图是前 0.2 秒的波形,下图是频谱,用 plt.savefig("output/fft.png") 保存

运行:

python scripts/fft_homework.py

打印出的频率和 f0 相差不超过 1 Hz,就算写对了。用文件管理器打开 output/fft.png,下面那张图应该有一个突出的尖峰。图上的文字用英文,默认字体显示不了中文。这周统一用 savefig 存图,WSL 上 plt.show() 可能不弹窗口。

做一个小实验

把 fs 改成 f0 的 1.6 倍(取整数),再跑一次,看看峰跑到了哪里。把结果和你认为的原因写进 README.md,然后把 fs 改回 1000,再跑一遍。

答案不用很专业,写出你自己的理解就好。组会上会一起讲这个现象,它叫混叠。

提交 Pull Request

git add scripts output README.md
git commit -m "feat: add fft homework"
git push -u origin fft-homework
  1. 打开 GitHub 上你的仓库,页面顶部会出现 Compare & pull request 按钮,点它。没出现的话,点 Pull requests > New pull request,选择 fft-homework 分支。
  2. 确认方向是 fft-homework 合并到 main。
  3. 标题写“第一周 FFT 作业”,描述里写一句你找到的频率,点 Create pull request。
  4. 把这个 PR 的链接发到飞书群,先不要点 Merge。

如果你还没用过 Python,先花半小时看菜鸟教程的基础语法和循环部分。作业只用到赋值和函数调用,不需要先学完 Python。

自查

参考教程:菜鸟教程:Python3 · 菜鸟教程:虚拟环境 · 菜鸟教程:NumPy · 菜鸟教程:Matplotlib 多图 · CSDN:NumPy 傅里叶变换函数 · NumPy 官方入门 · CSDN:GitHub Pull Request 流程详解(它讲的是 Fork 别人仓库的情况,我们在自己仓库里提,跳过 Fork 和克隆两步)

卡住了怎么办

卡住 30 分钟还没解决,就发到飞书群,带上你的系统、运行的命令和完整报错。这不算丢人,早说早解决。

你看到的 原因 怎么办
wsl --install 提示虚拟化未开启 BIOS 里关了虚拟化 重启进 BIOS,打开 Intel VT-x 或 AMD-V
No such file or directory 当前目录不对,或文件名拼错 用 pwd 和 ls 确认,回到 ~/senseguard-week1
python: command not found 没激活虚拟环境 运行 source .venv/bin/activate,或者用 python3
externally-managed-environment 在虚拟环境外运行了 pip install 同上,激活后再装
No module named 'numpy' 新窗口没激活虚拟环境 同上
Connection refused(连 localhost) 本机 SSH 服务没启动 按差异表启动后重试
Permission denied (publickey) GitHub 上没加对公钥 重新复制 .pub 的内容,在 GitHub 添加
连 GitHub 超时 22 端口不通 用下面的配置改走 443 端口
打开了看不懂的编辑器界面 Git 在等你写提交说明 在 nano 里按 Ctrl+X 退出

改走 443 端口:运行 nano ~/.ssh/config,写入下面内容后保存,再测试一次。

Host github.com
    Hostname ssh.github.com
    Port 443
    User git

GitHub 还是连不上,就换成 Gitee,流程相同,并在群里说一声。

Yocto、ROS 2、驱动开发、深度学习、串口实时绘图这些,这周都不用碰,等后面的方向任务用到时再学。