Hero Image
github 使用语法

github 语法流程图 本地初始化仓库 git init git add README.md git commit -m "first commit" git branch -M main git remote add origin git@github.com:user_name/test_init.git git push -u origin main 推送现有仓库到远程仓库 git remote add origin git@github.com:user_name/test_init.git git branch -M main git push -u origin main 克隆远程仓库到本地 git clone git@github.com:user_name/test_init.git 仓库管理 git init # 初始化新的Git仓库 git clone <url> # 克隆远程仓库 git remote add origin <url> # 添加远程仓库 git remote -v # 查看远程仓库 推送与拉取 git push origin <branch> # 推送到远程分支 git push -u origin <branch> # 设置上游分支并推送 git pull origin <branch> # 从远程拉取并合并 git fetch origin # 获取远程更新 git fetch --all # 获取所有远程更新 状态查看 git status # 查看工作区状态 git status -s # 简短格式显示状态 git log # 查看提交历史 git log --oneline -n # 单行显示最近n条提交历史 git log --graph # 图形化显示分支历史 git diff # 查看工作区与暂存区的差异 git diff --staged # 查看暂存区与HEAD的差异 文件操作 git add <file> # 添加文件到暂存区 git add . # 添加所有文件到暂存区 git add *.c # 添加所有.c文件 git rm <file> # 将文件从暂存区和工作区中删除 git rm --cashed <file> # 将文件从暂存区删除,工作区得以保留 git rm -f <file> # 将文件从暂存区和工作区中删除 git mv <old> <new> # 重命名文件 git checkout -- <file> # 从最近的一次提交中恢复文件,撤销工作区的修改,如果该文件曾经提交到 暂存区,则暂存区中的文件不受影响 git restore <file> # 恢复特定文件到暂存区状态 git restore . # 恢复所有文件到暂存区状态 提交管理 git commit -m "消息" # 提交更改 git commit -am "消息" # 添加并提交已跟踪的文件 git commit --amend # 打开编辑器,修改最后一次提交 git commit --amend -m "消息" # 直接修改最后一次提交 git reset HEAD <file> # 工作区不变,将本地仓库和暂存区修改到指定的<commit-hash> git reset --soft <commit-hash> # 暂存区,工作区不变,将本地仓库修改到指定的<commit-hash> git reset --hard HEAD # 完全重置到最后一次提交,暂存区,工作区,本地仓库均变化 分支管理 git branch # 查看本地分支 git branch -a # 查看所有分支,本地和远程 git branch <name> # 创建新分支 git checkout <branch> # 切换到指定分支 git checkout -b <name> # 创建并切换到新分支 git branch -d <name> # 删除分支 git branch -m <old> <new> # 重命名分支 合并与变基 git merge <branch> # 合并当前分支到<branch>分支,在流程图中有交叉 git rebase <branch> # 变基操作,将当前分支合并到<branch>分支,在流程图中没有交叉 git cherry-pick <commit-hash> # 将特定的<commit-hash>提交从一个分支引入到当前分支 标签管理 git tag # 查看所有标签 git tag <name> # 创建标签 git tag -a <name> -m "消息" # 创建带注释的标签 git push origin --tags # 推送所有标签 搜索查看 git show <commit> # 显示指定提交的详细信息 git blame <file> # 查看文件的每一行是谁修改的 git grep "关键词" # 在仓库中搜索关键词 git log -S "关键词" # 搜索包含关键词的提交 清理维护 git clean -n # 预览要清理的文件 git clean -f # 强制清理未跟踪的文件 git gc # 垃圾回收 git prune # 清理孤立的提交 stash操作 git stash # 将工作区,暂存区放置到 stash 区域,会删除工作区,暂存区的修改 git stash list # 查看 stash 列表 git stash pop <commit-hash> # 将stash区域保存的<commit-hash>状态恢复到工作区,暂存区,并删除该stash状态 git stash apply <commit-hash> # 将stash区域保存的<commit-hash>状态恢复到工作区,暂存区,不删除该stash状态

Hero Image
在无显示屏状态下使用vnc登录树莓派

在树莓派上通过sd卡设置固定ip地址 安装操作系统 按照前序文章将操作系统安装到SD卡上。 如果树莓派不连接显示器,也无法连接鼠标键盘,此时我们可以在SD卡中直接设置固定IP地址以方便后续通过VNC-Viewer登录。 设置IP地址 将SD卡通过读卡器连接到电脑,直接打开SD卡,使用记事本打开cmdline.txt文件,在文件末尾增加 ip=192.168.1.200::192.168.1.1:255.255.255.0:rpi:eth0:off,需要注意的是在新增的内容前有一个空格。 修改完成之后将SD卡插入树莓派中,启动树莓派。 ssh登录 在windows上打开终端(如下图所示),通过指令登录树莓派 ssh登录树莓派 在终端输入以下指令登录树莓派 ssh rpi@192.168.1.200 # 回车后,如果需要输入密码,则输入密码即可,在输入过程中密码是不可见的,输入完密码,直接回车即可 如果在登陆时,如果提示REMOTE HOST IDENTIFICATION HAS CHANGED!,说明之前连接过相同IP地址,但不是当前设备。此时需要删除已经存在的host。 删除已经存在的host 在图示路径下打开known_hosts文件,删除我们访问的ip地址以及后面的公钥指纹。 配置VNC 开启VNC 成功登录树莓派后,在终端执行以下指令,并按照图示进行选择 sudo raspi-config 切换到x11服务 设置VNC分辨率 以上配置结束后,记得重新启动树莓派,以让所有配置生效 vnc-viewer 登录 经过测试,推荐使用VNC-VIEWER。 vncview 下载地址 mobaxterm下载地址 mobaxterm备用下载地址 VNC登录 使用 vnc-viewer ,输入树莓派IP地址,按照过程输入安装过程中设置的用户名以及密码即可。 帮助 如果vnc连接后打开的为灰色屏幕 # 使用 SSH 登录树莓派,输入以下指令查看 x11 服务是否启用 sudo systemctl status vncserver-x11-serviced.service # 如果没有启用,则输入以下指令启用 sudo systemctl enable vncserver-x11-serviced.service sudo systemctl start vncserver-x11-serviced.service

Hero Image
在无显示屏状态下登录树莓派

查找树莓派IP地址 当树莓派没有连接到显示屏时,需要借助第三方工具查找树莓派IP地址。 Advanced IP Scanner 下载地址:https://www.advanced-ip-scanner.com/ 备用下载地址:https://pan.baidu.com/s/1Gn4WzB7eWj082HQvlFAz_Q?pwd=y29q 下载后启动软件,在树莓派关机和开机状态下各扫描一次,看哪个设备为新增的设备,则该IP地址大概率是树莓派IP地址。 登录树莓派 ssh rpi@树莓派的IP地址 修改静态IP地址 编辑网络配置文件 sudo nano /etc/dhcpcd.conf 在文件末尾添加以下配置 # 配置静态IP地址 interface eth0 # 有线网络接口 static ip_address=192.168.1.100/24 # 设置静态IP地址和子网掩码 static routers=192.168.1.1 # 设置网关地址 static domain_name_servers=8.8.8.8 8.8.4.4 # 设置DNS服务器 # 如果使用WiFi,则配置wlan0接口 interface wlan0 # WiFi网络接口 static ip_address=192.168.1.101/24 static routers=192.168.1.1 static domain_name_servers=8.8.8.8 8.8.4.4 保存并退出 按 Ctrl + X 按 Y 确认保存 按 Enter 确认文件名 重启网络服务 sudo systemctl restart dhcpcd Ping 在笔记本电脑上通过Ping指令验证是否修改成功,需要提前确认该网络下没有IP地址冲突。 开启 VNC 方法一:通过raspi-config配置(推荐) 进入配置界面 sudo raspi-config 启用VNC服务 选择 Interface Options 选择 VNC 选择 Yes 启用VNC 选择 Finish 退出 设置VNC分辨率 再次进入 raspi-config 选择 Display Options 选择 VNC Resolution 选择合适的分辨率(如1920x1080或1280x720) 连接VNC客户端 Windows用户: 下载VNC Viewer

Hero Image
YOLOV8训练结果解析

YOLOV8 训练结果分析 概念理解 box_loss 优化边界框的位置和大小 Box Loss为边界框损失,是目标检测中用于衡量预测边界框与真实边界框之间差异的损失函数,用来衡量模型预测的边界框位置和大小的准确性,通常使用以下损失函数。值越小越好,接近0表示完美的边界框预测。 # IoU Loss交并比损失: IoU = intersection_area / union_area IoU_loss = 1 - IoU # CIoU Loss完整IoU损失,考虑了预测与实际的中心点距离、以及长宽比等,YOLOV8默认采用CIoU完整IoU损失。 CIoU_loss = IoU_loss + distance_loss + aspect_ratio_loss cls_loss 优化目标类别的识别准确性 Cls Loss为分类损失,是目标检测中用于衡量模型对目标类别预测准确性的损失函数,用来衡量模型正确识别目标类别(如鸭子)的能力。通常使用交叉熵损失函数。值越小越好,接近0表示完美的分类预测。 # Cross Entropy Loss交叉熵损失: CE_loss = -∑(y_true * log(y_pred)) # Focal Loss焦点损失,用于处理类别不平衡问题: Focal_loss = -α * (1 - y_pred)^γ * y_true * log(y_pred) dfl_loss 优化边界框坐标的分布预测精度 Dfl Loss为分布焦点损失(Distribution Focal Loss),是YOLOv8中用于优化边界框回归的损失函数,通过建模边界框坐标的分布来提升回归精度。它比传统的回归损失更稳定,能更好地处理边界框预测的不确定性。值越小越好,接近0表示完美的分布预测。 # Distribution Focal Loss分布焦点损失: # 将边界框坐标建模为分布,而不是单一值 DFL_loss = -log(softmax(pred_distribution)) * target_distribution # 具体实现: # 1. 将边界框坐标离散化为多个bin # 2. 预测每个bin的概率分布 # 3. 计算预测分布与目标分布的焦点损失 precision 关注检测的准确性,避免误检

Hero Image
使用CUBEMX配置CANFD

3. 配置CANFD 3.1 波特率计算 波特率 波特率 = FDCAN时钟频率 / (NominalPrescaler × (1 + NominalTimeSeg1 + NominalTimeSeg2)) 时间量子(TQ) 时间量子也就是一个Tick的时间 时间量子 = FDCAN时钟频率 / NominalPrescaler 位时间 这里的1就是同步段NominalSyncJumpWidth,同步段一般设置为固定的1TQ; NominalTimeSeg1决定了采样点的位置,采样点在NominalTimeSeg1段的结束处; NominalTimeSeg2是采样点到位结束的距离,越大对抖动的容忍度越高。 位时间 = 1 + NominalTimeSeg1 + NominalTimeSeg2 个时间量子 采样点 采样点一般设置在75%左右。 采样点位置 = (1 + NominalTimeSeg1) / (1 + NominalTimeSeg1 + NominalTimeSeg2) 波特率设置注意事项 1. NominalPrescaler应该尽可能小,以提高采样精度,减少误差; 2. CANFD推荐仲裁域NominalPrescaler <= 数据域NominalPrescaler; 3. SJW应尽量大,尽量保持与TSEG2一致,以提高位宽容忍度; 4. 波特率大于800K,推荐采样点在75%;波特率大于500K,推荐采样点在80%;波特率小于500K,推荐采样点在87.5%; 5. 尽量保证总线上所有节点的采样点一致,CANFD的仲裁域和数据域采样点不要求一致; 6. CANFD仲裁域与数据域的波特率之比应该大于等于1/8. 3.2 配置参数 在这里我们目标是使用CANFD的加速模式,仲裁域波特率为1M,数据域波特率为2M。 Frame Format Classic mode : 标准的can模式,非CANFD,单帧数据最多8个字节。 FD mode without BitRate Switching:CANFD模式,仲裁域和数据域波特率相同,CANFD单帧数据可扩展至64个字节。 FD mode with BitRate Switching:CANFD加速模式,数据域波特率可与仲裁域波特率不同,数据域波特率大于仲裁域波特率。 Data Prescaler 这里是数据域的波特率设置,在CANFD加速模式下有效。

Hero Image
使用CUBEMX配置单片机时钟

STM32开发记录 1. 配置时钟 开发流程是先使用STM32CubeMX软件生成项目框架,然后再使用Keil进行软件开发。 1. STM32CubeMX 1.1 配置Debug信息 在Pinout&Configuration下点击 Trace and Debug->DEBUG 选择Serial Wire。 Serial Wire Debug (SWD) 是ARM Cortex-M系列微控制器的一种调试接口,它是JTAG接口的简化版本。 1.2 配置系统时钟 控制板采用的是24MHZ无源晶振,在Pinout&Configuration选择RCC->HSE选择Crystal/Ceramic Resonator。其中HSE为外部时钟,LSE 为内部时钟,使用外部时钟能比内部时钟更加稳定高效。Crystal/Ceramic Resonator为无源晶振;BYPASS Clock Source为有源晶振。 切换到Clock Configuration修改Input frequency的频率为24,其他参数按照下图修改。 1.2.1 总线时钟 总线时钟是整个系统中非常重要的一个时钟信号,为许多核心外设和总线提供了时钟源。和单片机的功耗有直接关系。 AHB总线时钟在CUBEMX中的位置如下图红色框出部分所示。 1.2.2 功耗 芯片的功耗和设置的总线时钟源相关,具体可以参考对应芯片的数据手册,在手册中搜索Supply current characteristics,查看对应的表格。 有上表可见,系统的功耗和芯片所处的VOS(稳压器电压调试等级)相关,默认VOS0可以提供全功率,调节VOS等级可以使得功耗得到优化。在cubemx中设置好时钟源之后,可以在Pinout & Configuration -> System Core -> RCC 下设置对应的VOS等级。如下图所示。 1.3 配置代码生成 点击右上角 GENERATE CODE 生成 KEIL项目代码。