update blog

This commit is contained in:
feie9456 2025-06-17 14:08:21 +08:00
parent fc2673dcfa
commit 58caf66776
3 changed files with 602 additions and 37 deletions

253
analyze-unused-images.js Normal file
View File

@ -0,0 +1,253 @@
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const glob = require('glob');
/**
* 分析未使用的图片资源
* 扫描 src/blogs/ 目录下的 .assets 文件夹中的图片文件
* 检查这些图片是否在对应的 markdown 文件中被引用
*/
// 支持的图片格式
const imageExtensions = ['.png', '.jpg', '.jpeg', '.gif', '.bmp', '.svg', '.webp'];
// 博客目录
const blogsDir = './src/blogs';
// 获取所有assets目录中的图片文件
function getAllAssetImages() {
const assetImages = [];
try {
// 使用 glob 匹配所有 .assets 目录下的文件
const assetFiles = glob.sync(`${blogsDir}/**/*.assets/**/*`, { nodir: true });
assetFiles.forEach(filePath => {
const ext = path.extname(filePath).toLowerCase();
if (imageExtensions.includes(ext)) {
assetImages.push({
fullPath: filePath,
fileName: path.basename(filePath),
blogName: path.dirname(filePath).split('/').pop().replace('.assets', ''),
relativePath: path.relative(blogsDir, filePath)
});
}
});
} catch (error) {
console.error('读取assets目录时出错:', error.message);
}
return assetImages;
}
// 获取所有markdown文件
function getAllMarkdownFiles() {
const markdownFiles = [];
try {
const mdFiles = glob.sync(`${blogsDir}/*.md`);
mdFiles.forEach(filePath => {
markdownFiles.push({
fullPath: filePath,
fileName: path.basename(filePath),
blogName: path.basename(filePath, '.md')
});
});
} catch (error) {
console.error('读取markdown文件时出错:', error.message);
}
return markdownFiles;
}
// 读取markdown文件内容并提取图片引用
function extractImageReferences(mdFilePath) {
try {
const content = fs.readFileSync(mdFilePath, 'utf8');
const imageRefs = new Set();
// 匹配 ![alt](path) 格式的图片引用
const markdownImageRegex = /!\[[^\]]*\]\(([^)]+)\)/g;
let match;
while ((match = markdownImageRegex.exec(content)) !== null) {
imageRefs.add(match[1]);
}
// 匹配 HTML img 标签
const htmlImageRegex = /<img[^>]+src=['"]*([^'">\s]+)['"]*[^>]*>/g;
while ((match = htmlImageRegex.exec(content)) !== null) {
imageRefs.add(match[1]);
}
return Array.from(imageRefs);
} catch (error) {
console.error(`读取文件 ${mdFilePath} 时出错:`, error.message);
return [];
}
}
// 检查图片是否被使用
function isImageUsed(imagePath, imageFileName, blogName, allMarkdownFiles) {
// 首先检查对应的markdown文件
const correspondingMdFile = allMarkdownFiles.find(md => md.blogName === blogName);
if (correspondingMdFile) {
const imageRefs = extractImageReferences(correspondingMdFile.fullPath);
// 检查是否有任何引用匹配当前图片
const isUsed = imageRefs.some(ref => {
// 处理相对路径和绝对路径
const normalizedRef = ref.replace(/^\.\//, '');
const fileName = path.basename(ref);
return (
fileName === imageFileName ||
normalizedRef.includes(imageFileName) ||
ref.includes(imageFileName) ||
normalizedRef === imagePath ||
ref === imagePath
);
});
if (isUsed) {
return { used: true, foundIn: correspondingMdFile.fileName };
}
}
// 如果在对应的markdown文件中没找到检查所有其他markdown文件
for (const mdFile of allMarkdownFiles) {
if (mdFile.blogName === blogName) continue; // 已经检查过了
const imageRefs = extractImageReferences(mdFile.fullPath);
const isUsed = imageRefs.some(ref => {
const normalizedRef = ref.replace(/^\.\//, '');
const fileName = path.basename(ref);
return (
fileName === imageFileName ||
normalizedRef.includes(imageFileName) ||
ref.includes(imageFileName)
);
});
if (isUsed) {
return { used: true, foundIn: mdFile.fileName };
}
}
return { used: false, foundIn: null };
}
// 主函数
function analyzeUnusedImages() {
console.log('🔍 开始分析未使用的图片资源...\n');
const assetImages = getAllAssetImages();
const markdownFiles = getAllMarkdownFiles();
console.log(`📊 统计信息:`);
console.log(` - 找到 ${assetImages.length} 个图片文件`);
console.log(` - 找到 ${markdownFiles.length} 个markdown文件\n`);
const unusedImages = [];
const usedImages = [];
console.log('📝 分析结果:\n');
assetImages.forEach(image => {
const usage = isImageUsed(image.relativePath, image.fileName, image.blogName, markdownFiles);
if (usage.used) {
usedImages.push({
...image,
foundIn: usage.foundIn
});
console.log(`${image.fileName} (在 ${usage.foundIn} 中使用)`);
} else {
unusedImages.push(image);
console.log(`${image.fileName} (未使用)`);
}
});
// 输出汇总
console.log('\n📋 汇总报告:');
console.log(` ✅ 已使用的图片: ${usedImages.length}`);
console.log(` ❌ 未使用的图片: ${unusedImages.length}`);
if (unusedImages.length > 0) {
console.log('\n🗑 未使用的图片列表:');
unusedImages.forEach(image => {
console.log(` - ${image.relativePath}`);
});
// 计算未使用图片的总大小
let totalSize = 0;
unusedImages.forEach(image => {
try {
const stats = fs.statSync(image.fullPath);
totalSize += stats.size;
} catch (error) {
console.error(`无法获取文件大小: ${image.fullPath}`);
}
});
console.log(`\n💾 未使用图片总大小: ${(totalSize / 1024 / 1024).toFixed(2)} MB`);
// 生成删除脚本包含git移除操作
const deleteScript = unusedImages.map(image => {
return `# 删除文件: ${image.relativePath}
if [ -f "${image.fullPath}" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "${image.fullPath}" >/dev/null 2>&1; then
echo "从git中移除: ${image.relativePath}"
git rm "${image.fullPath}"
else
echo "删除未跟踪文件: ${image.relativePath}"
rm "${image.fullPath}"
fi
else
echo "文件不存在,跳过: ${image.relativePath}"
fi`;
}).join('\n\n');
const scriptContent = `#!/bin/bash
# 删除未使用的图片文件并从git中移除如果被跟踪
# 生成时间: ${new Date().toLocaleString()}
set -e # 遇到错误时退出
echo "🗑️ 开始删除未使用的图片文件..."
echo "总共需要处理 ${unusedImages.length} 个文件"
echo ""
${deleteScript}
echo ""
echo "✅ 删除操作完成!"
echo "如果有文件从git中移除请记得提交这些更改"
echo "git commit -m 'Remove unused images'"
`;
fs.writeFileSync('./delete-unused-images.sh', scriptContent);
console.log('\n📜 已生成删除脚本: delete-unused-images.sh');
console.log(' 脚本将自动检查文件是否被git跟踪并相应地删除或从git中移除');
console.log(' 运行 chmod +x delete-unused-images.sh && ./delete-unused-images.sh 来删除这些文件');
} else {
console.log('\n🎉 太棒了!所有图片都在使用中!');
}
}
// 检查是否安装了 glob 包
try {
require('glob');
} catch (error) {
console.error('❌ 缺少依赖包 "glob"');
console.log('请运行: npm install glob');
process.exit(1);
}
// 运行分析
analyzeUnusedImages();

308
delete-unused-images.sh Executable file
View File

@ -0,0 +1,308 @@
#!/bin/bash
# 删除未使用的图片文件并从git中移除如果被跟踪
# 生成时间: 6/17/2025, 2:07:13 PM
set -e # 遇到错误时退出
echo "🗑️ 开始删除未使用的图片文件..."
echo "总共需要处理 21 个文件"
echo ""
# 删除文件: ESP8266天气时钟——项目展示.assets/image-20250418185355849.png
if [ -f "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185355849.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185355849.png" >/dev/null 2>&1; then
echo "从git中移除: ESP8266天气时钟——项目展示.assets/image-20250418185355849.png"
git rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185355849.png"
else
echo "删除未跟踪文件: ESP8266天气时钟——项目展示.assets/image-20250418185355849.png"
rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185355849.png"
fi
else
echo "文件不存在,跳过: ESP8266天气时钟——项目展示.assets/image-20250418185355849.png"
fi
# 删除文件: ESP8266天气时钟——项目展示.assets/image-20250418185522753.png
if [ -f "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185522753.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185522753.png" >/dev/null 2>&1; then
echo "从git中移除: ESP8266天气时钟——项目展示.assets/image-20250418185522753.png"
git rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185522753.png"
else
echo "删除未跟踪文件: ESP8266天气时钟——项目展示.assets/image-20250418185522753.png"
rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185522753.png"
fi
else
echo "文件不存在,跳过: ESP8266天气时钟——项目展示.assets/image-20250418185522753.png"
fi
# 删除文件: ESP8266天气时钟——项目展示.assets/image-20250418185134888.png
if [ -f "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185134888.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185134888.png" >/dev/null 2>&1; then
echo "从git中移除: ESP8266天气时钟——项目展示.assets/image-20250418185134888.png"
git rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185134888.png"
else
echo "删除未跟踪文件: ESP8266天气时钟——项目展示.assets/image-20250418185134888.png"
rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185134888.png"
fi
else
echo "文件不存在,跳过: ESP8266天气时钟——项目展示.assets/image-20250418185134888.png"
fi
# 删除文件: ESP8266天气时钟——项目展示.assets/image-20250418185450325.png
if [ -f "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185450325.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185450325.png" >/dev/null 2>&1; then
echo "从git中移除: ESP8266天气时钟——项目展示.assets/image-20250418185450325.png"
git rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185450325.png"
else
echo "删除未跟踪文件: ESP8266天气时钟——项目展示.assets/image-20250418185450325.png"
rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185450325.png"
fi
else
echo "文件不存在,跳过: ESP8266天气时钟——项目展示.assets/image-20250418185450325.png"
fi
# 删除文件: ESP8266天气时钟——项目展示.assets/image-20250418185437222.png
if [ -f "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185437222.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185437222.png" >/dev/null 2>&1; then
echo "从git中移除: ESP8266天气时钟——项目展示.assets/image-20250418185437222.png"
git rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185437222.png"
else
echo "删除未跟踪文件: ESP8266天气时钟——项目展示.assets/image-20250418185437222.png"
rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185437222.png"
fi
else
echo "文件不存在,跳过: ESP8266天气时钟——项目展示.assets/image-20250418185437222.png"
fi
# 删除文件: ESP8266天气时钟——项目展示.assets/image-20250418185235222.png
if [ -f "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185235222.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185235222.png" >/dev/null 2>&1; then
echo "从git中移除: ESP8266天气时钟——项目展示.assets/image-20250418185235222.png"
git rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185235222.png"
else
echo "删除未跟踪文件: ESP8266天气时钟——项目展示.assets/image-20250418185235222.png"
rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185235222.png"
fi
else
echo "文件不存在,跳过: ESP8266天气时钟——项目展示.assets/image-20250418185235222.png"
fi
# 删除文件: 基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png
if [ -f "src/blogs/基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png" >/dev/null 2>&1; then
echo "从git中移除: 基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png"
git rm "src/blogs/基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png"
else
echo "删除未跟踪文件: 基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png"
rm "src/blogs/基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png"
fi
else
echo "文件不存在,跳过: 基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png"
fi
# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png
if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png" >/dev/null 2>&1; then
echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png"
git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png"
else
echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png"
rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png"
fi
else
echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png"
fi
# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png
if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png" >/dev/null 2>&1; then
echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png"
git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png"
else
echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png"
rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png"
fi
else
echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png"
fi
# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png
if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png" >/dev/null 2>&1; then
echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png"
git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png"
else
echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png"
rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png"
fi
else
echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png"
fi
# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png
if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png" >/dev/null 2>&1; then
echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png"
git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png"
else
echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png"
rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png"
fi
else
echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png"
fi
# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png
if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png" >/dev/null 2>&1; then
echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png"
git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png"
else
echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png"
rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png"
fi
else
echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png"
fi
# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png
if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png" >/dev/null 2>&1; then
echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png"
git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png"
else
echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png"
rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png"
fi
else
echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png"
fi
# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png
if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png" >/dev/null 2>&1; then
echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png"
git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png"
else
echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png"
rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png"
fi
else
echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png"
fi
# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png
if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png" >/dev/null 2>&1; then
echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png"
git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png"
else
echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png"
rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png"
fi
else
echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png"
fi
# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png
if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png" >/dev/null 2>&1; then
echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png"
git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png"
else
echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png"
rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png"
fi
else
echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png"
fi
# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png
if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png" >/dev/null 2>&1; then
echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png"
git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png"
else
echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png"
rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png"
fi
else
echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png"
fi
# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg
if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg" >/dev/null 2>&1; then
echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg"
git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg"
else
echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg"
rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg"
fi
else
echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg"
fi
# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png
if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png" >/dev/null 2>&1; then
echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png"
git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png"
else
echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png"
rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png"
fi
else
echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png"
fi
# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg
if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg" >/dev/null 2>&1; then
echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg"
git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg"
else
echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg"
rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg"
fi
else
echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg"
fi
# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png
if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png" ]; then
# 检查文件是否被git跟踪
if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png" >/dev/null 2>&1; then
echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png"
git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png"
else
echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png"
rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png"
fi
else
echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png"
fi
echo ""
echo "✅ 删除操作完成!"
echo "如果有文件从git中移除请记得提交这些更改"
echo "git commit -m 'Remove unused images'"

View File

@ -28,11 +28,11 @@ tags: AI、物理、教育、竞赛
**计算机视觉CV模块**主要承担物理现象的“感知者”角色。无论是力学实验中物体的运动轨迹、速度、加速度还是未来可能拓展的光学条纹、热学形变等CV技术都能通过图像序列分析将宏观或微观的物理过程转化为精确的数字信号。例如在单摆实验中利用Hough变换、轮廓检测或更先进的目标跟踪算法如基于深度学习的YOLO系列进行特定标记物跟踪实时定位摆球中心其精度远超手动计时和肉眼估读。对于电路实验CV则用于识别实物电路板上的元件种类、参数及连接关系。
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615162942540.png" alt="image-20250615162942540" style="zoom: 33%;" />
![image-20250615162942540](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615162942540.png)
<center>图2-1 Web端摆球跟踪示例</center>
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615190426360.png" alt="image-20250615190426360" style="zoom: 50%;" />
![image-20250615190426360](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615190426360.png)
<center>图2-2 电路识别示例</center>
@ -43,11 +43,11 @@ tags: AI、物理、教育、竞赛
3. **系统误差智能校正**AI模型能够学习和识别实验中常见的系统误差来源如单摆的大摆角效应、空气阻力效应并根据理论模型自动进行校正提高测量结果的可靠性。
4. **智能交互与反馈**在虚拟电路实验中AI Agent能够理解学生的自然语言提问提供电路原理讲解、故障排查提示、实验步骤引导等个性化辅导。
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615163029255.png" alt="image-20250615163029255" style="zoom:40%;" />
![image-20250615163029255](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615163029255.png)
<center>图2-3 在线分析单摆数据</center>
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615190320971.png" alt="image-20250615190320971" style="zoom: 50%;" />
![image-20250615190320971](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615190320971.png)
<center>图2-4 AI智能电路分析与问答</center>
@ -84,35 +84,27 @@ tags: AI、物理、教育、竞赛
3. **轨迹数据生成**通过连续追踪平台能够以视频帧率通常为30fps或60fps部分手机支持更高帧率如240fps记录下摆球在二维平面上的 $(x(t), y(t))$ 坐标序列。这一高密度的时间序列数据为后续的精确分析奠定了基础,其时间分辨率远高于手动计时。
```mermaid
graph TD
A[用户手机摄像头拍摄单摆] --> B{实时视频流};
B --> C[OpenCV.js 帧处理];
C --> D{图像预处理};
D --> E[摆球检测与定位 轮廓+质心];
E --> F[像素坐标 x_p, y_p, t];
G[参照物标定<br>用户操作] --> H[长度转换系数 k m/px];
F & H --> I[物理坐标 x_m, y_m, t];
I --> J[摆角计算 θ t];
J --> K[高密度轨迹与摆角数据输出];
graph LR
A[用户手机摄像头<br>拍摄单摆] --> B{实时视频流};
subgraph "CV感知模块 (浏览器端)"
C
D
E
F
H
I
J
direction LR
G[参照物标定<br>用户操作] --> H[长度转换系数 k m/px];
B --> E[摆球检测<br>轮廓+质心];
E --> F[像素坐标 xₚ, yₚ, t];
F & H --> I[物理坐标 xₘ, yₘ, t];
I --> J[摆角计算 θ t];
end
style A fill:#f9f,stroke:#333,stroke-width:2px
style B fill:#lightblue,stroke:#333,stroke-width:2px
style K fill:#lightgreen,stroke:#333,stroke-width:2px
J --> K[输出<br>高密度轨迹与摆角数据];
```
<center>图3-1 基于CV的单摆改进实验流程图</center>
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615163300814.png" alt="image-20250615163300814" style="zoom:50%;" />
![image-20250615163300814](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615163300814.png)
<center>图3-2 摆球跟踪流程与示例</center>
@ -120,18 +112,18 @@ graph TD
获取高质量的摆球位置-时间数据后平台的AI模块介入进行深度分析和物理参数提取
1. **神经网络模型预处理数据**:降低随机噪声对实验数据的干扰,弥补视觉识别的丢帧或帧时间不稳定。
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/clip_image001.jpg" alt="img" style="zoom: 80%;" />
![img](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/clip_image001.jpg)
<center>图3-3 神经网络模型训练过程</center>
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/clip_image002.jpg" alt="img" style="zoom:75%;" />
![img](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/clip_image002.jpg)
<center>图3-4 神经网络模型预处理后的效果展示</center>
2. **摆角计算与周期初判**:根据摆球的实时坐标 $(x(t), y(t))$ ,计算出每一时刻的摆角 $\theta(t)$。通过三角函数拟合,可以初步得到多个连续摆动周期的测量值 $T_i$。
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615163513570.png" alt="image-20250615163513570" style="zoom: 20%;" />
![image-20250615163513570](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615163513570.png)
<center>图3-5 摆角计算示例</center>
<center>图3-5 摆角计算与拟合示例</center>
3. **非线性拟合与参数精化**:考虑到单摆的运动是受阻尼的简谐振动(或更复杂的非线性振动),平台采用非线性最小二乘法,将实验数据 $\theta(t)$ 拟合到包含阻尼项和大摆角修正的单摆运动方程的解析解或数值解。例如,拟合函数形式为 $\theta(t) = A_0 e^{-\gamma t} \cos(\omega_d t + \phi)$,其中 $A_0$ 是初始振幅,$\gamma$ 是阻尼系数(与空气阻力相关),$\omega_d$ 是阻尼下的角频率(与 $g$ 和 $L$ 相关),$\phi$ 是初相位。通过拟合,可以同时、精确地得到这些物理参数。
@ -147,7 +139,7 @@ graph TD
$T_d = T_0 / \sqrt{1 - (\gamma/\omega_0)^2} \approx T_0 (1 + \gamma^2/(2\omega_0^2))$
通过这种方式,我们不仅测准了 $g$,还额外获得了关于空气阻力的有价值信息。
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/pendulum_period_analysis.png" alt="pendulum_period_analysis" style="zoom:20%;" />
![pendulum_period_analysis](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/pendulum_period_analysis.png)
<center>图3-6 大摆角修正和阻尼修正效果示例</center>
@ -159,7 +151,7 @@ graph TD
经过上述CV追踪与AI分析校正流程我们对单摆实验进行了多次验证。结果表明采用人工精确测量摆长并结合平台进行四种不同摆长的测量与拟合后最终测得的 $g$ 值与当地标准值的相对误差可稳定控制在**0.5%以内**,例如一次典型实验得到 $g = 9.7576 \pm 0.0147 \text{ m/s}^2$95%置信区间与标准值9.80 m/s²的相对误差为0.43%。$T^2-L$ 关系的线性拟合优度 $R^2$ 值可高达1.0000,显示了数据的高度线性相关性和实验的可靠性。同时,平台还能给出空气阻尼系数 $\gamma$例如典型值为0.002 s⁻¹级别及其标准差这些都是传统实验难以获得的附加信息。
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/pendulum_parameters_summary.png" alt="pendulum_parameters_summary" style="zoom: 20%;" />
![pendulum_parameters_summary](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/pendulum_parameters_summary.png)
<center>图3-7 单次实验数据展示</center>
@ -215,7 +207,7 @@ graph TD
#### 3.1.7. 圆锥摆(傅科摆)进动分析的进阶探索
基于CV高精度追踪的能力我们进一步将平台拓展应用于更复杂的圆锥摆傅科摆效应的初步观测与分析。通过顶部俯视拍摄摆球在水平面内的运动轨迹CV算法提取出摆动轨迹椭圆的长轴方向。我们发现在精心控制初始释放条件特别是尽量消除摆球初始自旋观测到的椭圆长轴进动速率显著降低。在一次摆长 $L=1.72 \text{ m}$、纬度 $\varphi=37^\circ \text{ N}$ 的实验中,测得的进动角速度 $\omega_p = -4.5 \times 10^{-5} \text{ rad/s}$,与理论傅科进动速率 $\omega_F = \Omega \sin\varphi = 4.39 \times 10^{-5} \text{ rad/s}$$\Omega$为地球自转角速度)的绝对值非常接近,**相对偏差仅约1.9%**。这一结果初步验证了平台在捕捉和分析微弱物理效应方面的潜力,也揭示了初始条件控制(如避免摆线扭转引入的伪进动)对此类精密实验的重要性。同时,实验还获得了高达 $Q \approx 500$ 的品质因数,表明实验装置的能量损耗极低。![WechatIMG105](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/WechatIMG105-9994965.jpg)
基于CV高精度追踪的能力我们进一步将平台拓展应用于更复杂的圆锥摆傅科摆效应的初步观测与分析。通过顶部俯视拍摄摆球在水平面内的运动轨迹CV算法提取出摆动轨迹椭圆的长轴方向。我们发现在精心控制初始释放条件特别是尽量消除摆球初始自旋观测到的椭圆长轴进动速率显著降低。在一次摆长 $L=1.72 \text{ m}$、纬度 $\varphi=37^\circ \text{ N}$ 的实验中,测得的进动角速度 $\omega_p = -4.5 \times 10^{-5} \text{ rad/s}$,与理论傅科进动速率 $\omega_F = \Omega \sin\varphi = 4.39 \times 10^{-5} \text{ rad/s}$$\Omega$为地球自转角速度)的绝对值非常接近,**相对偏差仅约1.9%**。这一结果初步验证了平台在捕捉和分析微弱物理效应方面的潜力,也揭示了初始条件控制(如避免摆线扭转引入的伪进动)对此类精密实验的重要性。同时,实验还获得了高达 $Q \approx 500$ 的品质因数,表明实验装置的能量损耗极低。
| 量 | 符号 | 数值 | 备注 |
| ---------- | --------- | ---------- | --------------------------- |
@ -246,7 +238,7 @@ graph TD
单摆实验的成功经验为平台在其他力学实验中的应用奠定了基础。CV追踪物体运动轨迹的核心能力是共通的
* **自由落体与斜抛运动**通过高速摄像捕捉下落或抛出小球的运动过程CV算法可以精确提取每一帧中小球的位置。由此可得到位移-时间、速度-时间(通过差分计算)、加速度-时间再次差分的完整运动学图像。AI模块可对这些数据进行拟合例如对自由落体数据拟合 $y(t) = y_0 + v_0 t + \frac{1}{2}gt^2$ 来求解 $g$对斜抛运动则可验证其水平匀速、竖直匀加速的运动规律并分析空气阻力的影响。初步实验表明即使使用手机的240fps拍摄由于物体运动速度快、短时间内帧数有限加速度数据的离散度较大对算法的平滑和拟合能力提出了更高要求。
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615181038206.png" alt="image-20250615181038206" style="zoom: 33%;" />
![image-20250615181038206](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615181038206.png)
<center>图3-14 自由落体跟踪数据</center>
* **弹簧振子振动特性分析**将CV追踪应用于弹簧振子末端标记物的运动可以精确记录其振动位移随时间的变化。AI模块可拟合得到振动周期 $T$、振幅 $A(t)$、阻尼系数 $\gamma$。通过改变悬挂质量 $m$,可以验证周期公式 $T = 2\pi\sqrt{m/k}$(其中 $k$ 为弹簧劲度系数),并测定 $k$ 值。同样,可以研究不同阻尼条件(如空气中、水中)对振动的影响。
@ -264,7 +256,8 @@ graph TD
虚拟电路实验室如PhET等优秀项目通过软件模拟电路行为有效解决了上述部分问题。它允许学生自由拖拽、连接虚拟元件实时观察电路参数变化安全地进行各种尝试且成本极低。然而纯虚拟实验有时也因缺乏与真实世界的联系可能削弱学生对实物操作的熟练度和对真实元件特性的理解。
本平台提出的AI Agent赋能的电路虚拟实验室试图结合实物操作与虚拟仿真的优点并通过AI技术实现两者间的智能桥梁与学习增强。
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615183849113.png" alt="image-20250615183849113" style="zoom: 25%;" />
![image-20250615183849113](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615183849113.png)
<center>图4-1 电路虚拟实验室概览</center>
@ -279,7 +272,7 @@ graph TD
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| ![image-20250615184053677](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615184053677.png)<br /><center>图4-2 俯视角度元件识别示例</center> | ![image-20250615184043376](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615184043376.png)<br /><center>图4-3 侧视角度元件识别示例</center> |
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615184125377.png" alt="image-20250615184125377" style="zoom: 50%;" />
![image-20250615184125377](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615184125377.png)
<center>图4-4 电路元件连接关系分析</center>
3. **结构化数据生成与虚拟电路复现**识别完成后AI模块会将电路的元件列表、各元件参数部分参数需要用户辅助输入如电阻具体阻值以及它们的连接关系转换成标准化的JSON结构化数据格式。这份结构化数据随后被导入到我们基于Web的虚拟电路实验环境中。虚拟环境根据这份“数字蓝图”自动生成一个与实物电路完全对应的、可交互的虚拟复制品。
@ -290,7 +283,18 @@ graph TD
通过这一流程学生如果实物电路有故障学生把电路导入到我们平台后可以借由AI来帮助分析排障还可以先进行实物搭建的练习然后利用平台快速获得一个对应的虚拟仿真环境。在这个虚拟环境中可以在行业前沿的AI辅助下进行通电测试、参数修改、故障排查等操作将实物操作的经验与虚拟仿真的即时反馈和深度分析能力结合起来。
<img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615210657893.png" alt="image-20250615210657893" style="zoom:25%;" />
```mermaid
graph LR
A[用户拍摄真实电路照片] --> AI_Module;
subgraph AI_Module [AI电路识别与转换模块]
E{AI元件识别 YOLOv8};
E --> F[识别结果: 元件, 位置];
F --> G{AI连接关系分析};
G --> I[生成电路拓扑数据 JSON];
end
I --> J[浏览器中复现可交互虚拟电路];
```
<center>图4-7 AI电路虚拟实验室流程图</center>
@ -328,7 +332,7 @@ graph TD
| AI分析复杂电路 | AI直接操作修改电路 |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| <img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615184921833.png" alt="image-20250615184921833" style="zoom: 50%;" /><br /><center>图4-8 AI智能电路分析界面</center> | <img src="./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615184724178.png" alt="image-20250615184724178" style="zoom: 50%;" /><br /><center>图4-9 AI辅助电路修改界面</center> |
| ![image-20250615184921833](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615184921833.png)<br /><center>图4-8 AI智能电路分析界面</center> | ![image-20250615184724178](./AI%20%E8%A7%86%E8%A7%89%E9%A9%B1%E5%8A%A8%E7%9A%84%E6%99%BA%E6%85%A7%E7%89%A9%E7%90%86%E5%AE%9E%E9%AA%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%95%99%E5%AD%A6%E5%B9%B3%E5%8F%B0.assets/image-20250615184724178.png)<br /><center>图4-9 AI辅助电路修改界面</center> |
## 5. 项目创新点与特色