十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

第135篇 ros2_control框架——机器人硬件抽象的标准方案

第135篇 ros2_control框架——机器人硬件抽象的标准方案 面试翻车现场面试一家做协作机器人的公司面试官问你用过ros2_control吗它的架构是怎样的我说就是控制机器人的框架用来发关节命令。他追问ros2_control里Hardware Interface、Controller Manager和Controller之间是什么关系怎么写一个自定义的Hardware Interface这几个问题我没答好。我之前只是用过ros2_controllers包里的现成控制器对ros2_control的内部架构了解不深。面试官说做机器人控制的话ros2_control是必须掌握的特别是自定义硬件接口这块。ros2_control的架构设计ros2_control的核心思想是把硬件驱动和控制算法解耦。整个框架分三层最底层是Hardware Interface硬件接口负责和真实的硬件通信——读编码器、发指令给电机。中间是Controller Manager控制器管理器负责加载和管理各种Controller。最上层是Controller控制器实现具体的控制算法——比如PID关节控制、差速驱动控制、轨迹跟踪等。数据流向是这样的Controller从Hardware Interface读取关节状态位置、速度、力矩计算出控制命令再写回Hardware Interface。Controller Manager负责协调这个过程按照固定频率通常500Hz或1000Hz驱动整个控制循环。这种分层架构的好处是换硬件时只需要写新的Hardware Interface控制算法完全不用改。换控制策略时只需要换Controller硬件驱动完全不用动。Hardware Interface详解Hardware Interface是ros2_control中最关键的部分它定义了硬件和框架之间的标准接口。有三种类型的Hardware InterfaceActuator执行器控制单个关节。比如一个电机的驱动接口。你发送目标位置/速度/力矩读取实际位置/速度/力矩。Sensor传感器只读数据的硬件。比如IMU、力传感器、激光雷达。只有read()方法没有write()方法。System系统控制多个关节的复合硬件。比如一个完整的机械臂驱动、一个移动底盘。可以管理多个关节的读写。写一个Hardware Interface需要继承对应的基类HardwareInterface实现on_init()、on_configure()、read()、write()等方法。read()从硬件读取最新状态write()把控制命令发送到硬件。class MyRobotHardware : public hardware_interface::SystemInterface { // 实现read()读取编码器数据 // 实现write()发送电机指令 // 在on_init()中初始化硬件连接 };关键点是read()和write()必须尽可能快。它们在实时循环中被调用如果有阻塞操作比如网络超时会导致控制循环抖动。Controller ManagerController Manager是整个控制系统的调度中心。它负责加载Controller、配置Controller、激活/停用Controller以及驱动控制循环。每个控制循环分两步先调用所有激活的Controller的update()方法让它们读取状态、计算命令。然后调用所有Hardware Interface的write()方法把命令发到硬件。接着调用read()方法读取最新的硬件状态供下一个循环使用。Controller Manager通过参数服务器配置。你可以在Launch文件中指定要加载哪些Controller、设置控制频率、配置关节映射等。controller_manager: ros__parameters: update_rate: 500 # Hz joint_state_broadcaster: type: joint_state_broadcaster/JointStateBroadcaster joint_trajectory_controller: type: joint_trajectory_controller/JointTrajectoryController常用Controllerros2_controllers包提供了一系列现成的ControllerJointStateBroadcaster把关节状态发布到/joint_states话题。几乎所有系统都需要它。JointTrajectoryController接收轨迹消息插值后发送给关节。支持位置、速度、力矩控制模式。机械臂最常用的控制器。DiffDriveController差速驱动控制器。接收cmd_vel速度指令转换成左右轮的速度命令。移动机器人最常用的控制器。JointGroupPositionController简单的关节位置控制给一组关节发位置指令。AdmittanceController力控 admittance控制器用于力/位混合控制场景。实时性考量ros2_control的控制循环对实时性有要求。如果你的控制频率是1000Hz那每个循环必须在1毫秒内完成否则就会出现控制抖动。Linux默认不是实时操作系统普通的进程调度可能导致控制循环被中断。解决方法有几种一是用chrt命令把控制进程设为实时优先级SCHED_FIFO二是用CPU隔离isolcpus把某个CPU核心专门留给控制循环三是用实时内核补丁PREEMPT_RT这是最彻底的方案。实际项目中我见过很多团队因为控制频率不稳定而头疼。最常见的原因是Hardware Interface的read()或write()里有阻塞操作——比如通过串口和电机通信时超时等待。解决办法是用非阻塞通信或者把硬件通信放到单独的线程里。再补充一个实战经验写自定义Hardware Interface时建议先在read()和write()里加耗时统计日志。每次调用记录一下执行时间跑几分钟后看看最大耗时和平均耗时。如果最大耗时超过了控制周期的预算比如1000Hz对应1ms最大耗时超过0.5ms就要警惕那就需要优化了。这个简单的习惯能帮你提前发现很多实时性问题避免后期调试时抓瞎。ros2_control和其他方案对比ROS1时代大家用的是ros_control架构类似但接口不同。ros2_control重写了接口层适配了ROS2的生命周期管理和实时通信机制。如果你从ROS1迁移过来Hardware Interface的写法需要重新适配但整体思路是相通的。和自研控制框架相比ros2_control的优势在于标准化。不同厂商的电机、传感器只要实现了标准的Hardware Interface就能无缝接入。这避免了每个项目都从零搭建控制架构。缺点是框架本身有一定学习成本对于特别简单的单关节系统可能显得过于重量级。面试中怎么聊面试官问ros2_control你可以说ros2_control分三层架构——Hardware Interface负责硬件通信Controller Manager负责调度Controller实现控制算法。Hardware Interface分Actuator、Sensor、System三种类型。控制循环以固定频率运行先update Controller再write/read硬件。换硬件只需写新Interface换算法只需换Controller。常用的Controller有JointTrajectoryController机械臂和DiffDriveController移动底盘。上一篇第134篇 ROS2多机通信——分布式机器人系统的搭建下一篇预告第136篇 ros2_controllers——关节控制器、差速控制器的使用
返回列表