http://gazebosim.org/tutorials/?tut=ros_control
1.向URDF添加插件
对于gazebo_ros_control插件来说,transmission中重要的信息tag如下:
<joint name=""> - name必须于URDF中其它地方的joint对应
<type> - transmission类型,目前仅仅实现了"transmission_interface/SimpleTransmission",当然你可以自己根据需求添加
<hardwareInterface> - 放置在<actuator> 和<joint> tags之内,用来告知gazebo_ros_control插件哪些硬件接口要加载进来(position, velocity or effort interfaces),目前仅effort接口被实现, 根据需要可自行添加其它接口
2.gazebo_ros_control plugin
除了传输标记之外,还需要在URDF中添加Gazebo插件,该插件实际解析传输标记并加载适当的硬件接口和控制器管理器。默认情况下,gazebo_ros_control插件非常简单,不过它也可以通过一个额外的插件体系结构进行扩展,允许高级用户在ros_control和Gazebo之间创建自己的自定义机器人硬件接口。
默认的插件XML应该添加到您的URDF:
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/MYROBOT</robotNamespace>
</plugin>
</gazebo>
1)gazebo_ros_control <plugin> tag有下面几个可选属性:
<robotNamespace>: 插件实例的ROS命名空间, 在URDF/SDF文件缺省是机器人名字
<controlPeriod>: controller更新周期update (in seconds), 缺省是Gazebo的period
<robotParam>: 参数服务器robot_description (URDF)的位置,缺省是'/robot_description'
<robotSimType>: robot sim interface插件名字 (详细见下面), 缺省是 'DefaultRobotHWSim'
2)缺省的gazebo_ros_control的行为:
在缺省情况下,没有 <robotSimType> tag, gazebo_ros_control会尝试获取它需要的所有接口以实现与基于ros_control的controller通信。
在缺省情况下,它的行为提供如下ros_control接口:
hardware_interface::JointStateInterface
hardware_interface::EffortJointInterface
hardware_interface::VelocityJointInterface - not fully implemented
3)高级gazebo_ros_control的行为(自定义gazebo_ros_control插件):
gazebo_ros_control插件也提供了基于pluginlib的接口,这样方便Gazebo和ros_control之间的自定义硬件接口,以仿真更加复杂的机构(如非线性弹簧,连杆等等)。
自定义的新插件必须继承gazebo_ros_control::RobotHWSim, 它是仿真的hardware_interface::RobotHW。 RobotHWSim提供的API可以实现对Gazebo模拟器中joint的读和写。
各个RobotHWSim子类在URDF模型中指定,并在加载机器人模型时加载。例如,下面的XML将加载默认插件(与不使用标记<robotSimType> tag情况相同):
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/MYROBOT</robotNamespace>
<robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType>
</plugin>
</gazebo>
uarm_gazebo_control.launch
<launch>
<!-- Load joint controller configurations from YAML file to parameter server -->
<rosparam file="$(find rrbot_control)/config/rrbot_control.yaml" command="load"/>
<!-- load the controllers -->
<node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
output="screen" ns="/rrbot" args="joint1_position_controller joint2_position_controller joint_state_controller"/>
<!-- convert joint states to TF transforms for rviz, etc -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
respawn="false" output="screen">
<remap from="/joint_states" to="/rrbot/joint_states" />
</node>
</launch>
第一行“rosparam”通过加载YAML配置文件(在下一节中讨论)将控制器设置加载到参数服务器
该脚本对ros_control控制器管理器进行服务调用。服务调用告诉控制器管理器您想要哪个控制器。它还加载第三个控制器,该控制器使用hardware_interface发布所有关节的关节状态,并在/joint_states上发布主题,
最后一行启动robot_state_publisher节点,该节点只侦听来自join_state_controller的/joint_states消息,然后将转换发布到/tf。这允许您在Rviz中查看模拟机器人,并执行其他任务。
来源:CSDN
作者:cookie909
链接:https://blog.csdn.net/cookie909/article/details/84776052