ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

北洋动力26赛季-控制架构

北洋动力26赛季-控制架构 本文记录了26赛季无人车的底层控制会持续更新目的是供后续的学弟学妹们能够更快的上手无人系统的制作一、环境配置linux版本2004ros版本Ros1 Noetic二、无人系统架构我们的无人系统按照具体功能分成了如下四个部分视觉、感知、规划、控制。其中本文章主要针对的是控制部分无人车的控制模块按照决策和执行可以大致分成两层一层是负责由输入的车辆状态量输出车辆速度、角速度等输出量的狭义上的控制模块采用的是pid控制另一层是负责ros通信转译成can通信的接口层我们的接口依赖官方包socketcan_bridge他可以实现Ros与Can之间的收发互译而在这之上需要将控制层的输出量转换成电机控制协议可以理解的格式1、接口层结构由于can通信具有更好的实时性车辆的域控制器如果你不清楚是他是什么可以把它理解成一个电脑与电机控制器采用的是can协议通信而我们的控制器是以ros消息的形式输出控制量的因此需要一个中间的接口层负责接收控制器发布的ros消息将其以can消息的格式通过can总线发布给具体的装置也就是不同的canid。现在的抽象层次可以这么理解算法层目标点 / 速度│▼racecar_control/├── kinematics_node cmd_vel → 左右轮目标转速└── pid_node 目标 反馈 → 修正后目标值│ /cmd_vel▼ros_can_bridge/├── ze300_node 后驱双电机协议转换└── yuanqu_node 远驱协议转换│can_msgs/Frame▼socketcan_bridge│▼电机 /控制器然后为了实现pid的反馈反馈层次是这么做的电机 / 控制器│▼socketcan_bridge│▼ros_can_bridge/│▼pid_node接下来具体讲解一下这个接口的原理1.1:ros消息pid控制器的输出量通过ros话题cmd_vel发布这个话题是ros1里非常经典的速度指令话题我们可以找到他的消息类型geometry_msgs/Vector3 linearfloat64 xfloat64 yfloat64 zgeometry_msgs/Vector3 angularfloat64 xfloat64 yfloat64 z但是由于我们的电机控制器不知道什么是速度或者说至少不知道收到这个float64字段之后应该怎么办因此首先我们要做的是通过一些运动学的解算算出来电机应该在当前协议下怎么样才能实现我们的控制目标。这里大家可以去学习一下阿克曼转向模型阿克曼转向总之根据阿克曼模型可以设计一些方法将车辆的速度角速度这些量转换为远驱电机的速度档位转向和制动电机ze300的目标速度或扭矩我们将在这些基础上拼凑出can消息1.2:can消息详解CAN总线CAN总线报文格式—数据帧如果只从使用的角度我们只需要关注ID、DLC、数据这三个部分就好了当然如果能够全部理解是最好不过的了而socketcan_bridge这个包将Can消息制作成了can_msgs/Frame我将它打在下面并附上注释std_msgs/Header header # 消息头uint32 seq # 消息序号time stamp # 时间戳string frame_id # 坐标系CAN 帧用不上一般为空uint32 id # CAN IDbool is_rtr # 是否远程帧bool is_extended # 是否扩展帧29 位 IDbool is_error # 是否错误帧uint8 dlc # 数据长度uint8[8] data # 数据字节1.3:电机驱动协议# 远驱控制器控制命令std_msgs/Header headeruint8 device_iduint8 control_iduint8 control_typeuint8 gear # 0N 1前进 2后退uint8 three_speed # 01档 12档 23档 34档/BOOSTuint8 charge_state # 1停车 0正常uint8 side_stand # 1撑起 0合上uint8 sop_highuint8 sop_lowuint8 socuint8 command_index # 12/13/14/15 对应发送ID2~ID5# ZE300 电机控制命令对应 CAN 协议 V3.06b0std_msgs/Header headeruint8 device_addr # StdID: Dev_addr、(0x100|Dev_addr)、0x00、0xFFuint8 command_code # 0xC0/0xC1/0xC2/0xC3/0xC4/0xCE/0xCF/0xAF/0xB1...uint8 dlc # 数据长度int32 value # 命令数据含义由 command_code 决定2、使用为了验证通路可以先借助modprobe vcan仿真测试他允许我们在linux内核中加载虚拟can接口因为车辆的域控制器是有两路为了模拟这种情况需要建立两个vcan在电脑上模拟can的收发这步主要是测试链路通不通实际使用部分施工中使用的时候要思考一下车辆通信时候的时间延迟如何处理去年答辩的时候被问道相关题目了
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进