diff --git a/README.md b/README.md new file mode 100644 index 0000000..73a4318 --- /dev/null +++ b/README.md @@ -0,0 +1,92 @@ +# 智慧医疗2026年代码仓库 + +# 一、文件夹说明 +## `dependencies` +`dependencies.txt`存储依赖名称 + +## `src` +存放源代码 + +## `bashes` +自动脚本的存放路径 + +--- +

+# 二、关于雷达驱动自动配置脚本的说明 +## 1. 配置说明:在设备上配置开机自启动(仅使用雷达的情况直接看第二点) +1. 放到固定位置并授权 + ```bash + sudo cp 你的脚本路径 /usr/local/bin/radar-driver-switch.sh + sudo chmod +x /usr/local/bin/radar-driver-switch.sh + sudo chown root:root /usr/local/bin/radar-driver-switch.sh + ``` +2. 创建 systemd 服务文件 + ```bash + sudo vim /etc/systemd/system/radar-driver-switch.service + ``` + 编辑内容: + ```ini + [Unit] + Description=雷达驱动自动切换程序 + After=sysfs.target udev.target systemd-udevd.service + Before=multi-user.target + + [Service] + Type=oneshot + ExecStart=/usr/local/bin/radar-driver-switch.sh + User=root + Group=root + StandardOutput=journal+console + StandardError=journal+console + + [Install] + WantedBy=multi-user.target + ``` +3. 应用开机自启 + ```bash + sudo systemctl daemon-reload + sudo systemctl enable radar-driver-switch.service + ``` +4. 测试与debug + - 测试一次 + ```bash + sudo systemctl start radar-driver-switch.service + ``` + - 查看状态 / 日志(排查必用) + ```bash + sudo systemctl status radar-driver-switch.service + ``` + - 看 dmesg 日志 + ```bash + dmesg | grep 雷达驱动自动切换程序 + ``` +--- +### 特别说明 +1. 关于退出码对应的情况,详见sh文件开头 +2. 日志输出在`/dev/kmsg`文件中,使用`dmesg | grep 雷达驱动自动切换程序`命令即可查看 + +## 2. 使用说明: +1. 设备开机自动启动脚本连接雷达。若开机时雷达与设备没有物理连接,则需要手动启动脚本连接雷达 +2. 查看雷达是否物理连接 + ```bash + lsusb + ``` + 返回的数据中,如果有` ID 1a86:55d4 QinHeng Electronics USB Single Serial`,则物理连接成功。 +3. 查看是否成功驱动雷达 + ```bash + ls /dev/tty* + ``` + 看返回数据,默认串口连接设备为`ttyACM*`,名为`ttyACM0`的设备是IMU,如果存在`ttyACM1`,则雷达连接失败; + + 如果出现`ttyCH340`,则说明雷达设备驱动成功 + +--- +

+# 三、其它说明 +我设置了一些自定义指令,方便终端调试: +```bash +rosbuild # 编译指定包 +build_debug # 以调试模式编译指定包 +foxglove # 启动foxbridge +``` + diff --git a/bashes/README.md b/bashes/README.md new file mode 100644 index 0000000..42b9182 --- /dev/null +++ b/bashes/README.md @@ -0,0 +1,52 @@ +## 关于雷达驱动自动配置脚本的说明 +### 在设备上配置开机自启动 +1. 放到固定位置并授权 + ```bash + sudo cp 你的脚本路径 /usr/local/bin/radar-driver-switch.sh + sudo chmod +x /usr/local/bin/radar-driver-switch.sh + sudo chown root:root /usr/local/bin/radar-driver-switch.sh + ``` +2. 创建 systemd 服务文件 + ```bash + sudo vim /etc/systemd/system/radar-driver-switch.service + ``` + 编辑内容: + ```ini + [Unit] + Description=雷达驱动自动切换程序 + After=sysfs.target udev.target systemd-udevd.service + Before=multi-user.target + + [Service] + Type=oneshot + ExecStart=/usr/local/bin/radar-driver-switch.sh + User=root + Group=root + StandardOutput=journal+console + StandardError=journal+console + + [Install] + WantedBy=multi-user.target + ``` +3. 应用开机自启 + ```bash + sudo systemctl daemon-reload + sudo systemctl enable radar-driver-switch.service + ``` +4. 测试与debug + - 测试一次 + ```bash + sudo systemctl start radar-driver-switch.service + ``` + - 查看状态 / 日志(排查必用) + ```bash + sudo systemctl status radar-driver-switch.service + ``` + - 看 dmesg 日志 + ```bash + dmesg | grep 雷达驱动自动切换程序 + ``` +--- +### 特别说明 +1. 关于退出码对应的情况,详见sh文件开头 +2. 日志输出在`/dev/kmsg`文件中,使用`dmesg | grep 雷达驱动自动切换程序`命令即可查看 \ No newline at end of file diff --git a/bashes/radar-driver-switch.sh b/bashes/radar-driver-switch.sh new file mode 100644 index 0000000..c64b9ce --- /dev/null +++ b/bashes/radar-driver-switch.sh @@ -0,0 +1,101 @@ +#!/bin/bash + +# 退出码说明 +# 0 - 成功 +# 1 - 错误:等待TTY设备就绪超时 +# 2 - 错误:未找到CH343驱动 +# 3 - 错误:雷达端口上未找到CH34x设备 +# 4 - 错误:未从cdc_acm找到雷达接口 +# 5 - 错误:解绑cdc_acm驱动失败 +# 6 - 错误:绑定usb_ch343驱动失败 + +# ── 配置 ──────────────────────────────────────────── +TTY_DEVICE="/dev/ttyACM*" +CDC_ACM_PATH="/sys/bus/usb/drivers/cdc_acm" +USB_CH343_PATH="/sys/bus/usb/drivers/usb_ch343" +RADAR_USB_PORT="1-1.4" # 雷达 CH34x 的 USB 物理端口(固定不变) +CHECK_INTERVAL=1 +MAX_WAIT_SECONDS=30 + +# ── 初始化 ────────────────────────────────────────── +start_time=$(cut -d. -f1 /proc/uptime) + +# ── 1. 等待 TTY 设备就绪 ──────────────────────────── +while true; do + for dev in /dev/ttyACM*; do + [ -e "$dev" ] || continue + if [ -c "$dev" ] && [ -r "$dev" ] && [ -w "$dev" ]; then + echo "[雷达驱动自动切换程序] 设备 $dev 已就绪!" > /dev/kmsg + TTY_DEVICE="$dev" + break 2 + fi + done + + if [ ${MAX_WAIT_SECONDS} -gt 0 ]; then + current_time=$(cut -d. -f1 /proc/uptime) + elapsed_seconds=$((current_time - start_time)) + if [ ${elapsed_seconds} -ge ${MAX_WAIT_SECONDS} ]; then + echo "[雷达驱动自动切换程序] 错误:等待 ${TTY_DEVICE} 超时(${MAX_WAIT_SECONDS}秒)!" > /dev/kmsg + exit 1 + fi + echo "[雷达驱动自动切换程序] 仍在等待${TTY_DEVICE}(已等待${elapsed_seconds}秒)..." > /dev/kmsg + fi + sleep ${CHECK_INTERVAL} +done + +# ── 2. 确认 CH343 驱动已加载 ──────────────────────── +if [ -d "${USB_CH343_PATH}" ]; then + echo "[雷达驱动自动切换程序] CH343驱动已加载,继续..." > /dev/kmsg +else + echo "[雷达驱动自动切换程序] 错误:未找到CH343驱动!" > /dev/kmsg + exit 2 +fi + +# ── 3. 通过物理端口定位雷达 CH34x ─────────────────── +radar_sysfs="/sys/bus/usb/devices/${RADAR_USB_PORT}" + +if [ ! -d "${radar_sysfs}" ]; then + echo "[雷达驱动自动切换程序] 错误:端口 ${RADAR_USB_PORT} 上无设备!" > /dev/kmsg + exit 3 +fi + +vendor_id=$(cat "${radar_sysfs}/idVendor" 2>/dev/null) +product_id=$(cat "${radar_sysfs}/idProduct" 2>/dev/null) + +if [ "${vendor_id}" != "1a86" ] || [ "${product_id}" != "55d4" ]; then + echo "[雷达驱动自动切换程序] 错误:端口 ${RADAR_USB_PORT} 上 VID:PID=${vendor_id}:${product_id},非雷达CH34x!" > /dev/kmsg + exit 3 +fi + +echo "[雷达驱动自动切换程序] 雷达确认位于端口 ${RADAR_USB_PORT},VID:PID=${vendor_id}:${product_id}" > /dev/kmsg + +# ── 4. 查找 cdc_acm 下雷达的接口 ──────────────────── +cdc_acm_sub_addr=$(ls "${CDC_ACM_PATH}" 2>/dev/null | grep "^${RADAR_USB_PORT}:" | head -n 1) + +if [ -z "${cdc_acm_sub_addr}" ]; then + echo "[雷达驱动自动切换程序] 错误:cdc_acm驱动中未找到端口 ${RADAR_USB_PORT} 的接口" > /dev/kmsg + exit 4 +fi + +echo "[雷达驱动自动切换程序] 雷达 cdc_acm 接口:${cdc_acm_sub_addr}" > /dev/kmsg + +# ── 5. 解绑 cdc_acm ───────────────────────────────── +echo "${cdc_acm_sub_addr}" | sudo tee "${CDC_ACM_PATH}/unbind" > /dev/null 2>&1 +if [ $? -eq 0 ]; then + echo "[雷达驱动自动切换程序] 已解绑 cdc_acm:${cdc_acm_sub_addr}" > /dev/kmsg +else + echo "[雷达驱动自动切换程序] 错误:解绑 cdc_acm 失败" > /dev/kmsg + exit 5 +fi + +# ── 6. 绑定 ch343 ─────────────────────────────────── +echo "${cdc_acm_sub_addr}" | sudo tee "${USB_CH343_PATH}/bind" > /dev/null 2>&1 +if [ $? -eq 0 ]; then + echo "[雷达驱动自动切换程序] 已绑定 usb_ch343:${cdc_acm_sub_addr}" > /dev/kmsg +else + echo "[雷达驱动自动切换程序] 错误:绑定 usb_ch343 失败" > /dev/kmsg + exit 6 +fi + +echo "[雷达驱动自动切换程序] 雷达驱动切换完毕!" > /dev/kmsg +exit 0 diff --git a/bashes/radar-driver-switch.sh.bak b/bashes/radar-driver-switch.sh.bak new file mode 100644 index 0000000..edf5f15 --- /dev/null +++ b/bashes/radar-driver-switch.sh.bak @@ -0,0 +1,129 @@ +#!/bin/bash + +# 退出码说明 +# 0 - 成功 +# 1 - 错误:等待TTY设备就绪超时 +# 2 - 错误:未找到CH343驱动 +# 3 - 错误:未找到含Qingheng的USB设备 +# 4 - 错误:未找到对应USB地址 +# 5 - 错误:未找到cdc_acm绑定的对应USB设备 +# 6 - 错误:解绑cdc_acm驱动失败 +# 7 - 错误:绑定usb_ch343驱动失败 + +# 变量设置 +TTY_DEVICE="/dev/ttyACM*" # 替换为你要等待的tty设备路径 +CDC_ACM_PATH="/sys/bus/usb/drivers/cdc_acm" +USB_CH343_PATH="/sys/bus/usb/drivers/usb_ch343" +CHECK_INTERVAL=1 # 检查设备就绪的时间间隔(秒) +MAX_WAIT_SECONDS=30 # 最大等待时间(秒),0表示无限等待 + +# 初始化变量 +start_time=$(cut -d. -f1 /proc/uptime) +current_time=0 +qinheng_id="" +usb_address="" +vendor_id="" +product_id="" +cdc_acm_sub_addr="" + + +# ----------------- 1. 等待TTY设备就绪 ----------------- +# 循环等待tty设备就绪(检查设备节点是否存在+是否可读写) +while true; do + for dev in /dev/ttyACM*; do + [ -e "$dev" ] || continue + if [ -c "$dev" ] && [ -r "$dev" ] && [ -w "$dev" ]; then + echo "[雷达驱动自动切换程序] 设备 $dev 已就绪!" > /dev/kmsg + TTY_DEVICE="$dev" + break 2 # 跳出两层循环 + fi + done + + if [ ${MAX_WAIT_SECONDS} -gt 0 ]; then + current_time=$(cut -d. -f1 /proc/uptime) + elapsed_seconds=$((current_time - start_time)) + if [ ${elapsed_seconds} -ge ${MAX_WAIT_SECONDS} ]; then + echo "[雷达驱动自动切换程序] 错误:等待 ${TTY_DEVICE} 超时(${MAX_WAIT_SECONDS}秒)!" > /dev/kmsg + exit 1 + fi + echo "[雷达驱动自动切换程序] 仍在等待${TTY_DEVICE}(已等待${elapsed_seconds}秒)..." > /dev/kmsg + fi + + sleep ${CHECK_INTERVAL} +done + +# ------ 2. 查看CH343是否存在 ------ +if ls /sys/bus/usb/drivers/usb_ch343 > /dev/null 2>&1; then + echo "[雷达驱动自动切换程序] 检测到CH343驱动存在,继续执行..." > /dev/kmsg +else + echo "[雷达驱动自动切换程序] 错误:未找到CH343驱动!" > /dev/kmsg + exit 2 +fi + + +# ------------- 3. 查找Qingheng对应的usb接口 ------------- +echo "[雷达驱动自动切换程序] 开始提取QinHeng设备ID..." > /dev/kmsg + +# 执行lsusb并过滤含QinHeng的行,提取ID(核心逻辑) +qinheng_id=$(lsusb | grep "QinHeng" | awk '{print $6}' | head -n 1) + +# 检查是否提取到ID +if [ -z "${qinheng_id}" ]; then + echo "[雷达驱动自动切换程序] 错误:未找到含QinHeng的USB设备!" > /dev/kmsg + exit 3 +else + echo "[雷达驱动自动切换程序] 成功提取QinHeng设备ID:${qinheng_id}" > /dev/kmsg + # 将ID拆分为vendor_id和product_id + vendor_id=$(echo "${qinheng_id}" | cut -d ':' -f 1) + product_id=$(echo "${qinheng_id}" | cut -d ':' -f 2) +fi + +# -------------------- 4. 提取USB地址 -------------------- +echo "[雷达驱动自动切换程序] 开始查找idVendor=${vendor_id},idProduct=${product_id}的USB地址..." > /dev/kmsg +# 核心命令:过滤dmesg日志,提取USB地址 +usb_address=$(dmesg | grep -E "idVendor=${vendor_id}, idProduct=${product_id}" | grep -oE "usb [0-9]+-[0-9.]+:" | awk '{print $2}' | sed 's/://' | tail -n 1) + +# 检查是否提取到USB地址 +if [ -z "${usb_address}" ]; then + echo "[雷达驱动自动切换程序] 错误:未找到对应USB地址" > /dev/kmsg + exit 4 +else + echo "[雷达驱动自动切换程序] 成功找到USB地址:${usb_address}" > /dev/kmsg +fi + +# ---- 5. 找到cdc_acm驱动对应的usb设备 ---- +echo "[雷达驱动自动切换程序] 开始从${CDC_ACM_PATH}提取${usb_address}对应的子地址..." > /dev/kmsg + +cdc_acm_sub_addr=$(ls "${CDC_ACM_PATH}" 2>/dev/null | grep "^${usb_address}:" | head -n 1) + +if [ -z "${cdc_acm_sub_addr}" ]; then + echo "[雷达驱动自动切换程序] 错误:${CDC_ACM_PATH}中未找到${usb_address}绑定的对应USB设备" > /dev/kmsg + exit 5 +else + echo "[雷达驱动自动切换程序] 成功提取cdc_acm子地址:${cdc_acm_sub_addr}" > /dev/kmsg +fi + +# 6. 切换驱动 +echo "[雷达驱动自动切换程序] 开始切换cdc_acm驱动到USB地址${usb_address}..." > /dev/kmsg + +echo "${cdc_acm_sub_addr}" | sudo tee "${CDC_ACM_PATH}/unbind" 2>/dev/null +if [ $? -eq 0 ]; then + echo "[雷达驱动自动切换程序] 成功解绑cdc_acm驱动:${cdc_acm_sub_addr}" > /dev/kmsg +else + echo "[雷达驱动自动切换程序] 错误:解绑cdc_acm驱动失败" > /dev/kmsg + exit 6 +fi + +echo "${cdc_acm_sub_addr}" | sudo tee "${USB_CH343_PATH}/bind" 2>/dev/null +if [ $? -eq 0 ]; then + echo "[雷达驱动自动切换程序] 成功绑定usb_ch343驱动:${cdc_acm_sub_addr}" > /dev/kmsg +else + echo "[雷达驱动自动切换程序] 错误:绑定usb_ch343驱动失败(检查驱动是否加载)" > /dev/kmsg + exit 7 +fi + + +# 执行完成 +echo "[雷达驱动自动切换程序] 雷达驱动自动切换完毕!" > /dev/kmsg + +exit 0 \ No newline at end of file