This commit is contained in:
lyq 2026-01-30 09:37:06 +08:00
parent 381788f467
commit 7cf7201361
4 changed files with 4 additions and 472 deletions

144
README.md
View File

@ -1,148 +1,12 @@
# 清扫车 ROS2 控制与定位消息接口
# ZXOS
## 1. 文档概述
清扫车 ROS2 控制与定位消息接口
智行智驾低速自主驾驶体系 -- 车端ROS2固件ZXOS。该固件适配ZX200/ZX800自主智能清扫车。
## 2. 依赖环境
### 2.1 系统环境
* **ROS2 版本**Foxy
* **Ubuntu 版本**20.04
### 2.2 .deb 的安装、启动与卸载
在目标机器上执行安装:
```bash
sudo dpkg -i controller_XXXX_arm64.deb
```
安装完成后主要文件路径:
工作空间:/opt/controller/
启动脚本:/opt/controller/start_all.sh
CAN 配置脚本:/opt/controller/can.sh
日志文件:/var/log/controller/controller.log
systemd 服务:
CAN 配置服务:/etc/systemd/system/controller-can.service
ROS2 节点服务:/etc/systemd/system/controller.service
安装后CAN 配置服务会先运行,确保 can0 接口可用,然后 ROS2 节点服务会启动。
手动启动 ROS2 节点:
```bash
sudo systemctl start controller.service
```
重启服务:
```bash
sudo systemctl restart controller.service
```
启动 CAN 配置服务(通常自动执行,不需要手动):
```bash
sudo systemctl start controller-can.service
```
查看运行状态
```bash
sudo systemctl status controller.service
sudo systemctl status controller-can.service
```
实时查看最新日志:
```bash
tail -f /var/log/controller/controller.log
```
也可以使用 journalctl 查看 systemd 输出:
```bash
sudo journalctl -u controller.service -f
```
旧日志会自动轮转,由 logrotate 管理,每天生成一个历史日志,历史日志会压缩 .gz默认保留最近 14 天日志
轮转后的文件示例:
```bash
/var/log/controller/controller.log # 当天日志
/var/log/controller/controller.log-20250923.gz # 历史压缩日志
```
停止服务
```bash
sudo systemctl stop controller.service
sudo systemctl stop controller-can.service
```
禁用开机自启
```bash
sudo systemctl disable controller.service
sudo systemctl disable controller-can.service
```
卸载 deb 包
```bash
sudo dpkg -r controller
```
卸载包后 日志文件会保留,便于调试。
## 3. 消息msg文件详情
### 3.1 McCtrl.msg车辆控制指令消息
#### 字段定义
| 字段类型 | 字段名称 | 取值范围 / 说明 | 功能描述 |
| -------- | ------------------------------- | ----------------------------------------------- | ------------------------------------------------------------ |
| uint8 | brake | 0不刹、1 | 电磁刹控制0 表示解除电磁刹1 表示激活电磁刹 |
| uint8 | gear | 0空挡、1后退、2前进、3保留 | 车辆挡位控制3 为预留挡位暂未使用 |
| uint8 | rpm | 0-4000 | 电机转速指令数值直接对应实际电机转速rpm |
| float32 | angle | \[-40.0, 40.0] | 轮端转向角度控制,单位为度(°),[-左、+右] |
| uint16 | angle\_speed | 120-1500 | 转向角速度控制,单位为 rpm |
| bool | sweep | true清扫、false不清扫 | 清扫 |
#### 对应 Topic
* **Topic**`/auto_mc_ctrl`
### 3.2 Rtk.msgRTK 定位信息消息)
#### 字段定义
| 字段类型 | 字段名称 | 取值范围 / 说明 | 功能描述 |
| -------- | ---------- | ----------------------------------------- | ------------------------------------------------------------ |
| float64 | lat | 无固定范围(符合 WGS84 坐标系经纬度格式) | 车辆所在位置的纬度 |
| float64 | lon | 无固定范围(符合 WGS84 坐标系经纬度格式) | 车辆所在位置的经度 |
| float32 | head | 0-360 | 车辆航向角单位0° 表示正北方向,顺时针递增 |
| float32 | speed | | |
| int32 | p\_quality | 0-9 | 定位解状态<br /> 0初始化 1单点定位 2码差分 3无效PPS 4固定解 5浮点解 6正在估算 7人工输入固定值 8模拟模式 9WAAS差分;<br /> 固定解是最优解 |
| int32 | h\_quality | 0-9 | 定向解状态<br /> 0初始化 1单点定位 2码差分 3无效PPS 4固定解 5浮点解 6正在估算 7人工输入固定值 8模拟模式 9WAAS差分;<br /> 固定解是最优解 |
#### 对应 Topic
* **Topic**`/rtk_message`
* **ROS2 版本**ROS2 Humble
* **Ubuntu 版本**Ubuntu 22.04

Binary file not shown.

View File

@ -1,194 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
PKG_NAME="controller"
PKG_VERSION="$(date +%Y%m%d%H%M)"
ARCH="arm64"
MAINTAINER="LYQ<liyq@ntiov.com>"
DESCRIPTION="Binary package of remote controller nodes for robot (ROS2 foxy)."
INSTALL_DIR="/opt/${PKG_NAME}"
WORKDIR="$(pwd)/deb_build"
INSTALL_SRC="$(pwd)/install"
# 清理工作目录
rm -rf "${WORKDIR}"
mkdir -p "${WORKDIR}/${INSTALL_DIR}"
mkdir -p "${WORKDIR}/DEBIAN"
# 复制 ROS2 install 文件
cp -a "${INSTALL_SRC}/." "${WORKDIR}/${INSTALL_DIR}/"
# control 文件
cat > "${WORKDIR}/DEBIAN/control" <<EOF
Package: ${PKG_NAME}
Version: ${PKG_VERSION}
Section: misc
Priority: optional
Architecture: ${ARCH}
Essential: no
Maintainer: ${MAINTAINER}
Depends: ros-foxy-ros-base, logrotate
Description: ${DESCRIPTION}
EOF
# ============================
# 创建 can.sh (root 执行)
# ============================
cat > "${WORKDIR}/${INSTALL_DIR}/can.sh" <<'EOF'
#!/bin/bash
# Script: can.sh
# Description: Configures CAN interface can0 on startup
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
if ip link show can0 &> /dev/null; then
ip link set can0 down
fi
modprobe can
modprobe can_raw
modprobe mttcan
ip link set can0 type can bitrate 500000
ip link set up can0
if [[ $? -ne 0 ]]; then
echo "Error configuring CAN interface can0"
exit 1
fi
echo "CAN interface can0 configured successfully"
exit 0
EOF
chmod +x "${WORKDIR}/${INSTALL_DIR}/can.sh"
# ============================
# 创建 start_all.sh (aiec 用户执行)
# ============================
cat > "${WORKDIR}/${INSTALL_DIR}/start_all.sh" <<EOF
#!/bin/bash
set -e
# 加载 ROS2 系统环境
source /opt/ros/foxy/setup.bash
# 加载打包的工作空间环境
source ${INSTALL_DIR}/local_setup.bash
# 启动多个节点
ros2 run radio_ctrl radio_ctrl_node &
ros2 run mc mc_node &
ros2 run ctrl_arbiter ctrl_arbiter_node &
ros2 run mqtt_report mqtt_report_node &
# ros2 run rtk rtk_node &
# ros2 run pub_gps pub_gps_node &
wait
EOF
chmod +x "${WORKDIR}/${INSTALL_DIR}/start_all.sh"
# ============================
# systemd 服务目录
# ============================
mkdir -p "${WORKDIR}/etc/systemd/system"
# CAN 配置服务 (root 执行)
cat > "${WORKDIR}/etc/systemd/system/${PKG_NAME}-can.service" <<EOF
[Unit]
Description=Configure CAN interface can0
After=network.target
[Service]
Type=oneshot
ExecStart=${INSTALL_DIR}/can.sh
RemainAfterExit=yes
User=root
[Install]
WantedBy=multi-user.target
EOF
# ROS2 节点服务 (aiec 用户执行,日志写文件)
cat > "${WORKDIR}/etc/systemd/system/${PKG_NAME}.service" <<EOF
[Unit]
Description=Remote Controller Nodes
After=network.target ${PKG_NAME}-can.service
Requires=${PKG_NAME}-can.service
[Service]
Type=simple
User=aiec
Environment="ROS_DISTRO=foxy"
ExecStart=${INSTALL_DIR}/start_all.sh
Restart=on-failure
RestartSec=2
StandardOutput=append:/var/log/${PKG_NAME}/${PKG_NAME}.log
StandardError=append:/var/log/${PKG_NAME}/${PKG_NAME}.log
[Install]
WantedBy=multi-user.target
EOF
# ============================
# logrotate 配置
# ============================
mkdir -p "${WORKDIR}/etc/logrotate.d"
cat > "${WORKDIR}/etc/logrotate.d/${PKG_NAME}" <<EOF
/var/log/${PKG_NAME}/${PKG_NAME}.log {
daily
rotate 14
compress
missingok
notifempty
copytruncate
dateext
dateformat -%Y%m%d
}
EOF
# ============================
# postinst 启用服务
# ============================
cat > "${WORKDIR}/DEBIAN/postinst" <<EOF
#!/bin/bash
set -e
# 创建日志目录
mkdir -p /var/log/${PKG_NAME}
chown aiec:aiec /var/log/${PKG_NAME}
systemctl daemon-reload
systemctl enable ${PKG_NAME}-can.service
systemctl enable ${PKG_NAME}.service
exit 0
EOF
chmod 755 "${WORKDIR}/DEBIAN/postinst"
# ============================
# postrm 停用服务
# ============================
cat > "${WORKDIR}/DEBIAN/postrm" <<EOF
#!/bin/bash
set -e
systemctl stop ${PKG_NAME}.service || true
systemctl disable ${PKG_NAME}.service || true
systemctl stop ${PKG_NAME}-can.service || true
systemctl disable ${PKG_NAME}-can.service || true
systemctl daemon-reload
exit 0
EOF
chmod 755 "${WORKDIR}/DEBIAN/postrm"
# ============================
# 构建 deb 包
# ============================
dpkg-deb --build "${WORKDIR}" "${PKG_NAME}_${PKG_VERSION}_${ARCH}.deb"
echo "生成 ${PKG_NAME}_${PKG_VERSION}_${ARCH}.deb"

View File

@ -1,138 +0,0 @@
# sweeper_200 src 目录结构说明
## 1. 总体说明
sweeper_200 是一个基于 ROS2 的多节点系统,
用于清扫车的感知、定位、控制、作业与平台通信。
src 目录按功能域functional domain对 ROS2 节点进行分组,
用于明确节点职责边界,降低系统复杂度,
并作为系统架构约束的一部分。
新增节点或调整现有节点时,应优先考虑其所属功能域。
---
## 2. 目录分层说明
### base/
底层硬件与接口抽象。
用于放置直接与硬件交互,
或对硬件能力进行抽象的节点与接口包。
职责包括:
- CAN、串口、设备接口
- 底层控制与状态采集
- 硬件能力封装
示例包:
- sweeper_interfaces
- mc
- fu
---
### control/
控制输入与仲裁。
用于放置产生控制意图的节点,
以及多控制源的仲裁逻辑。
职责包括:
- 遥控、远控输入
- 控制权仲裁
- 控制指令标准化
示例包:
- radio_ctrl
- remote_ctrl
- ctrl_arbiter
---
### communication/
平台与外部通信。
用于放置系统与外部平台
(云端、设备服务等)进行通信的节点。
职责包括:
- 设备身份获取与管理
- MQTT、HTTP 通信
- 云端任务同步
示例包:
- identity
- mqtt_report
- task_manager
---
### perception/
感知与定位。
用于放置传感器处理、定位、
环境感知相关节点。
职责包括:
- 雷达、GPS、RTK
- 传感器融合
- 感知数据预处理
示例包:
- rslidar_pointcloud_merger
- rtk
- sub
---
### autonomy/
自动驾驶与作业逻辑。
用于放置路径规划、
作业流程等高层逻辑节点。
职责包括:
- 路径规划
- 作业状态机
- 自动驾驶决策
示例包:
- route
- pl
- airy
---
### execution/
执行与状态发布。
用于向系统外部或平台
发布执行结果与状态信息。
示例包:
- pub_gps
---
### tools/
工具与调试节点(可选)。
---
## 3. 使用原则
- 新增包必须明确所属目录
- 禁止跨层直接依赖
- 系统级通信HTTP、MQTT只允许存在于 communication 目录
---
## 4. 设计说明
目录结构用于表达系统的架构边界,
而不仅是代码整理。
当无法判断一个节点应放入哪个目录时,
通常意味着该节点职责需要重新拆分或澄清。