前言
ros_control是一个实现和管理机器人控制器的框架,它致力于提供一种具有实时性能的,与机器人无关的控制器设计方法。
ros_control 使用
1, 添加插件gazebo_ros_control
根据我们的需要,在添加插件的时候可以指定为
gazebo_ros_control是Gazebo的一个插件用来根据设定装载合适的硬件接口和控制器。这个实现非常简单,由于Gazebo的插件系统具有很强的扩展性, 使得一些高级玩家可以在ros_control和Gazebo之间创建自己的机器人硬件接口。我们通过在URDF文件中写入如下的XML文本就可以添加gazebo_ros_control插件了,十分简单方便。
<gazebo> |
这里没有为标签
1) robotNamespace: 用来告知插件其对象的ROS命名空间,默认是URDF或者SDF对应的机器人名称。
2) contolPeriod:控制器的更新周期,单位为秒,默认使用Gazebo的周期。
3) robotParam:在ROS的参数服务器上的机器人描述(URDF)路径,默认是’/robot_description’。
4) robotSimType:机器人仿真接口所使用的插件库名称,默认是’DefaultRobotHWSim’。
robotNamespace, contolPeriod, robotParam 这几个标签都比较好理解。robotSimType 描述了仿真接口的插件库名称。实际上gazebo_ros_control虽然是一个Gazebo的插件, 它还是提供了一个插件接口用来配置Gazebo与ros_control之间个性化定制的接口。可以理解为一个插件的插件。借助这个接口,我们可以实现自己的控制器,只是需要继承自gazebo_ros_control::RobotHWSim。 默认的插件库是’DefaultRobotHWSim’,提供了如下的ros_control接口:
2, 添加
<transmission name="tran_left_upper_arm_to_left_elbow_y">
<type>transmission_interface/SimpleTransmission</type>
<joint name="left_upper_arm_to_left_elbow_y">
<hardwareInterface>EffortJointInterface</hardwareInterface>
</joint>
<actuator name="act_left_upper_arm_to_left_elbow_y">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
对于每一个transmission标签都有一个”name”的属性,用来唯一的标识transmission,这里根据自己的习惯以需要关联的joint的名称加上”tran“前缀命名。它有三个子标签, 分别描述了transmission的类型,以及关联的joint和执行器。 type描述了transmission的类型,对于Gazebo而言目前只实现了”transmission_interface/SimpleTransmission”这一个类型。 joint标签描述了关联的joint,它的name的属性用来指示需要关联的joint,它有一个hardwareinterface的子标签, 用来描述硬件接口,因为我们将在Gazebo环境中使用,所以这里必须是”EffortJointInterface”。 actuator标签则声明了与之关联的执行器,同样需要以属性”name”给它一个唯一的名字,一般我们以joint名称加上”act“前缀命名。它还有一个mechanicalReduction的标签, 用来描述执行器到joint的齿轮减速比。
Controller manager
Controller_manager用于实现对控制器的加载、运行、停止等操作,根据你是从启动文件、命令行还是从ROS节点运行控制器,控制器管理器提供了以下三种方式来运行控制器: http://wiki.ros.org/controller_manager.
命令行工具:
$ rosrun controller_manager controller_manager <command> <controller_name> |
command 包括:
1) load: 加载控制器(构造和初始化)
2) unload: 卸载控制器(销毁)
3) start:启动控制器
4) stop: 停止控制器
5) spawn: 加载和启动控制器
6) kill: 停止并卸载控制器
查看 controller 的状态:
rosrun controller_manager controller_manager <command> |
command 包括:
1) list :按执行顺序列出所有控制器,并给出每个控制器的状态
2) list-types :列出控制器管理器知道的所有控制器类型。
3) reload-libraries :重新加载所有可作为插件使用的控制器库。
4) reload-libraries —restore :重新加载所有可作为插件使用的控制器库,并将所有控制器恢复为原始状态。
5) spawner工具:很多时候我们需要控制的controller有很多,比如六轴机器人,至少有六个controller,这时也可以使用“spawner ”这个命令来一次控制多个controller:
$ rosrun controller_manager spawner [--stopped] name1 name2 name3 |
边的命令可以自动加载、启动controller,如果加上–stopped参数,那么contrller则只会被加载,但是并不会开始运行。 如果想要停止一系列controller,但是不需要卸载,还需要运行的话,可以使用下边的命令:
$ rosrun controller_manager unspawner name1 name2 name3 |
Launch 工具:
在launch文件中,同样可以通过运行controller_manager包的命令,来加载和启动一系列controller:
<launch> |
上边的launch文件会加载并启动controllers,如果只需要加载:
<launch> |
可视化工具:
rqt_controller_manager是一个rqt插件,允许以图形方式加载,卸载,启动和停止控制器,以及显示有关已加载控制器的信息。
它可以从rqt的“插件”菜单启动,也可以作为具有以下内容的独立可执行文件启动:
rosrun rqt_controller_manager rqt_controller_manager |