尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

小型无人驾驶线控底盘:CAN总线与双模式控制全解析

小型无人驾驶线控底盘:CAN总线与双模式控制全解析 这次我们来看一个工程味道很浓的硬件项目小型无人驾驶线控底盘。它的定位很明确体积小、好改装、支持 CAN 总线带遥控和自主导航双模式。从关键词看这属于无人驾驶底盘、线控底盘、AGV 底盘、机器人底盘这一大类。说白了它就是把“车”的底层控制能力打包好让做无人驾驶算法、机器人应用的人不用从零折腾转向、驱动、制动这些机械和控制问题。这类底盘目前很常见的使用场景是果园巡检、厂区转运、园区物流、农业采摘运输。它的特点是场景相对封闭、速度不需要很高、但要求低速可靠性强、控制延迟低、能接受 CAN 总线这类工业总线协议。这篇文章我会从硬件结构、CAN 总线通信、遥控与自主导航双模式切换、ROS 环境部署、联调验证、常见排查方法这几个方向展开。如果你想评估这类底盘能不能用在自己的项目里或者正准备采购/改装一台小尺寸线控底盘这篇可以直接收藏。1. 核心能力速览能力项说明项目类型小型无人驾驶线控底盘 / AGV 底盘 / 机器人底盘通信总线CAN 总线支持工业级底盘控制驱动方式电机驱动具体电机类型需按实际配置确认控制模式遥控模式 自主导航模式双模式转向方式根据底盘构型可能是差速转向或阿克曼转向需要以实车配置为准应用场景果园巡检、厂区转运、园区物流、机器人科研改装上位机接口通常通过 ROS 节点、串口或 CAN 转 USB 设备连接工控机是否支持批量任务底盘本身负责运动执行批量任务由上层调度系统实现是否支持二次开发支持底盘一般开放 CAN 协议或 ROS 驱动适合人群机器人开发者、无人驾驶算法工程师、农业/工业自动化集成商这里要说明不同厂家、不同配置的线控底盘在载重、最大速度、电机功率、电池电压、转向半径上差异很大。不要只看“支持 CAN 总线”就认为所有底盘控制方式一样后面必须核对具体协议。2. 适用场景与使用边界2.1 典型适用场景小型线控底盘设计目标不是跑公开道路而是满足限定区域内的低速无人作业。实际部署中常见场景有果园巡检沿着果园道路低速巡检采集图像、环境数据或者执行农药喷洒、成熟度检测等任务。厂区转运在工厂、仓库内部或园区内部运输物料、零部件替代人工拖车。农业采摘运输在田间地头、大棚内部运输采摘筐降低人工搬运强度。科研教学作为 ROS、无人驾驶算法、SLAM 导航算法的实验平台。这类场景的共同点是道路结构相对固定、人车混流少、速度要求不高、任务重复性高。底盘在这种环境下可以发挥很好的作用。2.2 使用边界与安全提醒线控底盘本质上是“能自己跑的车”哪怕很小也有安全风险。以下几点务必注意限定在封闭或半封闭场景使用不要在公开道路、高速道路、行人密集区域运行。运行速度必须控制在安全范围尤其是果园、厂区这类路面条件不稳定的场景。遥控模式必须保持最高优先级任何情况下遥控器都能立刻接管底盘。涉及机械改装、电机更换、电池更换时必须断电操作并确认电气安全。如果底盘的自主导航系统使用 GPS、RTK 或地图数据需要遵守当地对地理信息数据的管理规定。如果后续接入摄像头、激光雷达采集环境数据涉及人员、车牌、人脸等信息时要做好脱敏和隐私保护。3. 线控底盘硬件结构解析拿到一台小型无人驾驶线控底盘先别急着跑代码先看清楚它的机械和电气结构。这决定了你后面怎么接线、怎么控制、怎么排查问题。3.1 底盘整体组成一台典型的小型线控底盘通常由以下几个部分组成模块作用说明车架承载整机重量常见材质为钢、铝合金小尺寸底盘也有 3D 打印结构件驱动电机提供前进/后退动力可能为轮毂电机、直流有刷电机、直流无刷电机或伺服电机转向机构改变行驶方向差速底盘靠左右轮速差转向阿克曼底盘靠前轮偏转转向电机驱动器驱动电机运转接收控制信号常见接口为 CAN、RS485、PWM底盘控制器整车逻辑控制中心将上位机指令解析为电机控制指令采集底盘状态遥控接收机接收遥控器信号常见射频协议为 2.4G接收机输出 PPM/SBUS 信号或直连底盘控制器电池与电源模块提供动力和控制电源注意电机电源和逻辑电源隔离上位机安装位安装工控机、Jetson、树莓派等考虑减震、散热、防尘防水3.2 转向方式对比小型线控底盘最常见的两种转向构型差速转向左右两个驱动轮独立控制通过速度差实现转向。结构简单、转弯半径小甚至可以原地转向。适合果园、室内、狭窄通道。轮胎磨损相对大直线行驶需要频繁修正。阿克曼转向模拟汽车转向结构前轮偏转、后轮驱动或四轮驱动。转向更接近真实车辆适合行驶速度稍高的场景。结构复杂转弯半径大不能原地转向。更适合厂区道路、园区道路这类相对规整的场景。选购底盘时先确认你的应用场景更适合哪种转向方式。做果园巡检差速底盘更灵活做厂区转运阿克曼底盘高速稳定性更好。3.3 线控底盘的关键技术点底盘“线控”的含义是用电子信号代替传统的机械/液压连接实现对车辆的控制。这里的关键是三个子系统线控驱动控制电机转速和扭矩实现车辆前进、后退、加速、减速。线控转向控制转向电机或差速轮速实现车辆按期望路径转弯。线控制动控制减速和停车在紧急情况下快速制动。在小型底盘上制动往往通过电机反向扭矩或机械抱闸实现。自主导航模式下底盘控制器必须能够响应急停指令这是安全底线。4. CAN 总线通信基础与底盘控制协议既然底盘支持 CAN 总线那理解 CAN 总线协议就是调通底盘的第一步。4.1 CAN 总线为什么适合线控底盘CANController Area Network总线是工业控制、汽车电子领域最成熟的总线协议之一。它在小型无人驾驶底盘上的优势非常突出双线差分信号传输抗干扰能力强适合电机、驱动器等强电设备较多的底盘环境。多主通信一个控制器可以挂接多个电机驱动器、传感器节点。报文带 ID 优先级实时性有保障。错误检测机制完善单节点故障不会导致整条总线瘫痪。线束少结构简洁。这也是为什么大多数线控底盘、AGV 底盘、机器人底盘都把 CAN 作为主控总线。4.2 CAN 总线物理层基础CAN 总线物理层使用两根线CAN_H 和 CAN_L传输差分信号。常见的波特率有 125K、250K、500K、1M。底盘控制系统常用的波特率一般是 250K 或 500K。连接注意事项总线两端需要 120 欧姆终端电阻。一个 CAN 网络中一般只有最远的两端接终端电阻中间节点不接。CAN_GND 需要共地否则会出现通信不稳定。线缆使用双绞线减少共模干扰。如果底盘电机驱动器对 CAN 总线造成干扰需要检查屏蔽层接地和终端电阻。4.3 底盘 CAN 协议构成不同厂家的底盘 CAN 协议不同但通常包含以下几类报文报文方向功能典型内容上位机 - 底盘运动控制指令目标速度、目标转向角、制动指令、模式切换指令底盘 - 上位机状态反馈当前速度、当前转向角、电池电压、底盘故障码底盘 - 上位机遥控状态反馈遥控器连接状态、遥控/自动切换状态、急停状态以常见的底盘控制协议为例运动控制指令可能通过 0x1A 类 ID 发往底盘控制器速度反馈通过 0x40 类 ID 上报。但这里必须强调不要直接套用必须拿到底盘厂家提供的 CAN 协议表确认每个 ID 的字节含义、数据格式有符号/无符号、缩放系数和单位。下面给一个抽象的运动控制报文模板展示常见编码方式// 假设底盘协议帧 ID 0x1508 字节数据 // Byte0: 控制模式0x01 遥控模式0x02 自主模式0x03 急停 // Byte1: 符号位0x00 前进0x01 后退 // Byte2-3: 目标速度单位 0.01 m/s小端序输出 // Byte4: 转向控制0x00 直行0x01 左转0x02 右转 // Byte5-6: 保留 // Byte7: 校验字节 void send_chassis_command(int socket, int mode, int speed_cms, int turn) { struct can_frame frame; frame.can_id 0x150; frame.can_dlc 8; frame.data[0] mode; frame.data[1] (speed_cms 0) ? 0x01 : 0x00; frame.data[2] abs(speed_cms) 0xFF; frame.data[3] (abs(speed_cms) 8) 0xFF; frame.data[4] turn; frame.data[5] 0x00; frame.data[6] 0x00; frame.data[7] frame.data[0] ^ frame.data[1] ^ frame.data[2] ^ frame.data[3] ^ frame.data[4]; write(socket, frame, sizeof(frame)); }再次强调这只是一个通用模板实际协议一定取底盘厂家的协议文档。4.4 使用 can-utils 扫描底盘报文在 Linux 工控机上调试 CAN 总线建议首先安装 can-utils 工具集sudo apt install can-utils将 CAN 设备接入工控机通常是 USB-CAN 模块或板载 CAN 接口启动 CAN 接口# 假设设备是 can0波特率 500K sudo ip link set can0 type can bitrate 500000 sudo ip link set can0 up查看底盘是否在发送数据candump can0如果底盘上电并且 CAN 接口正常这里会打印出底盘向上位机发送的状态报文。如果没有任何输出排查顺序是CAN 接口是否已启用。波特率是否匹配。CAN_H、CAN_L 是否接反。底盘是否处于正常运行状态。总线两端终端电阻是否正确。确认底盘能上报报文后再用 candump 抓取遥控器操作时的报文变化可以快速反推遥控指令对应的 CAN 消息规律。但完整协议仍然要和厂家确认不要凭猜测发送控制帧可能有危险。5. 遥控模式与自主导航模式切换双模式是这类底盘的核心卖点之一。遥控模式保证人工接管自主导航模式保证无人化运行。5.1 遥控模式遥控模式是最基础、最可靠的运行模式。操作人员通过遥控器控制底盘前进、后退、转向、停止。遥控模式的关键在于“优先级”。正常设计下遥控模式比自主导航模式的优先级更高。也就是说底盘在上位机下发自主导航指令时只要遥控器发送了控制指令或切换信号底盘控制器必须立即切换到遥控控制。使用遥控模式时先做以下检查遥控器电池电量。接收机与遥控器对频状态。遥控器通道设置前进/后退、左右转向、急停、模式切换。在不通电悬空状态下测试遥控器控制信号是否正常响应。低速状态下渐进测试不要直接拉高速。5.2 自主导航模式自主导航模式是底盘作为无人驾驶平台的核心能力。上层通过激光雷达、摄像头、IMU 等传感器感知环境通过 SLAM 构建地图通过路径规划算法生成运动指令最后通过 CAN 总线把速度指令下发到底盘控制器。典型的自主导航流程是底盘平台启动上位机初始化传感器。使用 SLAM 算法建图。加载地图设置起点和导航目标点。规划全局路径。实时感知局部障碍物调整局部路径。通过底盘驱动节点把速度指令发送给底盘。底盘通过 CAN 总线执行运动。到达目标点后停车。在整个流程中遥控器必须全程在线作为安全兜底。一旦遇到异常立刻切回遥控模式。5.3 模式切换的软件实现思路底盘控制器端做模式切换通常用状态机实现。下面是一个简化版的模式切换逻辑typedef enum { MODE_REMOTE 1, MODE_AUTO 2, MODE_STOP 3 } ChassisMode; ChassisMode current_mode MODE_STOP; void update_mode(void) { // 遥控器急停信号按下无条件进入停止模式 if (remote_estop_active()) { current_mode MODE_STOP; disable_motor_output(); return; } // 遥控器控制信号有效优先进入遥控模式 if (remote_control_active()) { current_mode MODE_REMOTE; return; } // 只有遥控器不控制时才允许自主导航指令生效 if (auto_mode_requested() current_mode MODE_REMOTE) { current_mode MODE_AUTO; } }核心逻辑很简单遥控优先急停最优先。6. ROS 自主导航环境搭建要让底盘自主导航跑起来上位机系统一般基于 ROSRobot Operating System。下面是一套通用部署思路具体版本需要按你用的 ROS 发行版调整。6.1 上位机选型小型底盘上安装的上位机常见选择有树莓派 4B/5适合轻量级导航和小场景建图性能有限。NVIDIA Jetson Orin Nano / NX内置 GPU适合跑神经网络模型和视觉 SLAM。工控机Intel/AMD性能强适合复杂的多传感器融合。选择上位机时要注意底盘的实际载重是否能够支撑用户安装的设备。后期加装传感器时还要做整车重量和重心分配避免影响底盘的稳定性和悬挂系统。6.2 ROS 驱动节点设计底盘 ROS 驱动节点是连接底盘和下层的桥梁。上位机通过 CAN 转 USB 设备将底盘 CAN 数据转发到 ROS 节点。ROS 驱动节点需要完成以下任务订阅cmd_vel话题获取速度指令。把速度指令编码成 CAN 报文下发到底盘控制器。接收底盘 CAN 状态报文解码得到里程计信息odom。发布odom话题、tf变换。发布底盘状态话题例如电压、故障码、控制模式。下面是一段 Python 驱动节点的简化示例演示订阅cmd_vel并发送 CAN 报文的过程#!/usr/bin/env python3 import rospy from geometry_msgs.msg import Twist from sensor_msgs.msg import JointState import can import struct class ChassisROSNode: def __init__(self): rospy.init_node(chassis_driver) self.can_bus can.interface.Bus(channelcan0, bustypesocketcan) self.speed 0.0 self.steer 0.0 rospy.Subscriber(/cmd_vel, Twist, self.cmd_vel_callback) rospy.Timer(rospy.Duration(0.05), self.send_control) def cmd_vel_callback(self, msg): self.speed msg.linear.x self.steer msg.angular.z def send_control(self, event): # 这里根据实际底盘协议编码 speed_mm_s int(self.speed * 1000) steer_raw int(self.steer * 100) data bytearray(8) data[0] 0x02 # 自主模式 data[1] 0x00 if speed_mm_s 0 else 0x01 data[2] abs(speed_mm_s) 0xFF data[3] (abs(speed_mm_s) 8) 0xFF data[4] steer_raw 0xFF data[5] (steer_raw 8) 0xFF data[6] 0x00 data[7] 0x00 # 实际需要按协议计算校验 msg can.Message(arbitration_id0x150, datadata, is_extended_idFalse) self.can_bus.send(msg) if __name__ __main__: try: ChassisROSNode() rospy.spin() except rospy.ROSInterruptException: pass需要注意can库在发送 CAN 帧之前必须确认 socketcan 接口已经启用并且权限正确。6.3 SLAM 建图与导航自主导航的核心是 SLAM 建图和路径规划。常见的方案组合建图Gmapping、Cartographer、ORB-SLAM。定位AMCL自适应蒙特卡洛定位。全局路径规划NavFn、Global Planner。局部路径规划DWA、TEB。以 ROS 2 环境为例Cartographer Nav2 是相对通用的组合。建图阶段手动遥控底盘在目标区域缓慢行驶通过激光雷达数据和底盘里程计数据构建二维栅格地图。建图时需要注意底盘速度要慢急加速急减速会导致里程计累计误差。激光雷达安装要水平尽量安装在底盘中心线上。建图区域不要有太多移动的人或车辆否则地图会出现重影。在大场地尽量增加闭环路径减少累积误差。导航阶段加载地图启动 AMCL 定位给定目标点底盘就能规划路径并自主行驶。底盘控制器会通过速度指令路径跟踪如果跟踪偏差过大底盘会一直调节不会自动停下。这时候要重点观察底盘是否出现明显的蛇形摆动。是否有漂移、打滑。是否因为地面湿滑导致里程计不准确。是否因为电机扭矩不足导致爬坡卡住。出现这些情况时优先调节控制参数而不是继续加大速度。7. 底盘联调与性能验证新底盘到手不要直接上自主导航先做分阶段联调。下面这套验证流程适合大多数线控底盘、AGV 底盘。7.1 通电安全检查检查电池电压是否在正常范围。检查底盘各紧固件是否松动。检查轮子转动是否正常有无卡滞。检查 CAN 总线连接和终端电阻。检查急停按钮是否功能正常。确认底盘周围无人处于开阔安全区域。7.2 遥控模式测试测试项目操作预期结果前进/后退遥控器推杆底盘按对应方向低速行驶左转/右转遥控器方向通道底盘响应转向指令停车释放推杆或按停车键底盘快速刹车急停按下急停按钮底盘立即断电/抱闸电机不再响应切换模式拨动模式开关底盘进入遥控模式或自主模式7.3 CAN 通信测试用 can-utils 或上位机驱动节点检查底盘是否周期性上报状态报文。下发运动控制指令后底盘是否响应。遥控模式下底盘是否上报遥控状态。检查 CAN 总线是否有大量错误帧。# 查看 CAN 总线错误状态 ip -details -statistics link show can0如果错误帧数量持续增长说明物理层或干扰存在问题需要检查终端电阻、线缆质量和屏蔽层。7.4 自主导航测试遥控和 CAN 通信正常后再进入自主导航测试先做建图测试确认地图质量。在地图中设置 3 到 5 个导航目标点。逐个验证底盘能否平稳到达目标点。在路径上放置障碍物验证局部避障。测试导航过程中遥控器接管是否及时生效。测试长时间连续运行时底盘状态是否稳定。8. 常见问题与排查方法线下调试线控底盘最花时间的往往不是算法而是通信和电气问题。下面把出现频率最高的问题整理成清单问题现象可能原因排查方式解决方案candump 没有数据CAN 接口未启动ip link show can0设置波特率并启用 can0CAN 总线错误帧激增波特率不匹配检查两侧波特率配置统一设置为 250K 或 500K通信时好时坏CAN_H/CAN_L 接触不良检查接线端子和屏蔽层重新压接或更换线缆底盘不响应控制指令CAN ID 或协议格式错误对比底盘协议表按实际协议发送数据遥控模式无法切换到自主模式遥控器通道信号一直有效检查遥控接收机输出确保遥控器处于中位或关闭遥控通道底盘行驶跑偏左右轮速不一致或重心偏移检查轮胎气压、重心校平底盘、调整载重分布自主导航时底盘抖动控制参数不匹配查看日志中 cmd_vel 指令降低最大速度和加速度SLAM 地图重影激光雷达安装不稳定或里程计误差检查雷达支架固定重新建图底盘电池掉电快电机负载过大或电池老化检查电压曲线减少载重、更换电池8.1 底盘上电后没有任何反应第一步看电源指示灯第二步检查急停按钮是否被按下第三步用万用表检查电池输出电压第四步检查底盘控制器的电源输入。很多时候不是坏了只是急停没复位。8.2 CAN 总线只有一侧能通信很可能是 CAN_H 和 CAN_L 接反或者没有共地。把 CAN_GND 接上并确认两根数据线正确连接到 CAN 收发器对应引脚。8.3 自主导航模式下底盘不移动先检查上位机是否真的在发布cmd_velrostopic echo /cmd_vel如果cmd_vel有数据再检查底盘驱动节点是否收到该消息并且是否正确编码发送到 CAN 总线。用 cansend 手动发送一帧控制指令测试底盘是否动作可以快速判断问题出在上位机还是底盘控制器。9. 部署建议与合规提醒9.1 工程化部署建议线控底盘从开发到稳定运行需要一套可维护的工程化方法。建立配置清单记录底盘型号、电机参数、CAN 协议、端口分配、ROS 工作空间。划分目录管理把建图数据、配置文件、启动脚本、日志分开存放。编写自动化启动脚本一键启动传感器、底盘驱动、导航算法减少手动操作。增加日志系统底盘驱动要打印 CAN 报文收发记录、错误信息、速度指令。加入故障诊断底盘状态异常时自动进入保护模式停止运动并输出故障码。首次测试必须低速先让小参数跑通再逐渐增大。接口服务如果对外提供需要限制访问范围避免未授权控制。9.2 安全与合规提醒底盘运行区域必须设置安全边界并安排安全员盯场。在实验和演示场合确保现场有安全围挡或警示标志。涉及图像、点云数据采集时注意保护隐私数据。地图数据不要上传到不可控的公共平台。不要对底盘进行可能导致失控的非法改装例如拆除限速、屏蔽急停。商用部署前需要做充分的可靠性测试和故障风险评估尤其是涉及有可能导致人员伤害的场景。10. 总结与下一步小型无人驾驶线控底盘这个项目的核心价值是把“能跑的车”做成“能被程序控制的平台”。CAN 总线保证了底盘的工业级通信可靠性遥控和自主导航双模式兼顾了开发调试阶段的安全性与无人化运行阶段的效率。如果你准备入手这类底盘建议按下面的顺序推进先做遥控模式测试确认机械和电气正常。然后用 CAN 工具抓包确认通信协议。再写一个简单的上位机控制脚本跑通 CAN 控制链路。接着部署 ROS 驱动节点打通cmd_vel到底盘的链路。最后再进入 SLAM 建图和自主导航调试。最容易踩的坑有两个一是 CAN 协议不确认清楚就直接下发指令导致底盘没反应二是自主导航参数没调好就高速测试导致底盘跑偏甚至碰撞。先把底盘的基本控制链路跑通后面的自主导航才有意义。建议收藏备用等动手调试的时候可以直接对照排查。
返回列表