1.ros_control简介
ros_control - ROS Wiki
ros_control是为ROS提供的机器人控制包,包含一系列控制器接口、传动装置接口、控制器工具箱等,有效帮助机器人应用功能包快速落地,提高开发效率。
2.ros_control框架
ros_control总体框架:
针对不同类型的机器人(哨兵小车,机械臂等)ros_control提供了多种类型控制器,这些控制器的接口各不相同。ros_control提供了一个硬件抽象层,用来提高代码的复用率,负责机器人硬件资源管理,控制器从抽象层请求资源,不直接接触硬件。
ros_control的数据流图:
1.控制器管理器(Controller Manager)
每个机器人有一个或多个控制器,控制器管理器提供了通用接口来管理不同的控制器。控制器管理器的输入就是ROS上层应用功能包的输出。
2.控制器(Controller)
控制器可以完成每个joint控制,读取硬件资源接口状态,再发布控制命令,提供PID控制器。
3.硬件资源(Hardware Resource)
为上下两层提供硬件资源接口。
4.机器人硬件抽象(RobotHW)
机器人硬件抽象和硬件资源通信,通过write和read方法完成硬件操作,包含关节约束、力矩转换、状态转换等功能。
5.真实机器人(Real Robot)
真实机器人上需要有自己的嵌入式控制器,将接收到的命令反映到执行器上,例如接收到旋转90°的命令后,就需要让执行器快速、稳定地旋转90°。
3.控制器
ros_controllers功能包提供了许多控制器:
创建自己的控制器:
controller_interface · ros-controls/ros_control Wiki (github.com)
ros_controllers和ros_control之间的多种控制接口:
4.硬件接口
硬件接口是控制器和RobotHW沟通的接口,基本与控制器的种类相对应:
创建自己的硬件接口:
hardware_interface · ros-controls/ros_control Wiki (github.com)
5.传动系统(Transmission)
传动系统可以将机器人的关节指令转换成执行器的控制信号。机器人每个需要运动的关节都需要配置相应的传动系统,可以在机器人的URDF模型文件中配置:
urdf/XML/传输 - ROS Wiki
6.关节约束(Joint Limits)
关节约束是硬件抽象层中的一部分,维护一个关节约束的数据结构,这些约束数据可以从机器人的URDF文件中加载、可以在ROS的参数服务器上加载(需要先用YAML配置文件导入ROS参数服务器),包含了关节速度、位置、加速度、加加速度、力矩等约束,还包含了其安全作用的位置软限位、速度边界(k_v)和位置边界(k_p)等。
URDF文件中设置Joint Limits参数:
joint_limits_interface · ros-controls/ros_control Wiki (github.com)
7.控制器管理器(controller_manager)
控制器管理器提供了一种多控制器控制的机制,实现控制器的加载、运行启动、运行停止、卸载等多种操作。
控制器的状态跳转:
1.命令行工具
1.controller_manager命令格式:
rosrun controller_manager controller_manager <command> <controller_name>
支持的<command>:
·load:加载一个控制器。
·unload:卸载一个控制器。
·start:启动控制器。
·stop:停止控制器。
·spawn:加载并启动一个控制器。
·kill:停止并卸载一个控制器。
2.查看控制器状态命令:
rosrun controller_manager controller_manager <command>
支持的<command>:
·list:根据执行顺序列出所有控制器,并显示每个控制器的状态。
·list-types:显示所有控制器的类型。
·reload-libraries:以插件的形式重载所有的控制器的库,不需要重新启动,方便对控制器的开发和测试。
·reload-libraries--restore:以插件的形式重载所有控制器的库,并恢复到初始状态。
3.spawner命令
spawner命令是用于一次控制多个控制器,可以自动加载、启动控制器,加上--stopped参数,控制器就只会被加载,不会运行:
rosrun controller_manager spawner [--stopped] name1 name2 name3
4.unspawner
unspawner命令用于停止一系列控制器,但不需要卸载:
rosrun controller_manager unspawner name1 name2 name3
2.launch工具
launch文件运行controller_manager命令,加载、启动控制器:
<launch>
<node pkg="controller_manager" type="spawner" args="controller_name1 controller_name2"/>
</launch>
加载不启动:
<launch>
<node pkg="controller_manager" type="spawner" args="--stopped controller_name1 controller_name2"/>
</launch>
3.rqt_controller_manager可视化工具
rosrun rqt_controller_manager rqt_controller_manager