ros_control就是ROS为开发者提供的机器人控制中间件,可以在丰富的机器人应用中通用,包含一系列控制器接口、传动装置接口、硬件接口、控制器接口、控制器工具箱等,可以帮助机器人应用功能包快速落地,提高开发效率。
ros_control可以针对不同类型的机器人(移动机器人、机械臂等)提供多种类型的控制器(controller),但是这些控制器的接口各不相同。为了提高代码的复用率,ros_control还提供了一个硬件抽象层,负责机器人硬件资源的管理,处理硬件冲突,而controller从抽象层请求资源即可,并不直接接触硬件。
ros_control每个层次所包含的功能:
控制器管理器(Controller Manager) 每个机器人可能有多个控制器,所以这里有一个控制器管理器的概念,提供一种通用的接口来管理不同的控制器。控制器管理器的输入就是ROS上层应用功能包的输出。
控制器(Controller) 控制器可以完成每个joint的控制,读取硬件资源接口中的状态,再发布控制命令,并且提供PID控制器。
硬件资源(Hardware Resource) 为上下两层提供硬件资源的接口
机器人硬件抽象(RobotHW) 机器人硬件抽象和硬件资源直接打交道,通过write和read方法完成硬件操作,这一层也包含关节约束、力矩转换、状态转换等功能。
真实机器人(Real Robot) 真实机器人上也需要有自己的嵌入式控制器,将接收到的命令反映到执行器上。
控制器管理器的相关命令
controller_manager命令的格式为:
$ rosrun controller_manager controller_manager <command> <controller_name>
支持的<command>如下:
load:加载一个控制器
unload:卸载一个控制器
start:启动控制器
stop:停止控制器
spawn:加载并启动一个控制器
kill:停止并卸载一个控制器
如果想要查看某个控制器的状态,可以使用如下命令:
$ rosrun controller_manager controller_manager <command>
支持的<command>如下:
list:根据执行的顺序列出所有控制器,并显示每个控制器的状态
list-types:显示所有控制器的类型
reload-libraries:以插件的形式重载所有控制器的库,不需要重新启动,方便对控制器的开发和测试
reload-libraries --restore:以插件的形式重载所有控制器的库,并恢复到初始状态
使用以下命令可以一次控制多个控制器,自动加载、启动控制器:
$ rosrun controller_manager spawner [--stopped] name1 name2 name3
注:如果加上--stopped参数,那么控制器则只会加载,但是并不会开始运行
使用以下命令可以停止一系列控制器,但是不会卸载:
$ rosrun rontroller_manager unspawner name1 name2 name3
在launch文件中,同样可以通过运行controller_manager命令,加载和启动一系列控制器:
<launch>
<node pkg="controller_manager" type="spawner" args="controller_name1 controller_name2" />
</launch>
在launch文件中输入以下命令,会只加载而不启动controller:
<launch>
<node pkg="controller_manager" type="spawner" args="--stopped controller_name1 controller_name2" />
</launch>
在controller_manager中还提供了可视化工具rqt_controller_manager,输入以下命令即可打开:
$ rosrun rqt_controller_manager rqt_controller_manager