TIAN-LEIDA-JIANCE/create_linux_package.sh

444 lines
10 KiB
Bash
Raw Normal View History

#!/bin/bash
# 宇树雷达检测系统 - Linux软件包创建脚本
set -e
echo "🚀 创建宇树雷达检测系统Linux软件包..."
# 版本信息
VERSION="1.0.0"
PACKAGE_NAME="yushu-radar-detector"
PACKAGE_DIR="linux-package"
INSTALL_DIR="/opt/yushu-radar"
DESKTOP_DIR="/usr/share/applications"
ICON_DIR="/usr/share/pixmaps"
# 清理旧的包目录
rm -rf ${PACKAGE_DIR}
mkdir -p ${PACKAGE_DIR}
echo "📦 准备软件包结构..."
# 创建目录结构
mkdir -p ${PACKAGE_DIR}/{bin,lib,config,docs,scripts,desktop}
# 1. 编译程序
echo "🔨 编译程序..."
if [ ! -d "build" ]; then
mkdir build
fi
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc) yushu_leida_fixed
if [ ! -f "yushu_leida_fixed" ]; then
echo "❌ 编译失败"
exit 1
fi
cd ..
# 2. 复制主程序
echo "📁 复制程序文件..."
cp build/yushu_leida_fixed ${PACKAGE_DIR}/bin/
chmod +x ${PACKAGE_DIR}/bin/yushu_leida_fixed
# 3. 复制配置文件
cp -r config/* ${PACKAGE_DIR}/config/
# 4. 复制宇树SDK库文件
echo "📚 复制依赖库..."
UNITREE_LIB="unilidar_sdk-main/unilidar_sdk-main/unitree_lidar_sdk/lib/x86_64/libunitree_lidar_sdk.a"
if [ -f "$UNITREE_LIB" ]; then
cp "$UNITREE_LIB" ${PACKAGE_DIR}/lib/
fi
# 5. 创建启动脚本
echo "📝 创建启动脚本..."
cat > ${PACKAGE_DIR}/bin/yushu-radar << 'EOF'
#!/bin/bash
# 宇树雷达检测系统启动脚本
# 设置环境变量
export YUSHU_RADAR_HOME="/opt/yushu-radar"
export LD_LIBRARY_PATH="$YUSHU_RADAR_HOME/lib:$LD_LIBRARY_PATH"
# 检查设备权限
check_device_permissions() {
local devices=("/dev/ttyUSB0" "/dev/ttyUSB1" "/dev/ttyACM0")
local found_device=""
for device in "${devices[@]}"; do
if [ -e "$device" ]; then
found_device="$device"
break
fi
done
if [ -z "$found_device" ]; then
echo "⚠️ 未找到雷达设备,请检查连接"
echo "可用设备:"
ls -l /dev/ttyUSB* /dev/ttyACM* 2>/dev/null || echo "无串口设备"
return 1
fi
if [ ! -r "$found_device" ] || [ ! -w "$found_device" ]; then
echo "⚠️ 设备权限不足:$found_device"
echo "请运行sudo chmod 666 $found_device"
echo "或将用户添加到dialout组sudo usermod -a -G dialout $USER"
return 1
fi
echo "✅ 设备检查通过:$found_device"
return 0
}
# 检查依赖
check_dependencies() {
local missing_deps=()
# 检查PCL
if ! pkg-config --exists pcl_common; then
missing_deps+=("libpcl-dev")
fi
# 检查yaml-cpp
if ! pkg-config --exists yaml-cpp; then
missing_deps+=("libyaml-cpp-dev")
fi
# 检查espeak (语音)
if ! command -v espeak >/dev/null 2>&1; then
missing_deps+=("espeak")
fi
if [ ${#missing_deps[@]} -gt 0 ]; then
echo "❌ 缺少依赖包:"
printf '%s\n' "${missing_deps[@]}"
echo "请运行sudo apt install ${missing_deps[*]}"
return 1
fi
return 0
}
# 主函数
main() {
echo "🚀 启动宇树雷达检测系统..."
# 切换到程序目录
cd "$YUSHU_RADAR_HOME"
# 检查依赖
if ! check_dependencies; then
exit 1
fi
# 检查设备权限
if ! check_device_permissions; then
exit 1
fi
# 启动程序
echo "🎯 启动主程序..."
exec "$YUSHU_RADAR_HOME/bin/yushu_leida_fixed"
}
# 处理命令行参数
case "$1" in
--check)
check_dependencies && check_device_permissions
;;
--help)
echo "宇树雷达检测系统"
echo "用法:"
echo " yushu-radar 启动程序"
echo " yushu-radar --check 检查系统依赖"
echo " yushu-radar --help 显示帮助"
;;
*)
main
;;
esac
EOF
chmod +x ${PACKAGE_DIR}/bin/yushu-radar
# 6. 创建桌面文件
echo "🖥️ 创建桌面应用..."
cat > ${PACKAGE_DIR}/desktop/yushu-radar.desktop << 'EOF'
[Desktop Entry]
Version=1.0
Type=Application
Name=宇树雷达检测系统
Name[en]=Unitree Radar Detection System
Comment=坡面裂缝和遮挡物检测系统
Comment[en]=Slope crack and occlusion detection system
Exec=/opt/yushu-radar/bin/yushu-radar
Icon=yushu-radar
Terminal=true
Categories=Science;Engineering;
Keywords=radar;detection;lidar;unitree;
StartupNotify=true
EOF
# 7. 创建图标 (简单的文本图标)
echo "🎨 创建应用图标..."
cat > ${PACKAGE_DIR}/desktop/yushu-radar.svg << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
<rect width="64" height="64" fill="#2E86AB" rx="8"/>
<circle cx="32" cy="32" r="20" fill="none" stroke="#A23B72" stroke-width="2"/>
<circle cx="32" cy="32" r="12" fill="none" stroke="#F18F01" stroke-width="2"/>
<circle cx="32" cy="32" r="4" fill="#C73E1D"/>
<text x="32" y="52" text-anchor="middle" fill="white" font-family="Arial" font-size="8">RADAR</text>
</svg>
EOF
# 8. 创建安装脚本
echo "⚙️ 创建安装脚本..."
cat > ${PACKAGE_DIR}/install.sh << 'EOF'
#!/bin/bash
# 宇树雷达检测系统安装脚本
set -e
INSTALL_DIR="/opt/yushu-radar"
DESKTOP_FILE="/usr/share/applications/yushu-radar.desktop"
ICON_FILE="/usr/share/pixmaps/yushu-radar.svg"
BIN_LINK="/usr/local/bin/yushu-radar"
echo "🚀 安装宇树雷达检测系统..."
# 检查权限
if [ "$EUID" -ne 0 ]; then
echo "❌ 请使用sudo运行此脚本"
exit 1
fi
# 1. 创建安装目录
echo "📁 创建安装目录..."
mkdir -p "$INSTALL_DIR"
# 2. 复制文件
echo "📦 复制程序文件..."
cp -r bin lib config docs "$INSTALL_DIR/"
# 3. 设置权限
chmod +x "$INSTALL_DIR/bin/yushu_leida_fixed"
chmod +x "$INSTALL_DIR/bin/yushu-radar"
# 4. 创建符号链接
echo "🔗 创建系统链接..."
ln -sf "$INSTALL_DIR/bin/yushu-radar" "$BIN_LINK"
# 5. 安装桌面文件
echo "🖥️ 安装桌面应用..."
cp desktop/yushu-radar.desktop "$DESKTOP_FILE"
cp desktop/yushu-radar.svg "$ICON_FILE"
# 6. 更新桌面数据库
if command -v update-desktop-database >/dev/null 2>&1; then
update-desktop-database /usr/share/applications
fi
# 7. 安装依赖
echo "📚 检查并安装依赖..."
apt update
apt install -y libpcl-dev libyaml-cpp-dev espeak
# 8. 设置用户组权限
echo "👥 配置用户权限..."
if ! getent group dialout >/dev/null; then
groupadd dialout
fi
# 提示用户添加到dialout组
echo ""
echo "✅ 安装完成!"
echo ""
echo "📋 使用方法:"
echo "1. 命令行启动yushu-radar"
echo "2. 图形界面:在应用菜单中找到'宇树雷达检测系统'"
echo ""
echo "⚠️ 重要提醒:"
echo "请将当前用户添加到dialout组以访问串口设备"
echo "sudo usermod -a -G dialout \$USER"
echo "然后重新登录或重启系统"
echo ""
EOF
chmod +x ${PACKAGE_DIR}/install.sh
# 9. 创建卸载脚本
cat > ${PACKAGE_DIR}/uninstall.sh << 'EOF'
#!/bin/bash
# 宇树雷达检测系统卸载脚本
INSTALL_DIR="/opt/yushu-radar"
DESKTOP_FILE="/usr/share/applications/yushu-radar.desktop"
ICON_FILE="/usr/share/pixmaps/yushu-radar.svg"
BIN_LINK="/usr/local/bin/yushu-radar"
echo "🗑️ 卸载宇树雷达检测系统..."
# 检查权限
if [ "$EUID" -ne 0 ]; then
echo "❌ 请使用sudo运行此脚本"
exit 1
fi
# 删除文件
rm -rf "$INSTALL_DIR"
rm -f "$DESKTOP_FILE"
rm -f "$ICON_FILE"
rm -f "$BIN_LINK"
# 更新桌面数据库
if command -v update-desktop-database >/dev/null 2>&1; then
update-desktop-database /usr/share/applications
fi
echo "✅ 卸载完成"
EOF
chmod +x ${PACKAGE_DIR}/uninstall.sh
# 10. 创建文档
echo "📖 创建文档..."
cat > ${PACKAGE_DIR}/docs/README.md << 'EOF'
# 宇树雷达检测系统
## 功能特点
- 🎯 实时3D点云显示
- 📊 坐标轴和网格显示
- ⚠️ 遮挡物检测 (20厘米预警)
- 🔍 裂缝检测 (100米阈值)
- 🔊 声音预警系统
- 🖥️ 图形化界面
## 系统要求
- Ubuntu 18.04 或更高版本
- PCL (Point Cloud Library)
- yaml-cpp
- espeak (语音合成)
- 宇树雷达设备
## 安装方法
```bash
sudo ./install.sh
```
## 使用方法
### 命令行启动
```bash
yushu-radar
```
### 图形界面启动
在应用菜单中找到"宇树雷达检测系统"
### 检查系统状态
```bash
yushu-radar --check
```
## 配置文件
配置文件位于:`/opt/yushu-radar/config/config.yaml`
主要配置项:
- `port`: 串口设备路径
- `occlusion_detection.alert_distance`: 遮挡物预警距离
- `slope_detection.crack_threshold`: 裂缝检测阈值
## 故障排除
### 设备权限问题
```bash
sudo chmod 666 /dev/ttyUSB0
# 或
sudo usermod -a -G dialout $USER
```
### 依赖包问题
```bash
sudo apt install libpcl-dev libyaml-cpp-dev espeak
```
## 卸载
```bash
sudo ./uninstall.sh
```
EOF
# 11. 创建打包脚本
cat > ${PACKAGE_DIR}/package.sh << 'EOF'
#!/bin/bash
# 创建分发包
VERSION="1.0.0"
PACKAGE_NAME="yushu-radar-detector-${VERSION}"
echo "📦 创建分发包..."
# 创建tar.gz包
cd ..
tar -czf "${PACKAGE_NAME}.tar.gz" linux-package/
echo "✅ 创建完成: ${PACKAGE_NAME}.tar.gz"
# 创建deb包 (如果有dpkg-deb)
if command -v dpkg-deb >/dev/null 2>&1; then
echo "📦 创建DEB包..."
mkdir -p deb-package/DEBIAN
cat > deb-package/DEBIAN/control << DEBEOF
Package: yushu-radar-detector
Version: ${VERSION}
Section: science
Priority: optional
Architecture: amd64
Depends: libpcl-dev, libyaml-cpp-dev, espeak
Maintainer: Yushu Radar Team
Description: 宇树雷达检测系统
坡面裂缝和遮挡物检测系统支持实时3D点云显示和智能预警。
DEBEOF
# 复制文件到deb结构
mkdir -p deb-package/opt/yushu-radar
cp -r linux-package/{bin,lib,config,docs} deb-package/opt/yushu-radar/
mkdir -p deb-package/usr/share/applications
cp linux-package/desktop/yushu-radar.desktop deb-package/usr/share/applications/
mkdir -p deb-package/usr/share/pixmaps
cp linux-package/desktop/yushu-radar.svg deb-package/usr/share/pixmaps/
mkdir -p deb-package/usr/local/bin
ln -sf /opt/yushu-radar/bin/yushu-radar deb-package/usr/local/bin/yushu-radar
dpkg-deb --build deb-package "${PACKAGE_NAME}.deb"
echo "✅ DEB包创建完成: ${PACKAGE_NAME}.deb"
fi
EOF
chmod +x ${PACKAGE_DIR}/package.sh
echo ""
echo "🎉 Linux软件包创建完成"
echo ""
echo "📁 软件包位置: ${PACKAGE_DIR}/"
echo ""
echo "📋 使用方法:"
echo "1. 安装: cd ${PACKAGE_DIR} && sudo ./install.sh"
echo "2. 启动: yushu-radar"
echo "3. 卸载: sudo ./uninstall.sh"
echo ""
echo "📦 创建分发包: cd ${PACKAGE_DIR} && ./package.sh"
echo ""