国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

xacro機(jī)器人模型文件轉(zhuǎn)urdf文件怎么編寫launch文件啟動gazebo仿真和在rviz2內(nèi)顯示模型

這篇具有很好參考價值的文章主要介紹了xacro機(jī)器人模型文件轉(zhuǎn)urdf文件怎么編寫launch文件啟動gazebo仿真和在rviz2內(nèi)顯示模型。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

urdf文件很直白,每個零件的</link>??</joint>都要編寫一遍,每個零件數(shù)據(jù)都要自己算出來結(jié)果,很麻煩,但是用起來很簡單。xacro寫的模型文件可以把好多常量提前定義出來,不同大小的機(jī)器人只要只要改一下常量,機(jī)器人模型就可以重新生成,代碼可以復(fù)用,編寫起來簡單多了,但是編寫launch啟動文件麻煩一些。

urdf編寫的小車模型文件:

<!-- base.urdf -->
<?xml version="1.0" ?>
<robot name="jtbot">
  <!-- 機(jī)器人底盤 -->
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.46 0.46 0.11"/>
      </geometry>
      <material name="Cyan">
        <color rgba="0 1.0 1.0 1.0"/>
      </material>
    </visual>
    <!-- 碰撞區(qū)域 -->
    <collision>
      <geometry>
        <box size="0.46 0.46 0.11"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="1.5707963267948966 0 1.5707963267948966" xyz="0 0 0"/>
      <mass value="15"/>
      <inertia ixx="0.279625" ixy="0.0" ixz="0.0" iyy="0.529" iyz="0.0" izz="0.279625"/>
    </inertial>
  </link>
  <!-- 機(jī)器人 Footprint -->
  <link name="base_footprint"/>
  <!-- 底盤關(guān)節(jié) -->
  <joint name="base_joint" type="fixed">
    <parent link="base_link"/>
    <child link="base_footprint"/>
    <origin rpy="0 0 0" xyz="0.0 0.0 -0.1325"/>
  </joint>
  <link name="left_wheel_link">
    <visual>
      <origin rpy="1.5707963267948966 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.06" radius="0.0775"/>
      </geometry>
      <material name="Gray">
        <color rgba="0.5 0.5 0.5 1.0"/>
      </material>
    </visual>
    <!-- 碰撞區(qū)域 -->
    <collision>
      <origin rpy="1.5707963267948966 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.06" radius="0.0775"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="1.5707963267948966 0 0" xyz="0 0 0"/>
      <mass value="0.8"/>
      <inertia ixx="0.0014412499999999998" ixy="0" ixz="0" iyy="0.0014412499999999998" iyz="0" izz="0.0024025"/>
    </inertial>
  </link>
  <!-- 輪子關(guān)節(jié) -->
  <joint name="left_wheel_joint" type="continuous">
    <parent link="base_link"/>
    <child link="left_wheel_link"/>
    <origin rpy="0 0 0" xyz="0.15 0.27 -0.055"/>
    <axis xyz="0 1 0"/>
  </joint>
  <link name="right_wheel_link">
    <visual>
      <origin rpy="1.5707963267948966 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.06" radius="0.0775"/>
      </geometry>
      <material name="Gray">
        <color rgba="0.5 0.5 0.5 1.0"/>
      </material>
    </visual>
    <!-- 碰撞區(qū)域 -->
    <collision>
      <origin rpy="1.5707963267948966 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.06" radius="0.0775"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="1.5707963267948966 0 0" xyz="0 0 0"/>
      <mass value="0.8"/>
      <inertia ixx="0.0014412499999999998" ixy="0" ixz="0" iyy="0.0014412499999999998" iyz="0" izz="0.0024025"/>
    </inertial>
  </link>
  <!-- 輪子關(guān)節(jié) -->
  <joint name="right_wheel_joint" type="continuous">
    <parent link="base_link"/>
    <child link="right_wheel_link"/>
    <origin rpy="0 0 0" xyz="0.15 -0.27 -0.055"/>
    <axis xyz="0 1 0"/>
  </joint>
  <!-- 支撐輪 -->
  <link name="caster_link">
    <visual>
      <geometry>
        <sphere radius="0.03875"/>
      </geometry>
      <material name="Cyan">
        <color rgba="0 1.0 1.0 1.0"/>
      </material>
    </visual>
    <!-- 碰撞區(qū)域 -->
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <sphere radius="0.03875"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="0.5"/>
      <inertia ixx="0.0003003125" ixy="0.0" ixz="0.0" iyy="0.0003003125" iyz="0.0" izz="0.0003003125"/>
    </inertial>
  </link>
  <!-- 支撐輪gazebo顏色 -->
  <gazebo reference="caster_link">
    <material>Gazebo/Black</material>
  </gazebo>
  <!-- 支撐輪gazebo摩擦力 -->
  <gazebo reference="caster_link">
    <mu1 value="0.0"/>
    <mu2 value="0.0"/>
    <kp value="1000000.0"/>
    <kd value="10.0"/>
  </gazebo>
  <!-- 支撐輪關(guān)節(jié) -->
  <joint name="caster_joint" type="fixed">
    <parent link="base_link"/>
    <child link="caster_link"/>
    <origin rpy="0 0 0" xyz="-0.205 0.0 -0.09375"/>
  </joint>
  <!-- imu -->
  <link name="imu_link">
    <visual>
      <geometry>
        <box size="0.06 0.03 0.03"/>
      </geometry>
    </visual>
    <!-- 碰撞區(qū)域 -->
    <collision>
      <geometry>
        <box size="0.06 0.03 0.03"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="1.5707963267948966 0 1.5707963267948966" xyz="0 0 0"/>
      <mass value="0.1"/>
      <inertia ixx="0.0001666666666666667" ixy="0.0" ixz="0.0" iyy="0.0001666666666666667" iyz="0.0" izz="0.0001666666666666667"/>
    </inertial>
  </link>
  <!-- imu關(guān)節(jié) -->
  <joint name="imu_joint" type="fixed">
    <parent link="base_link"/>
    <child link="imu_link"/>
    <origin xyz="-0.05 0 -0.055"/>
  </joint>
  <!-- imu仿真插件 -->
  <gazebo reference="imu_link">
    <sensor name="imu_sensor" type="imu">
      <plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin">
        <ros>
          <!-- 命名空間 -->
          <!-- <namespace>/demo</namespace> -->
          <remapping>~/out:=imu</remapping>
        </ros>
        <!-- 初始方位_參考 -->
        <initial_orientation_as_reference>false</initial_orientation_as_reference>
      </plugin>
      <always_on>true</always_on>
      <!-- 更新頻率 -->
      <update_rate>100</update_rate>
      <visualize>true</visualize>
      <imu>
        <!-- 角速度 -->
        <angular_velocity>
          <x>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>2e-4</stddev>
              <bias_mean>0.0000075</bias_mean>
              <bias_stddev>0.0000008</bias_stddev>
            </noise>
          </x>
          <y>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>2e-4</stddev>
              <bias_mean>0.0000075</bias_mean>
              <bias_stddev>0.0000008</bias_stddev>
            </noise>
          </y>
          <z>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>2e-4</stddev>
              <bias_mean>0.0000075</bias_mean>
              <bias_stddev>0.0000008</bias_stddev>
            </noise>
          </z>
        </angular_velocity>
        <!-- 線性加速度 -->
        <linear_acceleration>
          <x>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>1.7e-2</stddev>
              <bias_mean>0.1</bias_mean>
              <bias_stddev>0.001</bias_stddev>
            </noise>
          </x>
          <y>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>1.7e-2</stddev>
              <bias_mean>0.1</bias_mean>
              <bias_stddev>0.001</bias_stddev>
            </noise>
          </y>
          <z>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>1.7e-2</stddev>
              <bias_mean>0.1</bias_mean>
              <bias_stddev>0.001</bias_stddev>
            </noise>
          </z>
        </linear_acceleration>
      </imu>
    </sensor>
  </gazebo>
  <!-- 差速驅(qū)動仿真插件 -->
  <gazebo>
    <plugin filename="libgazebo_ros_diff_drive.so" name="diff_drive">
      <ros>
        <!-- 命名空間 -->
        <!-- <namespace>/demo</namespace> -->
      </ros>
      <!-- 左右輪子 -->
      <left_joint>left_wheel_joint</left_joint>
      <right_joint>right_wheel_joint</right_joint>
      <!-- 輪距 輪子直徑 -->
      <wheel_separation>0.52</wheel_separation>
      <!-- <wheel_separation>0.52</wheel_separation> -->
      <wheel_diameter>0.155</wheel_diameter>
      <!-- <wheel_diameter>0.155</wheel_diameter> -->
      <!-- 最大扭矩 最大加速度 -->
      <max_wheel_torque>20</max_wheel_torque>
      <max_wheel_acceleration>1.0</max_wheel_acceleration>
      <!-- 輸出 -->
      <!-- 是否發(fā)布里程計 -->
      <publish_odom>true</publish_odom>
      <!-- 是否發(fā)布里程計的tf開關(guān) -->
      <publish_odom_tf>true</publish_odom_tf>
      <!-- 是否發(fā)布輪子的tf數(shù)據(jù)開關(guān) -->
      <publish_wheel_tf>true</publish_wheel_tf>
      <!-- 里程計的framed ID,最終體現(xiàn)在話題和TF上 -->
      <odometry_frame>odom</odometry_frame>
      <!-- 機(jī)器人的基礎(chǔ)frame的ID -->
      <robot_base_frame>base_link</robot_base_frame>
    </plugin>
  </gazebo>
  <!-- 雷達(dá) -->
  <link name="laser">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.04" radius="0.04"/>
      </geometry>
    </visual>
    <!-- 慣性屬性 -->
    <inertial>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <mass value="0.125"/>
      <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
    </inertial>
    <!-- 碰撞區(qū)域 -->
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.04" radius="0.04"/>
      </geometry>
    </collision>
  </link>
  <!-- 雷達(dá)關(guān)節(jié) -->
  <joint name="laser_joint" type="fixed">
    <parent link="base_link"/>
    <child link="laser"/>
    <origin rpy="0 0 0" xyz="0.16 0 0.078"/>
  </joint>
  <gazebo reference="laser">
    <sensor name="laser" type="ray">
      <always_on>true</always_on>
      <visualize>false</visualize>
      <update_rate>5</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>360</samples>
            <resolution>1.000000</resolution>
            <min_angle>0.000000</min_angle>
            <max_angle>6.280000</max_angle>
          </horizontal>
        </scan>
        <range>
          <min>0.120000</min>
          <max>3.5</max>
          <resolution>0.015000</resolution>
        </range>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.01</stddev>
        </noise>
      </ray>
      <plugin filename="libgazebo_ros_ray_sensor.so" name="scan">
        <ros>
          <remapping>~/out:=scan</remapping>
        </ros>
        <output_type>sensor_msgs/LaserScan</output_type>
        <frame_name>laser</frame_name>
      </plugin>
    </sensor>
  </gazebo>
  <!-- 相機(jī) -->
  <link name="camera_link">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <box size="0.015 0.130 0.022"/>
      </geometry>
    </visual>
    <!-- 碰撞區(qū)域 -->
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <box size="0.015 0.130 0.022"/>
      </geometry>
    </collision>
    <!-- 慣性屬性 -->
    <inertial>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <mass value="0.035"/>
      <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
    </inertial>
  </link>
  <!-- 相機(jī)關(guān)節(jié) -->
  <joint name="camera_joint" type="fixed">
    <parent link="base_link"/>
    <child link="camera_link"/>
    <origin rpy="0 0 0" xyz="0.16 0 0.11"/>
  </joint>
  <!-- 深度相機(jī) -->
  <link name="camera_depth_frame"/>
  <joint name="camera_depth_joint" type="fixed">
    <origin rpy="0 0 0" xyz="0 0 0"/>
    <parent link="camera_link"/>
    <child link="camera_depth_frame"/>
  </joint>
  <!-- 相機(jī)仿真 -->
  <gazebo reference="camera_depth_link">
    <sensor name="depth_camera" type="depth">
      <visualize>true</visualize>
      <update_rate>30.0</update_rate>
      <camera name="camera">
        <horizontal_fov>1.047198</horizontal_fov>
        <image>
          <width>640</width>
          <height>480</height>
          <format>R8G8B8</format>
        </image>
        <clip>
          <near>0.05</near>
          <far>3</far>
        </clip>
      </camera>
      <plugin filename="libgazebo_ros_camera.so" name="depth_camera_controller">
        <baseline>0.2</baseline>
        <alwaysOn>true</alwaysOn>
        <updateRate>0.0</updateRate>
        <frame_name>camera_depth_frame</frame_name>
        <pointCloudCutoff>0.5</pointCloudCutoff>
        <pointCloudCutoffMax>3.0</pointCloudCutoffMax>
        <distortionK1>0</distortionK1>
        <distortionK2>0</distortionK2>
        <distortionK3>0</distortionK3>
        <distortionT1>0</distortionT1>
        <distortionT2>0</distortionT2>
        <CxPrime>0</CxPrime>
        <Cx>0</Cx>
        <Cy>0</Cy>
        <focalLength>0</focalLength>
        <hackBaseline>0</hackBaseline>
      </plugin>
    </sensor>
  </gazebo>
</robot>

xacro編寫的小車模型文件:

<!-- base.urdf.xacro -->
<?xml version="1.0"?>
<robot name="jtbot"
  xmlns:xacro="http://ros.org/wiki/xacro">

  <!-- 定義機(jī)器人常量 -->
  <!-- 底盤 長 寬 高 -->
  <xacro:property name="base_width" value="0.46"/>
  <xacro:property name="base_length" value="0.46"/>
  <xacro:property name="base_height" value="0.11"/>
  <!-- 輪子半徑 -->
  <xacro:property name="wheel_radius" value="0.0775"/>
  <!-- 輪子寬度 -->
  <xacro:property name="wheel_width" value="0.06"/>
  <!-- 輪子和底盤的間距 -->
  <xacro:property name="wheel_ygap" value="0.01"/>
  <!-- 輪子z軸偏移量 -->
  <xacro:property name="wheel_zoff" value="0.055"/>
  <!-- 輪子x軸偏移量 -->
  <xacro:property name="wheel_xoff" value="0.15"/>
  <!-- 支撐輪x軸偏移量 -->
  <xacro:property name="caster_xoff" value="0.205"/>

  <!-- 定義長方形慣性屬性宏  -->
  <xacro:macro name="box_inertia" params="m w h d">
    <inertial>
      <origin xyz="0 0 0" rpy="${pi/2} 0 ${pi/2}"/>
      <mass value="${m}"/>
      <inertia ixx="${(m/12) * (h*h + d*d)}" ixy="0.0" ixz="0.0" iyy="${(m/12) * (w*w + d*d)}" iyz="0.0" izz="${(m/12) * (w*w + h*h)}"/>
    </inertial>
  </xacro:macro>
  <!-- 定義圓柱慣性屬性宏  -->
  <xacro:macro name="cylinder_inertia" params="m r h">
    <inertial>
      <origin xyz="0 0 0" rpy="${pi/2} 0 0" />
      <mass value="${m}"/>
      <inertia ixx="${(m/12) * (3*r*r + h*h)}" ixy = "0" ixz = "0" iyy="${(m/12) * (3*r*r + h*h)}" iyz = "0" izz="${(m/2) * (r*r)}"/>
    </inertial>
  </xacro:macro>
  <!-- 定義球體慣性屬性宏  -->
  <xacro:macro name="sphere_inertia" params="m r">
    <inertial>
      <mass value="${m}"/>
      <inertia ixx="${(2/5) * m * (r*r)}" ixy="0.0" ixz="0.0" iyy="${(2/5) * m * (r*r)}" iyz="0.0" izz="${(2/5) * m * (r*r)}"/>
    </inertial>
  </xacro:macro>

  <!-- 機(jī)器人底盤 -->
  <link name="base_link">
    <visual>
      <geometry>
        <box size="${base_length} ${base_width} ${base_height}"/>
      </geometry>
      <material name="Cyan">
        <color rgba="0 1.0 1.0 1.0"/>
      </material>
    </visual>
    <!-- 碰撞區(qū)域 -->
    <collision>
      <geometry>
        <box size="${base_length} ${base_width} ${base_height}"/>
      </geometry>
    </collision>
    <!-- 慣性特性 -->
    <xacro:box_inertia m="15" w="${base_width}" d="${base_length}" h="${base_height}"/>
  </link>

  <!-- 機(jī)器人 Footprint -->
  <link name="base_footprint"/>
  <!-- 底盤關(guān)節(jié) -->
  <joint name="base_joint" type="fixed">
    <parent link="base_link"/>
    <child link="base_footprint"/>
    <origin xyz="0.0 0.0 ${-(wheel_radius+wheel_zoff)}" rpy="0 0 0"/>
  </joint>

  <!-- 創(chuàng)建輪子宏函數(shù) -->
  <xacro:macro name="wheel" params="prefix x_reflect y_reflect">
    <link name="${prefix}_link">
      <visual>
        <origin xyz="0 0 0" rpy="${pi/2} 0 0"/>
        <geometry>
          <cylinder radius="${wheel_radius}" length="${wheel_width}"/>
        </geometry>
        <material name="Gray">
          <color rgba="0.5 0.5 0.5 1.0"/>
        </material>
      </visual>
      <!-- 碰撞區(qū)域 -->
      <collision>
        <origin xyz="0 0 0" rpy="${pi/2} 0 0"/>
        <geometry>
          <cylinder radius="${wheel_radius}" length="${wheel_width}"/>
        </geometry>
      </collision>
      <!-- 慣性屬性 -->
      <xacro:cylinder_inertia m="0.8" r="${wheel_radius}" h="${wheel_width}"/>
    </link>
    <!-- 輪子關(guān)節(jié) -->
    <joint name="${prefix}_joint" type="continuous">
      <parent link="base_link"/>
      <child link="${prefix}_link"/>
      <origin xyz="${x_reflect*wheel_xoff} ${y_reflect*(base_width/2+wheel_width/2+wheel_ygap)} ${-wheel_zoff}" rpy="0 0 0"/>
      <axis xyz="0 1 0"/>
    </joint>
  </xacro:macro>
  <!-- 根據(jù)上面的宏函數(shù)實(shí)例化左右輪 -->
  <xacro:wheel prefix="left_wheel" x_reflect="1" y_reflect="1" />
  <xacro:wheel prefix="right_wheel" x_reflect="1" y_reflect="-1" />

  <!-- 支撐輪 -->
  <link name="caster_link">
    <visual>
      <geometry>
        <sphere radius="${(wheel_radius/2)}"/>
      </geometry>
      <material name="Cyan">
        <color rgba="0 1.0 1.0 1.0"/>
      </material>
    </visual>
    <!-- 碰撞區(qū)域 -->
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <sphere radius="${(wheel_radius/2)}"/>
      </geometry>
    </collision>
    <!-- 慣性屬性 -->
    <xacro:sphere_inertia m="0.5" r="${(wheel_radius/2)}"/>
  </link>
  <!-- 支撐輪gazebo顏色 -->
  <gazebo reference="caster_link">
    <material>Gazebo/Black</material>
  </gazebo>
  <!-- 支撐輪gazebo摩擦力 -->
  <gazebo reference="caster_link">
    <mu1 value="0.0"/>
    <mu2 value="0.0"/>
    <kp value="1000000.0" />
    <kd value="10.0" />
  </gazebo>
  <!-- 支撐輪關(guān)節(jié) -->
  <joint name="caster_joint" type="fixed">
    <parent link="base_link"/>
    <child link="caster_link"/>
    <origin xyz="${-caster_xoff} 0.0 ${-(base_height+wheel_radius)/2}" rpy="0 0 0"/>
  </joint>
  <!-- imu -->
  <link name="imu_link">
    <visual>
      <geometry>
        <box size="0.06 0.03 0.03"/>
      </geometry>
    </visual>
    <!-- 碰撞區(qū)域 -->
    <collision>
      <geometry>
        <box size="0.06 0.03 0.03"/>
      </geometry>
    </collision>
    <!-- 慣性屬性 -->
    <xacro:box_inertia m="0.1" w="0.1" d="0.1" h="0.1"/>
  </link>
  <!-- imu關(guān)節(jié) -->
  <joint name="imu_joint" type="fixed">
    <parent link="base_link"/>
    <child link="imu_link"/>
    <origin xyz="-0.05 0 -0.055"/>
  </joint>
  <!-- imu仿真插件 -->
  <gazebo reference="imu_link">
    <sensor name="imu_sensor" type="imu">
      <plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin">
        <ros>
          <!-- 命名空間 -->
          <!-- <namespace>/demo</namespace> -->
          <remapping>~/out:=imu</remapping>
        </ros>
        <!-- 初始方位_參考 -->
        <initial_orientation_as_reference>true</initial_orientation_as_reference>
      </plugin>
      <always_on>true</always_on>
      <!-- 更新頻率 -->
      <update_rate>100</update_rate>
      <visualize>true</visualize>
      <imu>
        <!-- 角速度 -->
        <angular_velocity>
          <x>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>2e-4</stddev>
              <bias_mean>0.0000075</bias_mean>
              <bias_stddev>0.0000008</bias_stddev>
            </noise>
          </x>
          <y>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>2e-4</stddev>
              <bias_mean>0.0000075</bias_mean>
              <bias_stddev>0.0000008</bias_stddev>
            </noise>
          </y>
          <z>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>2e-4</stddev>
              <bias_mean>0.0000075</bias_mean>
              <bias_stddev>0.0000008</bias_stddev>
            </noise>
          </z>
        </angular_velocity>
        <!-- 線性加速度 -->
        <linear_acceleration>
          <x>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>1.7e-2</stddev>
              <bias_mean>0.1</bias_mean>
              <bias_stddev>0.001</bias_stddev>
            </noise>
          </x>
          <y>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>1.7e-2</stddev>
              <bias_mean>0.1</bias_mean>
              <bias_stddev>0.001</bias_stddev>
            </noise>
          </y>
          <z>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>1.7e-2</stddev>
              <bias_mean>0.1</bias_mean>
              <bias_stddev>0.001</bias_stddev>
            </noise>
          </z>
        </linear_acceleration>
      </imu>
    </sensor>
  </gazebo>
  <!-- 差速驅(qū)動仿真插件 -->
  <gazebo>
    <plugin name='diff_drive' filename='libgazebo_ros_diff_drive.so'>
      <ros>
        <!-- 命名空間 -->
        <!-- <namespace>/demo</namespace> -->
      </ros>

      <!-- 左右輪子 -->
      <left_joint>left_wheel_joint</left_joint>
      <right_joint>right_wheel_joint</right_joint>

      <!-- 輪距 輪子直徑 -->
      <wheel_separation>${base_width+wheel_width}</wheel_separation>
      <!-- <wheel_separation>0.52</wheel_separation> -->
      <wheel_diameter>${wheel_radius*2}</wheel_diameter>
      <!-- <wheel_diameter>0.155</wheel_diameter> -->

      <!-- 最大扭矩 最大加速度 -->
      <max_wheel_torque>20</max_wheel_torque>
      <max_wheel_acceleration>1.0</max_wheel_acceleration>

      <!-- 輸出 -->
      <!-- 是否發(fā)布里程計 -->
      <publish_odom>true</publish_odom>
      <!-- 是否發(fā)布里程計的tf開關(guān) -->
      <publish_odom_tf>true</publish_odom_tf>
      <!-- 是否發(fā)布輪子的tf數(shù)據(jù)開關(guān) -->
      <publish_wheel_tf>true</publish_wheel_tf>

      <!-- 里程計的framed ID,最終體現(xiàn)在話題和TF上 -->
      <odometry_frame>odom</odometry_frame>
      <!-- 機(jī)器人的基礎(chǔ)frame的ID -->
      <robot_base_frame>base_link</robot_base_frame>
    </plugin>
  </gazebo>
  <!-- 雷達(dá) -->
  <link name="laser">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <cylinder radius="0.04" length="0.04"/>
      </geometry>
    </visual>
    <!-- 慣性屬性 -->
    <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="0.125"/>
      <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001" />
    </inertial>
    <!-- 碰撞區(qū)域 -->
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <cylinder radius="0.04" length="0.04"/>
      </geometry>
    </collision>
  </link>
  <!-- 雷達(dá)關(guān)節(jié) -->
  <joint name="laser_joint" type="fixed">
    <parent link="base_link"/>
    <child link="laser"/>
    <origin xyz="0.16 0 0.078" rpy="0 0 0"/>
  </joint>

  <gazebo reference="laser">
    <sensor name="laser" type="ray">
      <always_on>true</always_on>
      <visualize>false</visualize>
      <update_rate>5</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>360</samples>
            <resolution>1.000000</resolution>
            <min_angle>0.000000</min_angle>
            <max_angle>6.280000</max_angle>
          </horizontal>
        </scan>
        <range>
          <min>0.120000</min>
          <max>3.5</max>
          <resolution>0.015000</resolution>
        </range>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.01</stddev>
        </noise>
      </ray>
      <plugin name="scan" filename="libgazebo_ros_ray_sensor.so">
        <ros>
          <remapping>~/out:=scan</remapping>
        </ros>
        <output_type>sensor_msgs/LaserScan</output_type>
        <frame_name>laser</frame_name>
      </plugin>
    </sensor>
  </gazebo>
  <!-- 相機(jī) -->
  <link name="camera_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="0.015 0.130 0.022"/>
      </geometry>
    </visual>
    <!-- 碰撞區(qū)域 -->
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="0.015 0.130 0.022"/>
      </geometry>
    </collision>
    <!-- 慣性屬性 -->
    <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="0.035"/>
      <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001" />
    </inertial>
  </link>
  <!-- 相機(jī)關(guān)節(jié) -->
  <joint name="camera_joint" type="fixed">
    <parent link="base_link"/>
    <child link="camera_link"/>
    <origin xyz="0.16 0 0.11" rpy="0 0 0"/>
  </joint>
  <!-- 深度相機(jī) -->
  <link name="camera_depth_frame"/>

  <joint name="camera_depth_joint" type="fixed">
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <parent link="camera_link"/>
    <child link="camera_depth_frame"/>
  </joint>
  <!-- 相機(jī)仿真 -->
  <gazebo reference="camera_depth_link">
    <sensor name="depth_camera" type="depth">
      <visualize>true</visualize>
      <update_rate>30.0</update_rate>
      <camera name="camera">
        <horizontal_fov>1.047198</horizontal_fov>
        <image>
          <width>640</width>
          <height>480</height>
          <format>R8G8B8</format>
        </image>
        <clip>
          <near>0.05</near>
          <far>3</far>
        </clip>
      </camera>
      <plugin name="depth_camera_controller" filename="libgazebo_ros_camera.so">
        <baseline>0.2</baseline>
        <alwaysOn>true</alwaysOn>
        <updateRate>0.0</updateRate>
        <frame_name>camera_depth_frame</frame_name>
        <pointCloudCutoff>0.5</pointCloudCutoff>
        <pointCloudCutoffMax>3.0</pointCloudCutoffMax>
        <distortionK1>0</distortionK1>
        <distortionK2>0</distortionK2>
        <distortionK3>0</distortionK3>
        <distortionT1>0</distortionT1>
        <distortionT2>0</distortionT2>
        <CxPrime>0</CxPrime>
        <Cx>0</Cx>
        <Cy>0</Cy>
        <focalLength>0</focalLength>
        <hackBaseline>0</hackBaseline>
      </plugin>
    </sensor>
  </gazebo>

</robot>

xacro模型文件需要轉(zhuǎn)成urdf模型文件才能使用

方法1 提前轉(zhuǎn)換:

當(dāng)前文件夾打開終端輸入:base.urdf.xacro > base.urdf生成純urdf文件。

方法2 在運(yùn)行l(wèi)aunch文件的時候自動轉(zhuǎn),需要加入xacro解析步驟

package.xml文件內(nèi)在<test_depend>前加入:<exec_depend>xacro</exec_depend>

launch文件編寫:文章來源地址http://www.zghlxwxcb.cn/news/detail-654800.html

# 此launch文件是機(jī)器人仿真程序,包含 gazebo啟動,機(jī)器人仿真生成,機(jī)器人模型狀態(tài)發(fā)布
import os
from launch import LaunchDescription
from launch.actions import ExecuteProcess
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare
from launch.substitutions import LaunchConfiguration
import xacro

def generate_launch_description():
    robot_name_in_model = 'jtbot'         #機(jī)器人模型名字
    package_name = 'jtbot_description'    #模型包名

    ld = LaunchDescription()
    use_sim_time = LaunchConfiguration('use_sim_time', default='true')
    pkg_share = FindPackageShare(package=package_name).find(package_name) 
    gazebo_world_path = os.path.join(pkg_share, 'world/jt.world')        #世界仿真文件路徑
    default_rviz_config_path = os.path.join(pkg_share, 'rviz/mrviz2.rviz')  #rviz配置文件路徑
    urdf_xacro_file = os.path.join(pkg_share, 'urdf/jtbot_base.urdf.xacro') #xacro模型文件路徑
    #解析xacro模型文件
    doc = xacro.parse(open(urdf_xacro_file))
    xacro.process_doc(doc)
    params = {'robot_description': doc.toxml()}

    # 開啟ros Gazebo server
    start_gazebo_cmd = ExecuteProcess(
        cmd=['gazebo',
        '--verbose', 
        gazebo_world_path,
        '-s', 'libgazebo_ros_init.so',   
        '-s', 'libgazebo_ros_factory.so', 
         
         ],
        output='screen')

     # Start Robot State publisher
    start_robot_state_publisher_cmd = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        output='screen',
        
        parameters=[params,{'use_sim_time': use_sim_time}]
    )    

    # gazebo內(nèi)生成機(jī)器人
    spawn_entity_cmd = Node(
        package='gazebo_ros', 
        executable='spawn_entity.py',
        arguments=['-entity', robot_name_in_model,  '-topic', 'robot_description'], 
        output='screen'
      
        )
	
   

    # Launch RViz
    start_rviz_cmd = Node(
        package='rviz2',
        executable='rviz2',
        name='rviz2',
        output='screen',
        arguments=['-d', default_rviz_config_path]
        )

    ld.add_action(start_gazebo_cmd)
    ld.add_action(spawn_entity_cmd)
    ld.add_action(start_robot_state_publisher_cmd)
    ld.add_action(start_rviz_cmd)


    return ld

到了這里,關(guān)于xacro機(jī)器人模型文件轉(zhuǎn)urdf文件怎么編寫launch文件啟動gazebo仿真和在rviz2內(nèi)顯示模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 機(jī)器人仿真-gazebo學(xué)習(xí)筆記(4)xacro和傳感器添加

    機(jī)器人仿真-gazebo學(xué)習(xí)筆記(4)xacro和傳感器添加

    URDF文件不具備代碼復(fù)用的特性(在上一篇文章也能發(fā)現(xiàn),其實(shí)左右輪是極其相似的但還是要單獨(dú)描述),一個復(fù)雜的機(jī)器人模型會擁有大量了的傳感器和關(guān)節(jié)組件,這時候使用URDF文件就太難閱讀了。精簡化、可復(fù)用、模塊化的xacro文件來了。 1.優(yōu)勢: ·精簡模型代碼: xacro是一

    2024年02月06日
    瀏覽(101)
  • 【機(jī)器人模擬-01】使用URDF在中創(chuàng)建模擬移動機(jī)器人

    【機(jī)器人模擬-01】使用URDF在中創(chuàng)建模擬移動機(jī)器人

    ????????在本教程中,我將向您展示如何使用 通用機(jī)器人描述格式 (URDF)(機(jī)器人 建模的標(biāo)準(zhǔn) ROS 格式)創(chuàng)建模擬移動機(jī)器人。 ????????機(jī)器人專家喜歡在構(gòu)建機(jī)器人之前對其進(jìn)行模擬,以測試不同的算法。您可以想象,使用物理機(jī)器人犯錯的成本可能很高(例如,

    2024年02月16日
    瀏覽(92)
  • 統(tǒng)一機(jī)器人描述格式——URDF

    統(tǒng)一機(jī)器人描述格式——URDF

    URDF(Unified Robot Description Format,統(tǒng)一機(jī)器人描述格式)是ROS中一個非常重要的機(jī)器人模型描述格式,ROS同時也提供URDF文件的C++解析器,可以解析URDF文件中使用XML格式描述的機(jī)器人模型。 在使用URDF文件構(gòu)建機(jī)器人模型之前,有必要先梳理一下URDF文件中常用的XML標(biāo)簽,對URDF有

    2024年02月07日
    瀏覽(31)
  • URDF - 通用機(jī)器人描述格式 - XML 規(guī)范

    URDF - 通用機(jī)器人描述格式 - XML 規(guī)范

    ? 英文 中文 link 剛體 joint 關(guān)節(jié) frame 坐標(biāo)系 identity element 單位元(加法為 0) ? ? 機(jī)器人描述文件的根元素必須是 robot ,所有其他元素都必須封裝在其中。 ? name 主文件必須有 name 屬性。在包含文件中,name 屬性是可選的。如果在附加的包含文件中指定了屬性名稱,其值必須

    2024年02月03日
    瀏覽(19)
  • 【ROS】URDF:統(tǒng)一機(jī)器人描述格式(XML)

    統(tǒng)一機(jī)器人描述格式(URDF)是描述機(jī)器人模型的 XML 文件,支持Xacro(XML宏),使用Xacro來引用已經(jīng)存在的XML塊,創(chuàng)建更短且可讀的XML文件。 URDF描述文件為XML格式,如下示例,定義機(jī)器人的常量。

    2024年02月09日
    瀏覽(22)
  • ros2 基礎(chǔ)學(xué)習(xí) 15- URDF:機(jī)器人建模方法

    ros2 基礎(chǔ)學(xué)習(xí) 15- URDF:機(jī)器人建模方法

    ROS是機(jī)器人操作系統(tǒng),當(dāng)然要給機(jī)器人使用啦,不過在使用之前,還得讓ROS認(rèn)識下我們使用的機(jī)器人,如何把一個機(jī)器人介紹給ROS呢? 為此,ROS專門提供了一種機(jī)器人建模方法——URDF(Unified Robot Description Format,統(tǒng)一機(jī)器人描述格式),用來描述機(jī)器人外觀、性能等各方面屬

    2024年02月01日
    瀏覽(31)
  • 【ROS2機(jī)器人入門到實(shí)戰(zhàn)】使用gazebo加載URDF

    【ROS2機(jī)器人入門到實(shí)戰(zhàn)】使用gazebo加載URDF

    當(dāng)前平臺文章匯總地址:ROS2機(jī)器人從入門到實(shí)戰(zhàn) 獲取完整教程及配套資料代碼,請關(guān)注公眾號魚香ROS獲取 教程配套機(jī)器人開發(fā)平臺:兩驅(qū)版| 四驅(qū)版 為方便交流,搭建了機(jī)器人技術(shù)問答社區(qū):地址 fishros.org.cn 在第六章中小魚曾介紹過,gazebo是獨(dú)立于ROS/ROS2之外的仿真軟件,

    2024年02月05日
    瀏覽(141)
  • Javascript 編寫一個簡單的聊天機(jī)器人

    Javascript 編寫一個簡單的聊天機(jī)器人

    在本 Web 開發(fā)教程中,我們將了解如何使用 HTML、CSS 和 vanilla JavaScript 創(chuàng)建基本的聊天機(jī)器人。本練習(xí)側(cè)重于 JS 基礎(chǔ)知識,而不是任何類型的人工智能 (AI)。為了使該過程更簡單,更易于學(xué)習(xí),我沒有使用任何第三方庫。我將通過專注于JavaScript編程語言的基礎(chǔ)知識從頭開始

    2024年02月05日
    瀏覽(20)
  • 【ROS2機(jī)器人入門到實(shí)戰(zhàn)】使用RCLCPP編寫節(jié)點(diǎn)

    【ROS2機(jī)器人入門到實(shí)戰(zhàn)】使用RCLCPP編寫節(jié)點(diǎn)

    當(dāng)前平臺文章匯總地址:ROS2機(jī)器人從入門到實(shí)戰(zhàn) 獲取完整教程及配套資料代碼,請關(guān)注公眾號魚香ROS獲取 教程配套機(jī)器人開發(fā)平臺:兩驅(qū)版| 四驅(qū)版 為方便交流,搭建了機(jī)器人技術(shù)問答社區(qū):地址 fishros.org.cn 節(jié)點(diǎn)需要存在于功能包當(dāng)中、功能包需要存在于工作空間當(dāng)中。所

    2024年02月02日
    瀏覽(76)
  • python能做機(jī)器人嗎,python怎么做機(jī)器人

    python能做機(jī)器人嗎,python怎么做機(jī)器人

    這篇文章主要介紹了python中如何做一個連體機(jī)器人的代碼,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲,下面讓小編帶著大家一起了解一下。 近年來,人工智能(AI)的發(fā)展日新月異,而 聊天機(jī)器人 (Chatbot)則是AI領(lǐng)域的明星應(yīng)用之一

    2024年02月01日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包