1
0
forked from zbw/yiliao2026

添加了雷达驱动

This commit is contained in:
2026-06-08 16:47:49 +08:00
parent 8b775db45f
commit 8afecfda8f
4 changed files with 374 additions and 0 deletions

92
README.md Normal file
View File

@@ -0,0 +1,92 @@
# 智慧医疗2026年代码仓库
# 一、文件夹说明
## `dependencies`
`dependencies.txt`存储依赖名称
## `src`
存放源代码
## `bashes`
自动脚本的存放路径
---
<br></br>
# 二、关于雷达驱动自动配置脚本的说明
## 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`,则说明雷达设备驱动成功
---
<br></br>
# 三、其它说明
我设置了一些自定义指令,方便终端调试:
```bash
rosbuild <package_name> # 编译指定包
build_debug <package_name> # 以调试模式编译指定包
foxglove # 启动foxbridge
```

52
bashes/README.md Normal file
View File

@@ -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 雷达驱动自动切换程序`命令即可查看

View File

@@ -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

View File

@@ -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