使用solidworks导出URDF模型,转换成xacro模型,并在rviz 和 gazebo中显示并控制

版本:

ros:Kinetic

solidworks:2016

 

一    使用solidworks2016导出URDF模型

 

           使用sw2urdfSetup插件将机器人模型导出为URDF文件,插件下载地址:https://github.com/ros/solidworks_urdf_exporter/releases

   导出教程:https://www.bilibili.com/video/av56651666?from=search&seid=2948765959330396238

           导出的是轮椅模型可以参考经典的差速模型,前面两个驱动轮,后面两个随动轮,以及一个激光雷达,需要手动设置坐标系和参考轴,joint模式选择continues.

导出之后生成的再rviz中显示的display.launch和gazebo.launch文件.

display.launch

<launch>
  <arg
    name="model" />
  <arg
    name="gui"
    default="False" />    <!--若要打开gui插件需要把Flase修改为True-->
  <param
    name="robot_description"
    textfile="$(find smartwheelchair_model)/urdf/smartwheelchair_model.urdf" />
  <param
    name="use_gui"
    value="$(arg gui)" />
  <node
    name="joint_state_publisher"
    pkg="joint_state_publisher"
    type="joint_state_publisher" />    
  <node
    name="robot_state_publisher"
    pkg="robot_state_publisher"
    type="state_publisher" />
  <node
    name="rviz"
    pkg="rviz"
    type="rviz"
    args="-d $(find smartwheelchair_model)/urdf.rviz" />
</launch>

gazebo.launch

<launch>
  <include
    file="$(find gazebo_ros)/launch/empty_world.launch" />
  <node
    name="tf_footprint_base"
    pkg="tf"
    type="static_transform_publisher"
    args="0 0 0 0 0 0 base_link base_footprint 40" />   
  <node
    name="spawn_model"
    pkg="gazebo_ros"
    type="spawn_model"
    args="-file $(find smartwheelchair_model)/urdf/smartwheelchair_model.urdf -urdf -model smartwheelchair_model"
    output="screen" />
  <node
    name="fake_joint_calibration"
    pkg="rostopic"
    type="rostopic"
    args="pub /calibrated std_msgs/Bool true" />
</launch>

运行gazebo.launch会出现轮椅从空中掉下来的现象,原因有两种可能: 1   base_footprint(base_link在地面的投影)并没有设置,不知道为什么这里的gazebo.launch直接使用了;  2 没有添加controller;

个人感觉第二种可能性比较大.

urdf文件

<?xml version="1.0" encoding="utf-8"?>
<!-- This URDF was automatically created by SolidWorks to URDF Exporter! Originally created by Stephen Brawner (brawner@gmail.com) 
     Commit Version: 1.5.1-0-g916b5db  Build Version: 1.5.7152.31018
     For more information, please see http://wiki.ros.org/sw_urdf_exporter -->
<robot
  name="smartwheelchair_model">
  <link
    name="base_link">
    <inertial>
      <origin
        xyz="0.071793651840574 -0.0111022819034436 -0.165475510614961"
        rpy="0 0 0" />
      <mass
        value="26.2736382176516" />
      <inertia
        ixx="2.53902638074258"
        ixy="0.105926700574816"
        ixz="0.672576086778549"
        iyy="2.61400293250425"
        iyz="0.117880225409204"
        izz="2.26655952469972" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/base_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.666666666666667 0.698039215686274 0.768627450980392 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/base_link.STL" />
      </geometry>
    </collision>
  </link>
  <link
    name="front_left_link">
    <inertial>
      <origin
        xyz="-5.98826543907194E-14 -0.0294979270265525 -1.73416836446449E-13"
        rpy="0 0 0" />
      <mass
        value="2.73380732959739" />
      <inertia
        ixx="0.0540175535224848"
        ixy="-9.37490464830404E-14"
        ixz="5.70463674728184E-14"
        iyy="0.105827632352094"
        iyz="-2.91387363698334E-14"
        izz="0.0540175535219555" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/front_left_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.294117647058824 0.294117647058824 0.294117647058824 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/front_left_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="front_left_joint"
    type="continuous">
    <origin
      xyz="0.125 0.32744 -0.32024"
      rpy="0 0 0" />
    <parent
      link="base_link" />
    <child
      link="front_left_link" />
    <axis
      xyz="0 1 0" />
    <limit
      lower="-180"
      upper="180"
      effort="0"
      velocity="0" />
  </joint>
  <link
    name="rear_left_link">
    <inertial>
      <origin
        xyz="0.00443883274698265 -0.159000141701653 -0.0610820964989148"
        rpy="0 0 0" />
      <mass
        value="0.218543419099177" />
      <inertia
        ixx="0.00138257528279561"
        ixy="4.94760179596061E-05"
        ixz="3.77546054156748E-05"
        iyy="0.000561948581245053"
        iyz="-0.000582727419998246"
        izz="0.00107345266613901" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/rear_left_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.250980392156863 0.250980392156863 0.250980392156863 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/rear_left_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="rear_left_joint"
    type="continuous">
    <origin
      xyz="-0.40155 0.26744 -0.20624"
      rpy="1.5708 0 1.7371" />
    <parent
      link="base_link" />
    <child
      link="rear_left_link" />
    <axis
      xyz="0 1 0" />
  </joint>
  <link
    name="wheel_rear_left_link">
    <inertial>
      <origin
        xyz="0.00653640490648077 -0.0389351446936917 6.97854693476607E-09"
        rpy="0 0 0" />
      <mass
        value="2.05874206334677" />
      <inertia
        ixx="0.0145592695258203"
        ixy="-0.00225630762393329"
        ixz="-2.72157388421748E-09"
        iyy="0.0276205421886138"
        iyz="-4.71240874480446E-10"
        izz="0.014180480200489" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/wheel_rear_left_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.294117647058824 0.294117647058824 0.294117647058824 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/wheel_rear_left_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="wheel_rear_left_joint"
    type="continuous">
    <origin
      xyz="0.03948 -0.21 -0.1"
      rpy="1.5708 -1.4045 3.1416" />
    <parent
      link="rear_left_link" />
    <child
      link="wheel_rear_left_link" />
    <axis
      xyz="-0.16556 0.9862 0" />
    <limit
      lower="-180"
      upper="180"
      effort="0"
      velocity="0" />
  </joint>
  <link
    name="front_right_link">
    <inertial>
      <origin
        xyz="1.32630018079283E-13 0.0294979270265526 -1.26731958260962E-13"
        rpy="0 0 0" />
      <mass
        value="2.73380732959733" />
      <inertia
        ixx="0.0540175535224209"
        ixy="-9.67321655236162E-14"
        ixz="1.8160422674322E-13"
        iyy="0.105827632352093"
        iyz="-1.67393860339268E-14"
        izz="0.0540175535220183" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/front_right_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.866666666666667 0.909803921568627 1 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/front_right_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="front_right_joint"
    type="continuous">
    <origin
      xyz="0.125 -0.32154 -0.32024"
      rpy="0 0 0" />
    <parent
      link="base_link" />
    <child
      link="front_right_link" />
    <axis
      xyz="0 -1 0" />
    <limit
      lower="-180"
      upper="180"
      effort="0"
      velocity="0" />
  </joint>
  <link
    name="rear_right_link">
    <inertial>
      <origin
        xyz="-0.00443895322170662 -0.159000141931278 -0.0610820981859959"
        rpy="0 0 0" />
      <mass
        value="0.218543419196504" />
      <inertia
        ixx="0.00138257531626846"
        ixy="-4.94729909470212E-05"
        ixz="-3.77531936561614E-05"
        iyy="0.000561950359239888"
        iyz="-0.000582722657630795"
        izz="0.00107345045383076" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/rear_right_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.250980392156863 0.250980392156863 0.250980392156863 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/rear_right_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="rear_right_joint"
    type="continuous">
    <origin
      xyz="-0.40155 -0.26154 -0.20624"
      rpy="1.5708 0 1.7371" />
    <parent
      link="base_link" />
    <child
      link="rear_right_link" />
    <axis
      xyz="0 -1 0" />
    <limit
      lower="-180"
      upper="180"
      effort="0"
      velocity="0" />
  </joint>
  <link
    name="wheel_rear_right_link">
    <inertial>
      <origin
        xyz="-0.00653640348729612 0.0389351469670967 9.15520717570395E-09"
        rpy="0 0 0" />
      <mass
        value="2.05874178462337" />
      <inertia
        ixx="0.0145592650917787"
        ixy="-0.00225630804394482"
        ixz="-9.8275687204457E-10"
        iyy="0.02762054030789"
        iyz="-9.60855468748932E-11"
        izz="0.0141804828642344" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/wheel_rear_right_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.294117647058824 0.294117647058824 0.294117647058824 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/wheel_rear_right_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="wheel_rear_right_joint"
    type="revolute">
    <origin
      xyz="-0.03948 -0.21 -0.1"
      rpy="1.5708 -1.4045 3.1416" />
    <parent
      link="rear_right_link" />
    <child
      link="wheel_rear_right_link" />
    <axis
      xyz="0.16556 -0.9862 0" />
    <limit
      lower="-180"
      upper="180"
      effort="0"
      velocity="0" />
  </joint>
  <link
    name="laser_Link">
    <inertial>
      <origin
        xyz="0.065791191331278 -9.1747807187873E-10 -0.0926765202077648"
        rpy="0 0 0" />
      <mass
        value="6.86176515805913" />
      <inertia
        ixx="0.0631299703695162"
        ixy="-2.88721826247212E-10"
        ixz="-0.000562191972859836"
        iyy="0.03676014992034"
        iyz="-4.08726766416169E-10"
        izz="0.046630206646977" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/laser_Link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.250980392156863 0.250980392156863 0.250980392156863 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/laser_Link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="laser_joint"
    type="fixed">
    <origin
      xyz="-0.42295 0.0029489 -0.030238"
      rpy="0 0 0" />
    <parent
      link="base_link" />
    <child
      link="laser_Link" />
    <axis
      xyz="0 0 0" />
  </joint>
</robot>

 

二  修改为xacro文件

 

    修改思路: 添加 base_footprint 作为base_link的parent link, 在gazebo运行的xacro文件中加入gazebo_ros_controller,将轮椅本体和激光雷达进行宏定义.

    修改后的轮椅结构:

1. 在rviz 中试用的xacro文件 

轮椅主体:smartwheelchair_base.xacro,跟之前没有太大变化,加入了base_footprint和宏定义.

<?xml version="1.0" encoding="utf-8"?>
<robot name="smartwheelchair_model" xmlns:xacro="http://www.ros.org/wiki/xacro" >
    <!-- PROPERTY LIST -->
    <xacro:property name="M_PI" value="3.1415926"/>
    <xacro:property name="wheel_radius" value="0.2838162"/>
    <xacro:property name="wheel_distance" value="0.64899"/>

<xacro:macro name="mbot_base">
 <!-- smartwheelchair's link and joint -->
    <link
    name="base_link">
    <inertial>
      <origin
        xyz="0 0 0.53122"
        rpy="0 0 0" />
      <mass
        value="26.2736382176516" />
      <inertia
        ixx="2.53902638074258"
        ixy="0.105926700574816"
        ixz="0.672576086778549"
        iyy="2.61400293250425"
        iyz="0.117880225409204"
        izz="2.26655952469972" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/base_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.666666666666667 0.698039215686274 0.768627450980392 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/base_link.STL" />
      </geometry>
    </collision>
  </link>
  <link
    name="front_left_link">
    <inertial>
      <origin
        xyz="-5.98826543907194E-14 -0.0294979270265525 -1.73416836446449E-13"
        rpy="0 0 0" />
      <mass
        value="2.73380732959739" />
      <inertia
        ixx="0.0540175535224848"
        ixy="-9.37490464830404E-14"
        ixz="5.70463674728184E-14"
        iyy="0.105827632352094"
        iyz="-2.91387363698334E-14"
        izz="0.0540175535219555" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/front_left_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.294117647058824 0.294117647058824 0.294117647058824 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/front_left_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="front_left_joint"
    type="continuous">
    <origin
      xyz="0.125 0.32744 -0.32024"
      rpy="0 0 0" />
    <parent
      link="base_link" />
    <child
      link="front_left_link" />
    <axis
      xyz="0 1 0" />
    <limit
      lower="-180"
      upper="180"
      effort="0"
      velocity="0" />
  </joint>
  <link
    name="rear_left_link">
    <inertial>
      <origin
        xyz="0.00443883274698265 -0.159000141701653 -0.0610820964989148"
        rpy="0 0 0" />
      <mass
        value="0.218543419099177" />
      <inertia
        ixx="0.00138257528279561"
        ixy="4.94760179596061E-05"
        ixz="3.77546054156748E-05"
        iyy="0.000561948581245053"
        iyz="-0.000582727419998246"
        izz="0.00107345266613901" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/rear_left_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.250980392156863 0.250980392156863 0.250980392156863 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/rear_left_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="rear_left_joint"
    type="continuous">
    <origin
      xyz="-0.40155 0.26744 -0.20624"
      rpy="1.5708 0 1.7371" />
    <parent
      link="base_link" />
    <child
      link="rear_left_link" />
    <axis
      xyz="0 1 0" />
  </joint>
  <link
    name="wheel_rear_left_link">
    <inertial>
      <origin
        xyz="0.00653640490648077 -0.0389351446936917 6.97854693476607E-09"
        rpy="0 0 0" />
      <mass
        value="2.05874206334677" />
      <inertia
        ixx="0.0145592695258203"
        ixy="-0.00225630762393329"
        ixz="-2.72157388421748E-09"
        iyy="0.0276205421886138"
        iyz="-4.71240874480446E-10"
        izz="0.014180480200489" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/wheel_rear_left_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.294117647058824 0.294117647058824 0.294117647058824 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/wheel_rear_left_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="wheel_rear_left_joint"
    type="continuous">
    <origin
      xyz="0.03948 -0.21 -0.1"
      rpy="1.5708 -1.4045 3.1416" />
    <parent
      link="rear_left_link" />
    <child
      link="wheel_rear_left_link" />
    <axis
      xyz="-0.16556 0.9862 0" />
    <limit
      lower="-180"
      upper="180"
      effort="0"
      velocity="0" />
  </joint>
  <link
    name="front_right_link">
    <inertial>
      <origin
        xyz="1.32630018079283E-13 0.0294979270265526 -1.26731958260962E-13"
        rpy="0 0 0" />
      <mass
        value="2.73380732959733" />
      <inertia
        ixx="0.0540175535224209"
        ixy="-9.67321655236162E-14"
        ixz="1.8160422674322E-13"
        iyy="0.105827632352093"
        iyz="-1.67393860339268E-14"
        izz="0.0540175535220183" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/front_right_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.294117647058824 0.294117647058824 0.294117647058824 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/front_right_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="front_right_joint"
    type="continuous">
    <origin
      xyz="0.125 -0.32154 -0.32024"
      rpy="0 0 0" />
    <parent
      link="base_link" />
    <child
      link="front_right_link" />
    <axis
      xyz="0 -1 0" />
    <limit
      lower="-180"
      upper="180"
      effort="0"
      velocity="0" />
  </joint>
  <link
    name="rear_right_link">
    <inertial>
      <origin
        xyz="-0.00443895322170662 -0.159000141931278 -0.0610820981859959"
        rpy="0 0 0" />
      <mass
        value="0.218543419196504" />
      <inertia
        ixx="0.00138257531626846"
        ixy="-4.94729909470212E-05"
        ixz="-3.77531936561614E-05"
        iyy="0.000561950359239888"
        iyz="-0.000582722657630795"
        izz="0.00107345045383076" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/rear_right_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.250980392156863 0.250980392156863 0.250980392156863 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/rear_right_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="rear_right_joint"
    type="continuous">
    <origin
      xyz="-0.40155 -0.26154 -0.20624"
      rpy="1.5708 0 1.7371" />
    <parent
      link="base_link" />
    <child
      link="rear_right_link" />
    <axis
      xyz="0 -1 0" />
    <limit
      lower="-180"
      upper="180"
      effort="0"
      velocity="0" />
  </joint>
  <link
    name="wheel_rear_right_link">
    <inertial>
      <origin
        xyz="-0.00653640348729612 0.0389351469670967 9.15520717570395E-09"
        rpy="0 0 0" />
      <mass
        value="2.05874178462337" />
      <inertia
        ixx="0.0145592650917787"
        ixy="-0.00225630804394482"
        ixz="-9.8275687204457E-10"
        iyy="0.02762054030789"
        iyz="-9.60855468748932E-11"
        izz="0.0141804828642344" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/wheel_rear_right_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.294117647058824 0.294117647058824 0.294117647058824 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/wheel_rear_right_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="wheel_rear_right_joint"
    type="revolute">
    <origin
      xyz="-0.03948 -0.21 -0.1"
      rpy="1.5708 -1.4045 3.1416" />
    <parent
      link="rear_right_link" />
    <child
      link="wheel_rear_right_link" />
    <axis
      xyz="0.16556 -0.9862 0" />
    <limit
      lower="-180"
      upper="180"
      effort="0"
      velocity="0" />
  </joint>

           <link name="base_footprint">
            <visual>
                <origin xyz="0 0 0" rpy="0 0 0" />
                <geometry>
                    <box size="0.001 0.001 0.001" />
                </geometry>
            </visual>
        </link>

        <joint name="base_footprint_joint" type="fixed">
            <origin xyz="0 0 0.53122" rpy="0 0 0" />        
            <parent link="base_footprint"/>
            <child link="base_link" />
        </joint>
 </xacro:macro>
  
</robot>

雷达 lidar.xacro

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="laser">
   
    <xacro:macro name="rplidar" params="prefix:=laser">
        <!-- Create laser reference frame -->
<link
    name="${prefix}_Link">
    <inertial>
      <origin
        xyz="0.065791191331278 -9.1747807187873E-10 -0.0926765202077648"
        rpy="0 0 0" />
      <mass
        value="0.686176515805913" />
      <inertia
        ixx="0.0631299703695162"
        ixy="-2.88721826247212E-10"
        ixz="-0.000562191972859836"
        iyy="0.03676014992034"
        iyz="-4.08726766416169E-10"
        izz="0.046630206646977" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/laser_Link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.250980392156863 0.250980392156863 0.250980392156863 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://smartwheelchair_model/meshes/laser_Link.STL" />
      </geometry>
    </collision>
  </link>
    </xacro:macro>
</robot>

轮椅总体:smartwheelchair_base_with_laser.xacro

<?xml version="1.0"?>
<robot name="arm" xmlns:xacro="http://www.ros.org/wiki/xacro">

    <xacro:include filename="$(find smartwheelchair_model)/urdf/xacro/smartwheelchair_base.xacro" />
    <xacro:include filename="$(find smartwheelchair_model)/urdf/xacro/sensors/lidar.xacro" />

    <!-- lidar -->
 <joint
    name="laser_joint"
    type="fixed">
    <origin
      xyz="-0.42295 0.0029489 -0.030238"
      rpy="0 0 0" />
    <parent
      link="base_link" />
    <child
      link="laser_Link" />
    <axis
      xyz="0 0 0" />
  </joint>

    <xacro:rplidar prefix="laser"/>

    <mbot_base/>

</robot>

2. 在gazebo中使用的xacro文件

在轮椅主体的smartwheelchair_base.xacro的基础上添加,形成smartwheelchair_base_gazebo.xacro

 <!-- link_color -->
   <gazebo reference="base_link">
        <material>Gazebo/Gray</material>
  </gazebo>

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

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

   <gazebo reference="rear_left_link">
        <material>Gazebo/Gray</material>
  </gazebo>

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

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

   <gazebo reference="base_footprint">
        <turnGravityOff>false</turnGravityOff>
  </gazebo>

    <!-- transmission -->
       <transmission name="front_left_joint_trans">
            <type>transmission_interface/SimpleTransmission</type>
            <joint name="front_left_joint" >
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
            </joint>
            <actuator name="front_left_joint_motor">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
                <mechanicalReduction>1</mechanicalReduction>
            </actuator>
        </transmission>

      <transmission name="front_right_joint_trans">
            <type>transmission_interface/SimpleTransmission</type>
            <joint name="front_right_joint" >
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
            </joint>
            <actuator name="front_right_joint_motor">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
                <mechanicalReduction>1</mechanicalReduction>
            </actuator>
        </transmission>

 <!-- controller -->
        <gazebo>
            <plugin name="differential_drive_controller" 
                    filename="libgazebo_ros_diff_drive.so">
                <rosDebugLevel>Debug</rosDebugLevel>
                <publishWheelTF>true</publishWheelTF>
                <robotNamespace>/</robotNamespace>
                <publishTf>1</publishTf>
                <publishWheelJointState>true</publishWheelJointState>
                <alwaysOn>true</alwaysOn>
                <updateRate>100.0</updateRate>
                <legacyMode>true</legacyMode>
                <leftJoint>front_left_joint</leftJoint>
                <rightJoint>front_right_joint</rightJoint>
                <wheelSeparation>${wheel_distance*1}</wheelSeparation>
                <wheelDiameter>${2*wheel_radius}</wheelDiameter>
                <broadcastTF>1</broadcastTF>
                <wheelTorque>30</wheelTorque>
                <wheelAcceleration>1.8</wheelAcceleration>
                <commandTopic>cmd_vel</commandTopic>
                <odometryFrame>odom</odometryFrame> 
                <odometryTopic>odom</odometryTopic> 
                <robotBaseFrame>base_footprint</robotBaseFrame>
            </plugin>
        </gazebo> 

在lidar.xacro的基础上添加,形成lidar_gazebo.xacro

   <gazebo reference="${prefix}_Link">
        <material>Gazebo/Blue</material>
  </gazebo>

        <gazebo reference="${prefix}_link">
            <sensor type="ray" name="rplidar">
                <pose>0 0 0 0 0 0</pose>
                <visualize>false</visualize>
                <update_rate>5.5</update_rate>
                <ray>
                    <scan>
                      <horizontal>
                        <samples>360</samples>
                        <resolution>1</resolution>
                        <min_angle>-3</min_angle>
                        <max_angle>3</max_angle>
                      </horizontal>
                    </scan>
                    <range>
                      <min>0.10</min>
                      <max>6.0</max>
                      <resolution>0.01</resolution>
                    </range>
                    <noise>
                      <type>gaussian</type>
                      <mean>0.0</mean>
                      <stddev>0.01</stddev>
                    </noise>
                </ray>
                <plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so">
                    <topicName>/scan</topicName>
                    <frameName>laser_link</frameName>
                </plugin>
            </sensor>
        </gazebo>

在gazebo中使用的轮椅文件:smartwheelchair_model_with_laser_gazebo.xacro

<?xml version="1.0"?>
<robot name="arm" xmlns:xacro="http://www.ros.org/wiki/xacro">

    <xacro:include filename="$(find smartwheelchair_model)/urdf/xacro/gazebo/smartwheelchair_base_gazebo.xacro" />
    <xacro:include filename="$(find smartwheelchair_model)/urdf/xacro/sensors/lidar_gazebo.xacro" />

    <!-- lidar -->
 <joint
    name="laser_joint"
    type="fixed">
    <origin
      xyz="-0.42295 0.0029489 -0.030238"
      rpy="0 0 0" />
    <parent
      link="base_link" />
    <child
      link="laser_Link" />
    <axis
      xyz="0 0 0" />
  </joint>

    <xacro:rplidar prefix="laser"/>

    <mbot_base_gazebo/>

</robot>

 

三 修改launch文件

 

在rviz中显示并控制 (arbotix 需要下载放在工作空间下)

<launch>
  <arg name="model" default="$(find xacro)/xacro --inorder '$(find smartwheelchair_model)/urdf/xacro/smartwheelchair_model_with_laser.xacro'" />
  <arg
    name="gui"
    default="true" />
  <param name="robot_description" command="$(arg model)" />
  <param
    name="use_gui"
    value="$(arg gui)" />

    <node name="arbotix" pkg="arbotix_python" type="arbotix_driver" output="screen">
        <rosparam file="$(find smartwheelchair_model)/config/fake_mbot_arbotix.yaml" command="load" />
        <param name="sim" value="true"/>
    </node>

  <node
    name="joint_state_publisher"
    pkg="joint_state_publisher"
    type="joint_state_publisher" />
  <node
    name="robot_state_publisher"
    pkg="robot_state_publisher"
    type="state_publisher" />
  <node
    name="rviz"
    pkg="rviz"
    type="rviz"
    args="-d $(find smartwheelchair_model)/config/display_arbotix.rviz" 
    required="true" />
</launch>

 

在gazebo中显示并控制

<launch>

    <!-- 设置launch文件的参数 home_2,world是另外创建的功能包里面的.world文件-->
    <arg name="world_name" value="$(find smartwheelchair_gazebo)/worlds/home_2.world"/>
    <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"/>

    <!-- 运行gazebo仿真环境 -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="world_name" value="$(arg world_name)" />
        <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>

    <!-- 加载机器人模型描述参数 -->
    <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find smartwheelchair_model)/urdf/xacro/gazebo/smartwheelchair_model_with_laser_gazebo.xacro'" /> 

    <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node> 

    <!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"  output="screen" >
        <param name="publish_frequency" type="double" value="50.0" />
    </node>

    <!-- 在gazebo中加载机器人模型-->
    <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
          args="-urdf -model arm -param robot_description"/> 

</launch>

分别运行以上launch文件在加上cmd_vel控制节点就可以显示并控制其运动了.

 

 

 

 

 

 

 

 

 

四 问题和解决办法

1 运行gazebo.launch文件,机器人从天而降并歪倒在地上

  <node
    name="tf_footprint_base"
    pkg="tf"
    type="static_transform_publisher"
    args="0 0 0 0 0 0 base_link base_footprint 40" />   

这句话好像是用于tf坐标变换的,我后面手动添加了base_footprint ,所以就把这句话删掉了,并在新的xacro文件中加入了gazebo_ros_controller ,之后轮椅机器人导入在gazebo中显示就正常了.

 

2 使用键盘控制节点在gazebo控制轮椅运动时发现轮椅前进和左转错乱,问题在于solidworks导出的时候  

左边的轮子是

   <axis
      xyz="0 1 0" />
这句话右边轮椅是
   <axis
      xyz="0 -1 0" />
这就导致发出向前的指令左边正转右边倒转,解决办法将-1改为1.

3  world创建的时候一定不要带上机器人保存,要不然引用的时候会出现两个机器人.

posted @ 2020-03-19 01:11  古尔丹是大反派  阅读(4043)  评论(1编辑  收藏  举报