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

先实现一个机器人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中显示出来,还不能做任何的动作

添加 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 里的控制器已经加载 并且启动了
在这里插入图片描述

发布控制命令

因为是调用ros里面写好的控制器,所以不需要知道源码里是怎么接收消息,然后怎么处理的。也不用纠结为什么要发布这个topic。因为源码接收的就是这个topic。。。

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

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

参考底下有rqt工具如何使用
可以发布topic
可以画曲线

探究怎么实现的

撸源码探究ros gazebo里的 硬件抽象构建

  • ros里的控制器

写自己的插件实现控制

  • 接下来要撸ros相关部分的源码了。探究是怎么实现的
  • 然后是仿照源码写自己的插件 机器人接口插件 和 控制器插件
  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月照银海似蛟龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值