敞开生长之旅!这是我参加「日新计划 12 月更文挑战」的第19天,点击查看活动详情

先完成一个机器人joint的操控

创立一个机器人类似云台,完成航向和俯仰操控。

创立一个有joint的xacro文件

怎样构建 及各标签含义及运用 参阅:gazebo tutorial :Using a URDF in Gazebo

给出xacro文件代码及注释

<?xml version="1.0" ?>
<robot name="swivel" xmlns:xacro="http://www.ros.org/wiki/xacro">
  <material name="SwivelWhite">    <color rgba="1.0 1.0 1.0 1"/></material>
  <material name="SwivelLightGray"><color rgba="0.8 0.8 0.8 1"/></material>
  <material name="SwivelMedGray">  <color rgba="0.6 0.6 0.6 1"/></material>
  <material name="SwivelDarkGray"> <color rgba="0.4 0.4 0.4 1"/></material>
  <material name="SwivelRed">      <color rgba="0.5 0.4 0.4 1"/></material>
  <material name="SwivelGreen">    <color rgba="0.4 0.5 0.4 1"/></material>
  <material name="SwivelBlue">     <color rgba="0.4 0.4 0.5 1"/></material>
  <!-- ros_control plugin -->
  <!-- 底盘 base 扁立方体 灰色 -->
  <link name="base">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry >
				<box size="0.1 0.1 0.02" />
      </geometry>
        <material name="SwivelLightGray" /> 
    </visual>
        <!-- gazebo里collision有必要有 磕碰特点 -->
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry >
				<box size="0.1 0.1 0.02" />
      </geometry>
    </collision>  
            <!-- gazebo里inertial有必要有 惯性特点 --> 
     <inertial>
        <mass value="9"/>
        <inertia ixx="9.0" ixy="0.0" ixz="0.0" iyy="9.0" iyz="0.0" izz="9.0"/>
      </inertial> 
  </link>
    <!-- gazebo里加载 相应link -->
  <gazebo reference="base">
       <material>Gazebo/Gray</material>
  </gazebo>
  <!-- 竖轴 link_1  长立方体 蓝色  可绕底盘z轴转360度  -->
  <link name="link_1">
    <visual>
      <origin xyz="0 0 0.06" rpy="0 0 0" />
      <geometry >
	      <box size="0.05 0.05 0.1" />
      </geometry>
      <material name="SwivelBlue" />
     </visual>
     <!-- gazebo里collision有必要有 磕碰特点 -->
    <collision>
      <origin xyz="0 0 0.06" rpy="0 0 0" />
      <geometry >
	      <box size="0.05 0.05 0.1" />
      </geometry>
    </collision> 
                <!-- gazebo里inertial有必要有 惯性特点 --> 
     <inertial>
        <mass value="4"/>
        <inertia ixx="4.0" ixy="0.0" ixz="0.0" iyy="4.0" iyz="0.0" izz="4.0"/>
      </inertial> 
  </link>
  <gazebo reference="link_1">
       <material>Gazebo/Blue</material>
  </gazebo>
    <!-- 底盘与竖轴的joint swivel_J0  --> 
  <joint name="swivel_J0" type="revolute">
    <parent link="base"/>
    <child link="link_1"/>
    <origin xyz="0 0 0" rpy="0 0 0" />
    <axis xyz="0 0 1" />
    <limit lower="0" upper="6.28" effort="10"
	   velocity="1.0" />
    <joint_properties damping="0.0" friction="0.0"/>
  </joint>
        <!-- 横轴 link_2  立方体 红色--> 
  <link name="link_2">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry >
      	<box size="0.1 0.2 0.1" />
      </geometry>
      <material name="SwivelRed" />
    </visual>
  <collision>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry >
      	<box size="0.1 0.2 0.1" />
      </geometry>
    </collision> 
        <inertial>
        <mass value="2"/>
        <inertia ixx="2.0" ixy="0.0" ixz="0.0" iyy="2.0" iyz="0.0" izz="2.0"/>
      </inertial> 
  </link>
    <gazebo reference="link_2">
       <material>Gazebo/Red</material>
  </gazebo>
      <!-- 竖轴与横轴 的joint  做俯仰运动--> 
  <joint name="swivel_J1" type="revolute">
    <parent link="link_1"/>
    <child link="link_2"/>
    <origin xyz="0 0 0.190" rpy="0 0 0" />
    <axis xyz="1 0 0" />
    <limit lower="-1.745" upper="2.356" effort="10"
	   velocity="1.0" />
    <joint_properties damping="0.0" friction="0.0"/>
  </joint>
  <link name="camera_mount">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry >
  	<box size="0.05 0.05 0.05"/>
      </geometry>
      <material name="SwivelGreen" />
    </visual>
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry >
  	     <box size="0.05 0.05 0.05"/>
      </geometry>
    </collision> 
    <inertial>
        <mass value="0.5"/>
        <inertia ixx="0.5" ixy="0.0" ixz="0.0" iyy="0.5" iyz="0.0" izz="0.5"/>
      </inertial> 
  </link>
  <gazebo reference="camera_mount">
       <material>Gazebo/Green</material>
  </gazebo>
  <joint name="camera_J2" type="fixed">
    <parent link="link_2"/>
    <child link="camera_mount"/>
    <origin xyz="0 0 0" rpy="0 0 0" />
    <axis xyz="1 0 0" />
    <limit lower="-2.094" upper="2.670" effort="10"
	   velocity="1.0" />
    <joint_properties damping="0.0" friction="0.0"/>
  </joint>
</robot>

显示模型如下所示

探究--gazebo里 关节是如何动起来的____实现默认插件joint控制
此时模型仅仅能在gazebo中显示出来,还不能做任何的动作

添加 transmission 标签

详细参阅:gazebo Tutorial: ROS Control 将ros_control 用于自己的仿真机器人,需要在一般的URDF文件中参加其它标签。

< transmission >标签用于对应link的履行器到joint 。 其中首要的元素有:

  • < joint name=” ” > name有必要关联到一个joint ,而且只能关联到一个 代码后边有解释
  • < type > 传动器的品种,现在仅transmission_interface/SimpleTransmission能够完成
  • < hardwareInterface > 在 < actuator >和 < joint >标签内部,gazebo_ros_control plugin 加载什么类型的硬件接口 (position, velocity or effort interfaces)

在link1与base的joint (swivel_J0) 后边参加

 <!-- 传动装置 tran1 ,joint :swivel_J0 的  -->
 <transmission name="tran1"><!-- 姓名自定义  --> 
    <type>transmission_interface/SimpleTransmission</type>
    <joint name="swivel_J0"><!-- 姓名有必要与swivel_J0对应共同  --> 
      <hardwareInterface>EffortJointInterface</hardwareInterface>
    </joint>
    <actuator name="motor1"><!-- 姓名自定义  --> 
      <hardwareInterface>EffortJointInterface</hardwareInterface>
      <mechanicalReduction>1</mechanicalReduction>
    </actuator>
  </transmission>

在link1与ling2的joint(swivel_J1)

<!-- 传动装置 tran1 ,joint :swivel_J1 的  -->
<transmission name="tran2"><!-- 姓名自定义  --> 
    <type>transmission_interface/SimpleTransmission</type>
    <joint name="swivel_J1"> <!-- 姓名有必要与swivel_J1对应共同  --> 
      <hardwareInterface>EffortJointInterface</hardwareInterface>
    </joint>
    <actuator name="motor2"> <!-- 姓名自定义  --> 
      <hardwareInterface>EffortJointInterface</hardwareInterface>
      <mechanicalReduction>1</mechanicalReduction>
    </actuator>
  </transmission>

参加 gazebo_ros_control plugin 的标签

该插件标签实践上会 解析 transmission 并 加载恰当的硬件接口和操控器管理器。 详细参阅:gazebo Tutorial: ROS Control

默许情况下,gazebo_ros_control插件非常简单,尽管它还能够经过其他插件体系结构进行扩展,以答应高档用户在ros_control和Gazebo之间创立自己的自定义机器人硬件接口。

gazebo_ros_control < plugin >有如下子标签:

  • < robotNamespace > 标签用于的ros的命名空间 ,默许是 robot name
  • < controlPeriod > 操控器的更新周期(对应源码的update函数 调用频率 后边再对应)
  • 对应源码
  • < robotParam > 默许是’/robot_description’
  • < robotSimType > 重点 用户能够扩展的机器人仿真接口 能够自己做插件,然后在此地方加载。 默许是已经写好的 DefaultRobotHWSim

后边 先用默许方式操控下 再用自己写的插件操控

在文件中参加如下代码

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

创立一个 .yaml装备文件(装备操控器)

操控器能够自己写,然后经过launch文件加载 也能够运用写好的操控器 直接写一个装备文件(.yaml)然后经过launch文件 将装备参数加载到参数服务器,在launch 文件里 发动操控器(controller_manager)该源码会依据参数加载对应的操控器(装备文件里的)。

swivel:
    # Publish all joint states -----------------------------------
  swiveljoint_state_controller:
    type: joint_state_controller/JointStateController
    publish_rate: 50  
  # Position Controllers ---------------------------------------
  swiveljoint1_position_controller:
    type: effort_controllers/JointPositionController
    joint: swivel_J0
    pid: {p: 100.0, i: 0.01, d: 10.0}
  swiveljoint2_position_controller:
    type: effort_controllers/JointPositionController
    joint: swivel_J1
    pid: {p: 100.0, i: 0.01, d: 10.0}

写launch发动文件


<launch>
    <!-- 发动gazebo world为默许空世界 -->
    <include file="$(find hector_gazebo_worlds)/launch/start.launch"/>
  <!-- Load the URDF into the ROS Parameter Server -->
  <param name="robot_description"
         command="$(find xacro)/xacro.py '$(find swivel_description)/model/swivel_test.urdf.xacro'" />
  <!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
  <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
        args="-urdf -model rrbot -param robot_description"/>
  <!-- Load joint controller configurations from YAML file to parameter server -->
  <rosparam file="$(find swivel_description)/config/swivel_gimbal_control.yaml" command="load"/>
  <!-- load the controllers -->
  <node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
    output="screen" ns="/swivel" args="swiveljoint_state_controller swiveljoint1_position_controller swiveljoint2_position_controller  --shutdown-timeout 3"/>
</launch>

履行该launch文件

roslaunch swivel_world.launch

能够看到.yaml 里的操控器已经加载 而且发动了

探究--gazebo里 关节是如何动起来的____实现默认插件joint控制

发布操控命令

由于是调用ros里边写好的操控器,所以不需要知道源码里是怎样接收音讯,然后怎样处理的。也不必纠结为什么要发布这个topic。由于源码接收的便是这个topic。。。

rostopic pub -1 /swivel/swiveljoint1_position_controller/command std_msgs/Float64 "data: 1.5"

然后会发现 竖轴转动了。已经成功操控了机器人的关节。

参阅底下有rqt东西怎样运用 能够发布topic 能够画曲线

探求怎样完成的

撸源码探求ros gazebo里的 硬件笼统构建

  • ros里的操控器

写自己的插件完成操控

  • 接下来要撸ros相关部分的源码了。探求是怎样完成的
  • 然后是模仿源码写自己的插件 机器人接口插件 和 操控器插件