# 割草机运动控制与数据接收 (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 安装依赖 ```bash 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 运行接收程序 ```bash 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](../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`: ```python 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