编辑 | blame | 历史 | 原始文档

割草机运动控制与数据接收 (Python)

1. 运动控制器

说明:这是一个用于履带式割草机的简单运动控制器原型。控制器使用 RTK/IMU 提供的位置信息和航向来生成运动指令(前进/转向),映射到 ±100 的输出范围。

主要文件:
- mower_controller.py:实现 MowerController,纯追踪+角度 P 控制,接口见文件头注释。
- example_path.json:示例弓字形路径点列表。
- test.py:仿真桩,模拟 IMU(100Hz)、GPS(10Hz)、控制(74Hz),并将输出记录到 sim_log.csv

合约摘要:
- 输入:GPS 每 10Hz 提供 (x,y)、航向(弧度)、速度;IMU 每 100Hz 提供加速度与角速度。
- 输出:每 74Hz 计算并输出两个整数信号:
- forward: -100..100 对应 [-max_forward_mps, +max_forward_mps](默认 ±1 m/s)
- turn: -100..100 对应 [-pi/2, +pi/2] rad/s(默认±90°/s),正为左转

如何运行:
1. 在同一目录下运行 python test.py(需要 Python 3.x)。
2. 运行结束后查看 sim_log.csv,其中包含时间序列的控制信号与位姿。

注意和下一步:
- 当前控制器为质量较轻的原型;工程化使用时需增加状态滤波、延时补偿、碰撞/障碍物处理、车辆动态限制与安全约束。
- 下步建议:添加单元测试、参数标定接口、以及将控制输出封装成发布接口 (ROS/UDP/CAN)。


2. GPS/IMU 数据接收器

快速开始

2.1 安装依赖

pip install -r requirements.txt

需要安装的库:
- pyserial: 串口通信
- crcmod: CRC16校验

2.2 配置串口

编辑 gps_imu_receiver.py 第 316 行附近,根据你的系统修改串口设备名:

Windows:
python PORT = "COM3" # 根据设备管理器中的实际端口修改

Linux/Mac:
python PORT = "/dev/ttyUSB0" # 或 /dev/ttyACM0, /dev/cu.usbserial-xxx 等

2.3 运行接收程序

python gps_imu_receiver.py

2.4 预期输出

[INFO] 串口已连接: COM3 @ 921600 bps
[INFO] 开始接收数据... (按 Ctrl+C 停止)
[GPS] 纬度: 31.12345678°, 经度: 121.23456789°, 航向: 45.23°, 速度(E/N/U): 0.12/0.34/0.01 m/s, 卫星: 12, 质量: 4
[IMU] 加速度(X/Y/Z): 0.001/0.007/-1.032 g, 角速度(X/Y/Z): -0.03/0.05/-0.02 °/s, 温度: 26.0℃
...

协议说明

详细协议文档请参见 ../PROTOCOL.md

数据格式概览:
- 帧头: AA 55
- 数据类型: 0x01=GPS(10Hz), 0x02=IMU(100Hz)
- CRC16: MODBUS标准
- 帧尾: 0D 0A

GPS数据包 (56字节): 纬度/经度、航向角、东北天速度、高程、UTC时间、定位质量、卫星数

IMU数据包 (32字节): X/Y/Z轴加速度、X/Y/Z轴角速度、温度、UTC时间

常见问题

串口无法打开:
- Windows: 检查设备管理器中的 COM 端口号
- Linux: 添加用户到 dialout 组: sudo usermod -a -G dialout $USER

CRC校验失败:
- 检查波特率是否匹配 (921600)
- 检查串口线缆质量

没有数据输出:
- 确认 GPS 模块已正确连接
- 检查 STM32 调试输出

高级用法

自定义数据处理

修改 main() 函数中的数据处理逻辑保存到文件或发送到其他程序。

与运动控制器集成

将接收到的 GPS/IMU 数据传递给 MowerController:

from mower_controller import MowerController
from gps_imu_receiver import GPSIMUReceiver

controller = MowerController(...)
receiver = GPSIMUReceiver(PORT, BAUDRATE)

while True:
    gps_data, imu_data = receiver.receive_packet()
    if gps_data:
        controller.update_gps(gps_data.latitude, gps_data.longitude, ...)
    if imu_data:
        controller.update_imu(imu_data.accel_x, ...)

文件清单

  • mower_controller.py: 运动控制器
  • example_path.json: 示例路径
  • test.py: 仿真测试
  • gps_imu_receiver.py: GPS/IMU数据接收器
  • requirements.txt: Python依赖

版本信息

  • 版本: v1.0
  • 日期: 2025-11-13