# car4_controller **Repository Path**: reeman/car4_controller ## Basic Information - **Project Name**: car4_controller - **Description**: 四个麦轮构建的车辆底盘,输入控制量vx, vy, wz. 车辆前进方向是X轴正方向,车辆前进方向的左侧是Y轴的正方向。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-14 - **Last Updated**: 2025-05-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # car4_controller #### 介绍 四个麦轮构建的车辆底盘,输入控制量vx, vy, wz. 车辆前进方向是X轴正方向,车辆前进方向的左侧是Y轴的正方向。 #### note 1. 串口通信模块 (serial_handler.py) 这个模块专门处理与串口的通信,包括: 连接串口设备 发送控制命令到串口 从串口读取数据 关闭串口连接 2. Socket通信模块 (socket_handler.py) 这个模块专门处理网络通信,包括: 创建和管理Socket服务器 处理客户端连接 接收客户端发送的控制命令 发送数据到客户端 关闭Socket连接 3. 主控制器模块 (controller.py) 这个模块集成了串口和Socket模块,负责: 初始化和管理两个模块 处理从Socket接收到的命令并转发到串口 从串口读取数据并发送到Socket客户端 提供统一的启动和停止接口 4. 向后兼容模块 (serial_controller.py) 为了保持向后兼容性,我保留了原来的文件名,但将其内容修改为简单的导入和启动脚本,它会: 导入新的Controller类 提供与原来相同的命令行参数 显示提示信息建议使用新的入口文件 这种模块化的设计有以下优点: 代码结构更清晰,每个模块专注于一个功能 更容易维护和扩展 可以单独测试和替换各个模块 保持了向后兼容性,原有的调用方式仍然有效 您可以通过运行 controller.py 或 serial_controller.py 来启动控制器,两者功能相同,但建议使用 controller.py 作为主入口。 #### 控制命令 按键映射: 1. 方向键 ↑/↓: 控制前进/后退 (vx 正/负值) 2. 方向键 ←/→: 控制左移/右移 (vy 正/负值) 3. 按键 A/D: 控制左转/右转 (wz 正/负值) 4. 空格键: 紧急停止 (所有速度归零) 5. ESC键: 退出程序 ``` python command_generator.py --host 127.0.0.1 --port 8888 ``` #### 通信协议说明 新的通信协议更加健壮,能够有效抵抗通信噪声和数据错误: - 指令头尾标识:使用特殊字节(0xAA和0x55)标记指令的开始和结束 - 固定长度:指令长度固定为8字节,便于验证完整性 - 校验机制:使用异或校验确保数据正确性 - 二进制格式:相比字符串格式,二进制格式更加紧凑高效 ##### 使用方法 要发送控制指令,需要按照以下格式构造二进制数据: 1. 第1字节:指令头 (0xAA) 2. 第2-3字节:Vx速度值 (cm/s,有符号16位整数) 3. 第4-5字节:Vy速度值 (cm/s,有符号16位整数) 4. 第6字节:Wz角速度值 (0.1rad/s,有符号8位整数) 5. 第7字节:校验和 (前6个字节的异或结果) 6. 第8字节:指令尾 (0x55) 例如,要发送Vx=0.5m/s, Vy=-0.2m/s, Wz=0.3rad/s的指令: 1. 转换单位:Vx=50cm/s, Vy=-20cm/s, Wz=3(0.1rad/s) 2. 构造二进制数据:[0xAA, 0x00, 0x32, 0xFF, 0xEC, 0x03, 校验和, 0x55] 3. 计算校验和:0xAA ^ 0x00 ^ 0x32 ^ 0xFF ^ 0xEC ^ 0x03 = 0x06 4. 完整指令:[0xAA, 0x00, 0x32, 0xFF, 0xEC, 0x03, 0x06, 0x55] #### 通过游戏手柄控制 使用单个摇杆控制底盘的线速度和角速度 ``` pip install pygame python joystick_controller.py --host 127.0.0.1 --port 8888 ``` #### 运行 ``` //生成线速度和角速度控制量 python command_generator.py --host 127.0.0.1 --port 8888 // 通过socket接收线速度和角速度控制量,并通过串口发送 serial_controller.py ``` #### sample ``` 1. 发送Vx=0.5m/s, Vy=-0.2m/s, Wz=0.3rad/s AABB0032FFEC033355 2. 发送Vx=0.5m/s, Vy=0m/s, Wz=0rad/s AABB00320000002355 vx=0.0m/s, vy=0.5m/s, vw=0.0rad/s AABB00000032002355 vx=0.0m/s, vy=-0.5m/s, vw=0.0rad/s AA BB 00 00 FF CE 00 20 55 vx=0.0m/s, vy=0.0m/s, vw=0.5rad/s AABB00000000051455 vx=0.0m/s, vy=0.0m/s, vw=0.0rad/s AABB00000000001155 ``` ##### 问题 1. 数据帧接收不正确的原因主要是数据传输过程中出现了字节丢失或错位的问题。 Arduino的硬件串口接收缓冲区只有64字节,当数据到达速度超过处理速度时,会发生溢出 Arduino的串口接收是通过中断处理的,如果中断处理不及时,可能导致数据丢失 #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)