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

CMakeLists Eigen FCPX GNU Gazebo Git Interest KDL Life Linux Matrix ODE ROS Ros UML Ubuntu VcXsrv algorithm algorithms axis-angle bode calibration chrome control cpp data_struct dots figure gdb latex launch life linux mac math matlab memory motor moveit operator optimal algorithm python robot robotics ros ros2 rtb simulation stl thread tools twist urdf velocity vim web work wsl
知识共享许可协议