readme
This commit is contained in:
parent
381788f467
commit
7cf7201361
144
README.md
144
README.md
@ -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.msg(RTK 定位信息消息)
|
||||
|
||||
|
||||
#### 字段定义
|
||||
|
||||
|
||||
|
||||
| 字段类型 | 字段名称 | 取值范围 / 说明 | 功能描述 |
|
||||
| -------- | ---------- | ----------------------------------------- | ------------------------------------------------------------ |
|
||||
| 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.
194
make_deb.sh
194
make_deb.sh
@ -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"
|
||||
138
src/README.md
138
src/README.md
@ -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. 设计说明
|
||||
|
||||
目录结构用于表达系统的架构边界,
|
||||
而不仅是代码整理。
|
||||
|
||||
当无法判断一个节点应放入哪个目录时,
|
||||
通常意味着该节点职责需要重新拆分或澄清。
|
||||
Loading…
Reference in New Issue
Block a user