ros_controls
ros_control是什么
ros_control是对pr2_mechanism包的重写,使其适用于所有机器人的硬件封装库,负责管理硬件驱动与传感器底层细节,处理异常,分配资源,向上提供统一接口。是一个需要继承特定基类来实现接口统一的类库。内置丰富的controller,可以直接使用需要的控制算法,同时在仿真gazebo对ros_control也有很好的支持,便利了gazebo的仿真开发。
接收来自机器人执行器的编码器和输入设定点的关节状态数据作为输入。它使用一个通用的控制回路反馈机制,通常是一个PID控制器,来控制发送到执行器的输出,通常是作用力。ros_control对于没有一对一的关节位置,作用力等映射的物理机制会变得更加复杂,但是这些场景是使用transmissions来解释的。
推荐仔细研究的教程:ROS-wiki官方教程,ros_control的github教程,官方发布视频,发布视频中的PDF文档
框架
框架图:
作为应用与机器人之间的中间件,包含一系列控制器接口、传动装置接口、硬件接口、控制器工具箱等。针对不同的底盘,机械臂等,提供多种不同的controller。
硬件抽象层
提供硬件抽象层hardware_interface,进行机器人的硬件资源管理,controllers再向抽象层请求资源。所有的controllers都使用forward_command_controller向抽象层发送消息。
数据流图:
- Controller Manager:每个机器人可能有多个controller,所以这里有一个控制器管理器的概念,提供一种通用的接口来管理不同的controller。controller manager的输入就是ROS上层应用的输出。
- Controller:controller可以完成每个joint的控制,请求下层的硬件资源,并且提供了PID控制器,读取硬件资源接口中的状态,再发布控制命令。
- Hardware Rescource:为上下两层提供硬件资源的接口。
- RobotHW:硬件抽象层和硬件直接打交道,通过write和read方法来完成硬件的操作,这一层也包含关节限位、力矩转换、状态转换等功能。
- Real Robot:实际的机器人上也需要有自己的嵌入式控制器,接收到命令后需要反映到执行器上,比如接收到位置1的命令后,那就需要让执行器快速、稳定的到达位置1。
controller_manager
controller_manager提供一个实时兼容的loop来控制robot的机制,该机制由hardware_interface:robothw提供。并提供加载、卸载、启动和停止控制器的基础结构。
加载控制器时,controller_manager将使用控制器名称作为所有控制器特定参数的根,最重要的是,区分标识和要加载的插件。controller_manager提供了与控制器交互的基础结构。根据您是从启动文件、命令行还是从ros节点运行控制器,controller_manager提供了不同的工具来运行控制器。
命令行工具
controller_manager
与特定控制器进行交互
$ rosrun controller_manager controller_manager <command> <name1> <name2> ...
-
load: load controllers (construct and initialize)
-
unload: unload controllers (destruct)
-
start: start controllers
-
stop: stop controllers
-
spawn: load and start controllers
-
kill: stop and unload controllers
查看控制器相应状态
$ rosrun controller_manager controller_manager <command>
-
list: 按执行顺序列出所有控制器,并给出每个控制器的状态
-
list-types: 列出控制器管理器知道的所有控制器类型。如果你的控制器不在此列表中,你将无法生成它。
-
reload-libraries: 重新加载作为插件可用的所有控制器库。这在开发控制器时非常方便,并且您希望测试新的控制器代码,而不必每次重新启动机器人。这不会重新启动以前运行的控制器。
-
reload-libraries --restore: 重新加载所有可用的控制器库作为插件,并将所有控制器还原到其原始状态。
不全放上来了。。。
launch文件启动
使用spawner工具从启动文件中自动加载、启动、停止和卸载控制器。启动spawner时,它将加载并启动控制器。当您停止spawner(启动文件被取下时),它将停止并卸载控制器。
<launch>
<node pkg="controller_manager"
type="spawner"
args="controller_name1 controller_name2" />
</launch>
只加载不启动
<launch>
<node pkg="controller_manager