要仿真则需要机器人模型,所以先得有.urdf或者.xacro文件。

接着,要想模型在Gazebo里运动起来,又需要在xacro里设置一些运动关节的 transmission;
其次,为了让它在gazebo里显示出来,需要借助于gazebo_ros这个package的node:spawn_model来加载一个empty_world;
随后,关节的pid设置是需要一个配置文件的robot_control.yaml;
最后则是利用launch来启动controller_manager这个package中的spawner这个node,加载第三步的配置并输入设定的controller以及发布robot的state到tf。

终端一: rosocre
终端二:

配置环境变量:source /opt/ros/kinetic/setup.bash
cd  ~/catkin_ws/src/six_dof_arm_gazebo/urdf
sudo gedit  six_dof_arm.xacro

一、xacro文件
路径:
~/catkin_ws/src/six_dof_arm_gazebo/urdf/six_dof_arm.xacro

代码如下:

<?xml version="1.0"?>


<robot name="six_dof_arm" xmlns:xacro="http://www.ros.org/wiki/xacro">


  <!-- Include materials -->


    <material name="Black">
        <color rgba="0.0 0.0 0.0 1.0"/>
    </material>


    <material name="Red">
        <color rgba="0.8 0.0 0.0 1.0"/>
    </material>


    <material name="White">
        <color rgba="1.0 1.0 1.0 1.0"/>
    </material>


  <!-- Constants -->
  <property name="deg_to_rad" value="0.01745329251994329577"/>
  <property name="M_PI" value="3.14159"/>
  <property name="x" value="0.0125"/>


  <!-- base link properties -->
  <property name="base_len" value="0.168" />
  <property name="base_width" value="0.168" />
  <property name="base_height" value="0.055" />


  <!-- shoulder link properties -->
  <property name="shoulder_radius" value="0.06" />
  <property name="shoulder_len" value="0.085" />


  <!-- bigarm link properties -->
  <property name="bigarm_radius" value="0.03" />
  <property name="bigarm_len" value="0.135" />


  <!-- forearm link properties -->
  <property name="forearm_radius" value="0.03" />
  <property name="forearm_len" value="0.147" />


  <!-- chuck link properties -->
  <property name="chuck_len" value="0.08" />
  <property name="chuck_width" value="0.03" />
  <property name="chuck_height" value="0.03" />


  <!-- inertial matrix macro definition -->
   <xacro:macro name="inertial_matrix" params="mass">
      <inertial>
      <mass value="${mass}" />
        <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="0.5" iyz="0.0" izz="1.0" />
      </inertial>
   </xacro:macro>


<!-- transmission block macro definition -->
   <xacro:macro name="transmission_block" params="joint_name">
 <transmission name="tran1">
   <type>transmission_interface/SimpleTransmission</type>
   <joint name="${joint_name}">
     <hardwareInterface>PositionJointInterface</hardwareInterface>
   </joint>
   <actuator name="motor1">
     <hardwareInterface>PositionJointInterface</hardwareInterface>
     <mechanicalReduction>1</mechanicalReduction>
   </actuator>
 </transmission>
   </xacro:macro>


<!-- / -->
  <virtual_joint name="fixed_frame" type="fixed" parent_frame="base_link" child_link="base_link" />  


<!-- / -->


  <!-- BASE LINK -->
  <link name="base_link">
    <visual>
      <origin xyz="0 0 0.0275" rpy="0 0 0" /> 
      <geometry>
       <box size="${base_len} ${base_width} ${base_height}" />
      </geometry>
      <material name="White" />
    </visual>


    <collision>
      <origin xyz="0 0 0.0275" rpy="0 0 0" />
      <geometry>
      <box size="${base_len} ${base_width} ${base_height}" />
      </geometry>
      </collision>>
<xacro:inertial_matrix mass="1"/>
  </link>


  <gazebo reference="base_link">
    <material>Gazebo/White</material>
  </gazebo>


  <joint name="shoulder_joint" type="revolute">
    <parent link="base_link"/>
    <child link="shoulder_link"/>
    <origin xyz="0 0 0.055" rpy="0 0 0" />
    <axis xyz="0 0 1" />
    <limit effort="300" velocity="1" lower="-2.35619449" upper="2.35619449"/>
    <dynamics damping="50" friction="1"/>
  </joint>


<!-- / -->


  <!-- SHOULDER LINK -->
  <link name="shoulder_link" >
    <visual>
      <origin xyz="0 0 0.0425" rpy="0 0 0" />
      <geometry>
            <cylinder radius="${shoulder_radius}" length="${shoulder_len}"/>
      </geometry>
      <material name="Red" />
    </visual>


    <collision>
      <origin xyz="0 0 0.0425" rpy="0 0 0" />
      <geometry>
            <cylinder radius="${shoulder_radius}" length="${shoulder_len}"/>
      </geometry>
    </collision>
<xacro:inertial_matrix mass="1"/>
  </link>


  <gazebo reference="shoulder_link">
    <material>Gazebo/Red</material>
  </gazebo>


  <joint name="bigarm_joint" type="revolute">
    <parent link="shoulder_link"/>
    <child link="bigarm_link"/>
    <origin xyz="0 0 0.085" rpy="0 0 0" />
    <axis xyz="0 1 0" />
    <limit effort="300" velocity="1" lower="0.0" upper="1.483529864195" />
    <dynamics damping="50" friction="1"/>
  </joint>


<!-- / -->


  <!-- BIGARM LINK -->
  <link name="bigarm_link" >
    <visual>
      <origin xyz="0 0 0.0675" rpy="0 0 0" />
      <geometry>
            <cylinder radius="${bigarm_radius}" length="${bigarm_len}"/>
      </geometry>
      <material name="White" />
    </visual>


    <collision>
      <origin xyz="0 0 0.0675" rpy="0 0 0" />
      <geometry>
            <cylinder radius="${bigarm_radius}" length="${bigarm_len}"/>
      </geometry>
    </collision>
<xacro:inertial_matrix mass="1"/>
  </link>


  <gazebo reference="bigarm_link">
    <material>Gazebo/White</material>
  </gazebo>


  <joint name="forearm_joint" type="revolute">
    <parent link="bigarm_link"/>
    <child link="forearm_link"/>
    <origin xyz="0 0 0.135" rpy="0 0 0" />
    <axis xyz="0 1 0" />
    <limit effort="300" velocity="1" lower="-0.1745329251994329577" upper="1.65806278939" />
    <dynamics damping="50" friction="1"/>
  </joint>


<!-- / -->


  <!--FOREARM LINK -->
  <link name="forearm_link" >
    <visual>
      <origin xyz="0 0 0.0735" rpy="0 0 0" />
      <geometry>
            <cylinder radius="${forearm_radius}" length="${forearm_len}"/>
      </geometry>
      <material name="Black" />
    </visual>


    <collision>
      <origin xyz="0 0 0.0735" rpy="0 0 0" />
      <geometry>
            <cylinder radius="${forearm_radius}" length="${forearm_len}"/>
      </geometry>
    </collision>
<xacro:inertial_matrix mass="1"/>
  </link>


  <gazebo reference="forearm_link">
    <material>Gazebo/Black</material>
  </gazebo>


  <joint name="chuck_joint" type="revolute">
    <parent link="forearm_link"/>
    <child link="chuck_link"/>
    <origin xyz="0 0 0.147" rpy="0 0 0" />
    <axis xyz="0 1 0" />
    <limit effort="300" velocity="1" lower="-1.5707963267948966" upper="1.5707963267948966" />
    <dynamics damping="50" friction="1"/>
  </joint>


<!-- / -->


  <!--FOREARM LINK -->
  <link name="chuck_link" >
    <visual>
      <origin xyz="0.02 0 0.0155" rpy="0 0 0" />
      <geometry>
            <box size="${chuck_len} ${chuck_width} ${chuck_height}" />
      </geometry>
      <material name="Red" />
    </visual>


    <collision>
      <origin xyz="0 0 0.0155" rpy="0 0 0" />
      <geometry>
            <box size="${chuck_len} ${chuck_width} ${chuck_height}" />
      </geometry>
    </collision>
<xacro:inertial_matrix mass="1"/>
  </link>


  <gazebo reference="chuck_link">
    <material>Gazebo/Red</material>
  </gazebo>


<!-- / -->
  <!-- Transmissions for ROS Control -->


   <xacro:transmission_block joint_name="shoulder_joint"/>
   <xacro:transmission_block joint_name="bigarm_joint"/>
   <xacro:transmission_block joint_name="forearm_joint"/>
   <xacro:transmission_block joint_name="chuck_joint"/>


<!-- / -->
  <!-- ros_control plugin -->
  <gazebo>
    <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
      <robotNamespace>/six_dof_arm</robotNamespace>
    </plugin>
  </gazebo>


</robot>

二 launch 启动文件
1)路径:

cd ~/catkin_ws/src/six_dof_arm_gazebo/launch
sudo gedit six_dof_arm_world.launch

这个six_dof_arm_world.launch文件的作用是使用gazebo_ros这个package启动empty world和加载spawn_model这个node.
代码如下:

<launch>

  <!-- these are the arguments you can pass this launch file, for example paused:=true -->
  <arg name="paused" default="false"/>
  <arg name="use_sim_time" default="true"/>
  <arg name="gui" default="true"/>
  <arg name="headless" default="false"/>
  <arg name="debug" default="false"/>

  <!-- We resume the logic in empty_world.launch -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find six_dof_arm_gazebo)/worlds/six_dof_arm.world"/> 
    <arg name="debug" value="$(arg debug)" />
    <arg name="gui" value="$(arg gui)" />
    <arg name="paused" value="$(arg paused)"/>
    <arg name="use_sim_time" value="$(arg use_sim_time)"/>
    <arg name="headless" value="$(arg headless)"/>
  </include>

  <!-- Load the URDF into the ROS Parameter Server -->
  <param name="robot_description" command="$(find xacro)/xacro.py '$(find six_dof_arm_gazebo)/urdf/six_dof_arm.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 six_dof_arm -param robot_description"/> 


</launch>

2)路径:

cd ~/catkin_ws/src/six_dof_arm_gazebo/launch

这个six_dof_arm_gazebo_control.launch文件是用来启动controller_manager和发布joint states

<launch>
  <!-- Launch Gazebo  -->
  <include file="$(find six_dof_arm_gazebo)/launch/seven_dof_arm_world.launch" />   


  <!-- Load joint controller configurations from YAML file to parameter server -->
  <rosparam file="$(find six_dof_arm_gazebo)/config/six_dof_arm_gazebo_control.yaml" command="load"/>


  <!-- load the controllers -->
  <node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
    output="screen" ns="/six_dof_arm" args="joint_state_controller
                      joint1_position_controller
                      joint2_position_controller
                      joint3_position_controller
                      joint4_position_controller
                      joint5_position_controller
                      joint6_position_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="/six_dof_arm/joint_states" />
  </node>

</launch>

三 运行仿真

cd ~/catkin_ws/src/six_dof_arm_gazebo/launch  
roslaunch gazebo_ros six_dof_arm_world.launch

这里写图片描述
据说,我建的模型好难看(破涕为笑),所以还要改~

四.设置控制器参数——six_dof_arm_gazebo/config/six_dof_arm_gazebo_control.yaml

six_dof_arm:
  # Publish all joint states -----------------------------------
  joint_state_controller:
    type: joint_state_controller/JointStateController
    publish_rate: 50  

  # Position Controllers ---------------------------------------
  joint1_position_controller:
    type: position_controllers/JointPositionController
    joint: shoulder_joint
    pid: {p: 100.0, i: 0.01, d: 10.0}
  joint2_position_controller:
    type: position_controllers/JointPositionController
    joint: elbow_joint
    pid: {p: 100.0, i: 0.01, d: 10.0}
  joint3_position_controller:
    type: position_controllers/JointPositionController
    joint: bigarm_joint
    pid: {p: 100.0, i: 0.01, d: 10.0}
  joint4_position_controller:
    type: position_controllers/JointPositionController
    joint: forearm_joint
    pid: {p: 100.0, i: 0.01, d: 10.0}
  joint5_position_controller:
    type: position_controllers/JointPositionController
    joint: backarm_joint
    pid: {p: 100.0, i: 0.01, d: 10.0}
  joint6_position_controller:
    type: position_controllers/JointPositionController
    joint: chuck_joint
    pid: {p: 100.0, i: 0.01, d: 10.0}


Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐