ROS Gazebo(四):ROS Control

来源:互联网 发布:js typeof5类型 编辑:程序博客网 时间:2024/04/30 07:07

如何设置模拟控制器来驱动机器人关节?

必须预先安装 ros_control, ros_controllers

一、RSO Control

这里写图片描述

ros_control 功能包以关节驱动器上的编码器或者输入值为关节状态的输入,通过闭环反馈(如PID)控制来控制输出(如力矩)。并通过transmissions来完成物理系统到关节位置、力矩等的映射。

1、控制器

控制器插件如下:

  • effort_controllers

    –joint_effort_controller
    –joint_position_controller
    –joint_velocity_controller

  • joint_state_controller
    –joint_state_controller

  • position_controllers
    –joint_position_controller

  • velocity_controllers
    –joint_velocity_controller

还可以创建自己的控制器

2、硬件接口

硬件接口如下:

  • Joint Command Interfaces
    –Effort Joint Interface
    –Velocity Joint Interface
    –Position Joint Interface
  • Joint State Interfaces
  • Actuator State Interfaces
  • Actuator Command Interfaces
    –Effort Actuator Interface
    –Velocity Actuator Interface
    –Position Actuator Interface
  • Force-torque sensor Interface
  • IMU sensor Interface

还可以创建自己的硬件接口

二、gazebo

1、ros_control 和 Gazebo 的数据流图

包括仿真、硬件、控制器和变换。

这里写图片描述

2、添加 transmission 组件

 <transmission name="tran1">    <type>transmission_interface/SimpleTransmission</type>    <joint name="joint1">      <hardwareInterface>EffortJointInterface</hardwareInterface>    </joint>    <actuator name="motor1">      <hardwareInterface>EffortJointInterface</hardwareInterface>      <mechanicalReduction>1</mechanicalReduction>    </actuator>  </transmission>  <transmission name="tran2">    <type>transmission_interface/SimpleTransmission</type>    <joint name="joint2">      <hardwareInterface>EffortJointInterface</hardwareInterface>    </joint>    <actuator name="motor2">      <hardwareInterface>EffortJointInterface</hardwareInterface>      <mechanicalReduction>1</mechanicalReduction>    </actuator>  </transmission>

<joint name="">: URDF中关节的名称。

<type>: 变换类型。

<hardwareInterface>: 在标签<actuator> 和 <joint> 内。加载的硬件接口类型。

3、添加gazebo_ros_control组件

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

<robotNamespace>:当前插件的名称空间,默认为机器人所在空间。

<controlPeriod>:控制器更新的时间,默认为Gazebo时间

<robotParam>:参数服务器中机器人的描述,默认为/robot_description

<robotSimType>:机器人模拟接口的插件名字,默认为'DefaultRobotHWSim'

控制插件默认的行为包括:

  • hardware_interface::JointStateInterface
  • hardware_interface::EffortJointInterface
  • hardware_interface::VelocityJointInterface

3、RRBot 例子

1、编写材料文件

<!--materials.xacro--><?xml version="1.0"?><robot>  <material name="red">    <color rgba="0.8 0.0 0.0 1.0"/>  </material>  <material name="brown">    <color rgba="${222/255} ${207/255} ${195/255} 1.0"/>  </material></robot>

2、编写插件文件

<?xml version="1.0"?><robot>  <!-- ros_control plugin -->  <gazebo>    <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">      <robotNamespace>/rrbot</robotNamespace>      <robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType>    </plugin>  </gazebo>  <!-- hokuyo -->  <gazebo reference="hokuyo_link">    <sensor type="gpu_ray" name="head_hokuyo_sensor">      <pose>0 0 0 0 0 0</pose>      <visualize>false</visualize>      <update_rate>40</update_rate>      <ray>        <scan>          <horizontal>            <samples>720</samples>            <resolution>1</resolution>            <min_angle>-1.570796</min_angle>            <max_angle>1.570796</max_angle>          </horizontal>        </scan>        <range>          <min>0.10</min>          <max>30.0</max>          <resolution>0.01</resolution>        </range>        <noise>          <type>gaussian</type>          <!-- Noise parameters based on published spec for Hokuyo laser               achieving "+-30mm" accuracy at range < 10m.  A mean of 0.0m and               stddev of 0.01m will put 99.7% of samples within 0.03m of the true               reading. -->          <mean>0.0</mean>          <stddev>0.01</stddev>        </noise>      </ray>      <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_gpu_laser.so">        <topicName>/rrbot/laser/scan</topicName>        <frameName>hokuyo_link</frameName>      </plugin>    </sensor>  </gazebo>  <!-- camera -->  <gazebo reference="camera_link">    <sensor type="camera" name="camera1">      <update_rate>30.0</update_rate>      <camera name="head">        <horizontal_fov>1.3962634</horizontal_fov>        <image>          <width>800</width>          <height>800</height>          <format>R8G8B8</format>        </image>        <clip>          <near>0.02</near>          <far>300</far>        </clip>        <noise>          <type>gaussian</type>          <!-- Noise is sampled independently per pixel on each frame.                 That pixel's noise value is added to each of its color               channels, which at that point lie in the range [0,1]. -->          <mean>0.0</mean>          <stddev>0.007</stddev>        </noise>      </camera>      <plugin name="camera_controller" filename="libgazebo_ros_camera.so">        <alwaysOn>true</alwaysOn>        <updateRate>0.0</updateRate>        <cameraName>rrbot/camera1</cameraName>        <imageTopicName>image_raw</imageTopicName>        <cameraInfoTopicName>camera_info</cameraInfoTopicName>        <frameName>camera_link</frameName>        <hackBaseline>0.07</hackBaseline>        <distortionK1>0.0</distortionK1>        <distortionK2>0.0</distortionK2>        <distortionK3>0.0</distortionK3>        <distortionT1>0.0</distortionT1>        <distortionT2>0.0</distortionT2>      </plugin>    </sensor>  </gazebo>  </robot>

3、编写transation文件

见上文

4、编写xacro文件

<?xml version="1.0"?><!-- Revolute-Revolute Manipulator --><robot name="rrbot" xmlns:xacro="http://www.ros.org/wiki/xacro">  ...  <!-- Import all Gazebo-customization elements, including Gazebo colors -->  <xacro:include filename="$(find rrbot_description)/urdf/rrbot.gazebo" />  <!-- Import Rviz colors -->  <xacro:include filename="$(find rrbot_description)/urdf/materials.xacro" /> <xacro:include filename="$(find rrbot_description)/urdf/rrbot.transmission.xacro" />  <!-- Used for fixing robot to Gazebo 'base_link' -->  <link name="world"/>  <joint name="fixed" type="fixed">    <parent link="world"/>    <child link="link1"/>  </joint>  <!-- Base Link -->  <link name="link1">    <collision>      <origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>      <geometry>    <box size="${width} ${width} ${height1}"/>      </geometry>    </collision>    <visual>      <origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>      <geometry>    <box size="${width} ${width} ${height1}"/>      </geometry>      <material name="orange"/>    </visual>    <inertial>      <origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>      <mass value="${mass}"/>      <inertia      ixx="${mass / 12.0 * (width*width + height1*height1)}" ixy="0.0" ixz="0.0"      iyy="${mass / 12.0 * (height1*height1 + width*width)}" iyz="0.0"      izz="${mass / 12.0 * (width*width + width*width)}"/>    </inertial>  </link>  <joint name="joint1" type="continuous">    <parent link="link1"/>    <child link="link2"/>    <origin xyz="0 ${width} ${height1 - axel_offset}" rpy="0 0 0"/>    <axis xyz="0 1 0"/>    <dynamics damping="0.7"/>  </joint>  <!-- Middle Link -->  ...  <joint name="hokuyo_joint" type="fixed">    <axis xyz="0 1 0" />    <origin xyz="0 0 ${height3 - axel_offset/2}" rpy="0 0 0"/>    <parent link="link3"/>    <child link="hokuyo_link"/>  </joint>  <!-- Hokuyo Laser -->  <link name="hokuyo_link">    <collision>      <origin xyz="0 0 0" rpy="0 0 0"/>      <geometry>    <box size="0.1 0.1 0.1"/>      </geometry>    </collision>    <visual>      <origin xyz="0 0 0" rpy="0 0 0"/>      <geometry>        <mesh filename="package://rrbot_description/meshes/hokuyo.dae"/>      </geometry>    </visual>    <inertial>      <mass value="1e-5" />      <origin xyz="0 0 0" rpy="0 0 0"/>      <inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6" />    </inertial>  </link>  <joint name="camera_joint" type="fixed">    <axis xyz="0 1 0" />    <origin xyz="${camera_link} 0 ${height3 - axel_offset*2}" rpy="0 0 0"/>    <parent link="link3"/>    <child link="camera_link"/>  </joint>  <!-- Camera -->  ...

5、

参考:

http://wiki.ros.org/ros_control
http://gazebosim.org/tutorials?tut=ros_control&cat=connect_ros
https://github.com/ros-simulation/gazebo_ros_demos
http://wiki.ros.org/rqt_graph
http://wiki.ros.org/rqt
http://wiki.ros.org/urdf/XML/Transmission

原创粉丝点击