Gazebo 学习

前言

ros_control是一个实现和管理机器人控制器的框架,它致力于提供一种具有实时性能的,与机器人无关的控制器设计方法。

ros_control 使用

1, 添加插件gazebo_ros_control

根据我们的需要,在添加插件的时候可以指定为,或者,只要将它写到中就可以了。
gazebo_ros_control是Gazebo的一个插件用来根据设定装载合适的硬件接口和控制器。这个实现非常简单,由于Gazebo的插件系统具有很强的扩展性, 使得一些高级玩家可以在ros_control和Gazebo之间创建自己的机器人硬件接口。我们通过在URDF文件中写入如下的XML文本就可以添加gazebo_ros_control插件了,十分简单方便。

<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/MYROBOT</robotNamespace>
</plugin>
</gazebo>

这里没有为标签添加属性reference,这样它就是对整个机器人的描述。gazebo_ros_control的标签还可以通过如下的子标签指定一些参数:

  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, 添加标签

是URDF中用来描述执行器和关节之间关系的扩展标签。通过它我们可以描述类似齿轮减速比以及并联结构的属性。 通过它我们可以指定机器人的控制器接口,方便使用ros_control控制机器人。我们为左臂的肘关节添加如下的标签:

<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>
<node pkg="controller_manager"
type="spawner"
args="controller_name1 controller_name2" />
</launch>

上边的launch文件会加载并启动controllers,如果只需要加载:

<launch>
<node pkg="controller_manager"
type="spawner"
args="--stopped controller_name1 controller_name2" />
</launch>

可视化工具:

rqt_controller_manager是一个rqt插件,允许以图形方式加载,卸载,启动和停止控制器,以及显示有关已加载控制器的信息。
它可以从rqt的“插件”菜单启动,也可以作为具有以下内容的独立可执行文件启动:

rosrun rqt_controller_manager rqt_controller_manager

自己仿真过程纪录

没有配置好ros_gazebo_control

调整PID参数

机器人被方块砸

参考

[1] Gazebo + ros_control

知识共享许可协议