连接gazebo和ros让机器人动起来
关于ros_control
ros_control包将来自机器人执行器编码器的关节状态数据和输入设定点作为输入。它使用通用的控制回路反馈机制,通常是PID控制器,来控制发送到执行器的输出。详细请查阅http://wiki.ros.org/ros_control
在Gazebo中模拟机器人的控制器可以使用ros_control和一个简单的Gazebo插件适配器来完成。模拟,硬件,控制器和传输之间关系的概述如下所示:
添加执行装置——transmission标签
transmission标签主要的针对对象是joint(因为一般两个link连接处的地方如果是非固定的,那么一定会存在一个执行装置来改变两个link的相对位置),transmission标签的作用就是给这个joint打上某种执行器的标签,有了执行器,gazebo就可以在物理层面上对模型进行驱动了。
将transmission标签添加到URDF中,如下:
<transmissionname=“tran1”>
transmission_interface/SimpleTransmission
<joint name="joint1">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
</joint>
<actuatorname="motor1">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
<transmissionname=“tran2”>
transmission_interface/SimpleTransmission
<jointname="joint2">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
</joint>
<actuatorname="motor2">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
对transmission标签内部的属性值稍作介绍:
type: 这个标签不用担心了,只有一个值:transmission_interface/SimpleTransmission
joint:首先要指明transmission服务的joint的名称,之后其中包含一个必填属性
- hardwareInterface:该属性表明了这个joint是什么类型的,当前使用最多的是以下三个属性值:EffortJointInterface(通过输入功率控制电机),VelocityJointInterface(控制电机的转速),PositionJointInterface(控制电机的位置)。
actuator:首先要为你的执行器起一个名字(一般就是什么什么motor),之后指定执行器的内部属性
-
mechanicalReduction:指明电机的减速比
-
hardwareInterface:这个可以不指明,因为在joint中已经指明了
加gazebo_ros_control插件
除了transmission标签之外,还需要在您的URDF中添加Gazebo插件,该插件实际解析传输标签并加载适当的硬件接口和控制器管理器。默认情况下,gazebo_ros_control插件非常简单,但它也可以通过额外的插件架构进行扩展,以允许高级用户在ros_control和Gazebo之间创建自己的自定义机器人硬件接口。
应将默认插件XML添加到rrbot.gazebo中
<pluginname="gazebo_ros_control"filename="libgazebo_ros_control.so">
<robotNamespace>/rrbot</robotNamespace>
<robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType>
</plugin>
可选子元素:
:用于此插件实例的ROS命名空间,默认为URDF / SDF中的机器人名称
:控制器更新的周期(以秒为单位),默认为Gazebo的周期
:robot_description(URDF)在参数服务器上的位置,默认为’/ robot_description’
:要使用的自定义机器人SIM接口的pluginlib名称(有关详细信息,请参见gazebo官网),默认为“DefaultRobotHWSim”
创建.yaml配置文件
PID增益和控制器设置必须保存在yaml文件中,该文件通过roslaunch文件加载到param服务器。在config文件夹中创建一个名为rrbot_control.yaml文件,加入以下内容:
rrbot:
Publish all jointstates -----------------------------------
joint_state_controller:
type: joint_state_controller/JointStateController
publish_rate:50
PositionControllers ---------------------------------------
joint1_position_controller:
type: effort_controllers/JointPositionController
joint: joint1
pid:{p:100.0, i:0.01, d:10.0}
joint2_position_controller:
type: effort_controllers/JointPositionController
joint: joint2
pid:{p:100.0, i:0.01, d:10.0}
创建一个roslaunch文件
这里需要创建一个roslaunch文件以启动ros_control控制器。创建rrbot_control.launch文件,内容如下:
<rosparamfile="$(find rrbot_control)/config/rrbot_control.yaml"command=“load”/>
<nodename="controller_spawner"pkg="controller_manager"type="spawner"respawn=“false”
output="screen"ns="/rrbot"args="joint1_position_controllerjoint2_position_controller joint_state_controller"/>
<nodename="robot_state_publisher"pkg="robot_state_publisher"type=“robot_state_publisher”
respawn="false"output="screen">
<remapfrom="/joint_states"to="/rrbot/joint_states"/>
第一行“rosparam”通过加载yaml配置文件将控制器设置加载到参数服务器,controller_spawner节点通过运行python脚本来启动RRBot的两个联合位置控制器,该脚本对ros_control控制器管理器进行服务调用。服务调用告诉控制器管理器您需要哪些控制器。它还加载第三个控制器,该控制器使用hardware_interfaces发布所有关节的联合状态,并在/ joint_states上公布主题。Spawner只是一个用于roslaunch的帮助脚本。最后一行启动一个robot_state_publisher节点,它只是监听来自joint_state_controller的/joint_states消息,然后将转换发布到/ tf。这使您可以在Rviz中查看模拟机器人以及执行其他任务。
到这里,需要准备的文件都已经准备完毕,下一节我们介绍如何让机器人动起来。
让机器人动起来
接下来通过以下步骤来控制我们建立的机器人运动。
1,启动模拟器
通过运行以下命令测试由ros_control控制的rrbot:
启动rrbot模拟:
roslaunchrrbot_gazebo rrbot_world.launch
通过运行第二个启动文件来加载两个关节的控制器:
roslaunchrrbot_control rrbot_control.launch
在gazebo中可以看到我们的机器人
手动发送控制命令
发送示例联合命令给它们进行测试:
rostopicpub -1/rrbot/joint1_position_controller/command std_msgs/Float64"data:1.5"
rostopic pub -1/rrbot/joint2_position_controller/command std_msgs/Float64"data: 1.0"
机器人执行命令后状态如下:
使用RQT发送命令
在本节中,我们将介绍一些工具,以帮助您可视化控制器的性能并调整控制器可能具有的任何增益/参数,尤其是PID增益。我们将使用RQT,ROS基于插件的用户界面,所以一定要先安装。
启动RQT:
rosrun rqt_gui rqt_gui
在RQT的“插件”菜单中添加“主题 - >消息发布者”插件,然后从下拉框中选择主题,该主题命令您要发布到的任何特定控制器。对于RRBot,添加控制器:
/rrbot/joint1_position_controller/command
然后按右上角的绿色加号按钮。
通过选中主题名称左侧的复选框启用主题发布者。将rate列设置为100(我们发送命令的频率 - 在这种情况下为100hz)。
接下来,展开主题,以便您看到“数据”行。在表达式列中,在数据行上,尝试在joint1的关节限制之间使用不同的弧度值 - 在RRBot的情况下没有限制因为关节是连续的,所以任何值都有效。如果您正在使用该机器人进行本教程,您应该能够让RRBot摆动。
同样,我们把joint2也加入窗口,如图
分别改变节点数值,就能看到机器人按给定数值做相应动作。