【Nav2】ROS2 Eloquent中使用robot_state_publisher发布松灵Scout mini的urdf

【背景】

本来打算把ROS1版本的松灵Scout mini 模型描述文件直接移植到ROS2的工作空间里去,用robot_state_publisher加载出来,结果行不通;于是找到了ROS2版本的Scout mini 模型描述,结果因为我用的是 Eloquent 版本,而他这urdf是基于Humble版本写的,用了一个 Launch.Command模块,而这个模块没找到办法安装,所以最后只有自己亲手改写了。

【效果一览】

 

 【系统环境】

Ubuntu18.04

ROS Eloquent

 【实现步骤】

话不多说,直接上干货,我这里不再解释为什么要这么迂回去实现这个!!!

1、首先去这个目录下建一个文件夹(如果没有这个目录,说明你没安装Turtlebot3仿真)

cd /opt/ros/eloquent/share/turtlebot3_description
sudo mkdir scout

2、然后把Scout mini官方的模型描述文件夹中的 meshes 文件夹拷进去

sudo cp -r ./meshes /opt/ros/eloquent/share/turtlebot3_description/scout

3、新建一个 scout_v2.urdf 描述文件,内容如下

<?xml version="1.0" ?>
<!-- =================================================================================== -->
<!-- |    This document was autogenerated by xacro from scout_description/urdf/scout_v2_webots.xacro | -->
<!-- |    EDITING THIS FILE BY HAND IS NOT RECOMMENDED                                 | -->
<!-- =================================================================================== -->
<robot name="scout_v2" xmlns:xacro="http://ros.org/wiki/xacro">

  <link name="base_footprint"/>

  <joint name="base_joint" type="fixed">
    <parent link="base_footprint"/>
    <child link="base_link" />
    <origin xyz="0 0 0.010" rpy="0 0 0"/>
  </joint>
  
  <!-- Base link -->
  <link name="base_link">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://turtlebot3_description/scout/meshes/base_link.dae"/>
      </geometry>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.008"/>
      <geometry>
        <box size="0.925 0.38 0.21"/>
      </geometry>
    </collision>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.035"/>
      <geometry>
        <box size="0.154166666667 0.627 0.07"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="40"/>
      <origin xyz="0.0 0.0 0.0"/>
      <inertia ixx="2.288641" ixy="0" ixz="0" iyy="5.103976" iyz="0" izz="3.431465"/>
    </inertial>
  </link>

  <link name="front_right_wheel_link">
    <inertial>
      <mass value="3"/>
      <origin xyz="0 0 0"/>
      <inertia ixx="0.7171" ixy="0" ixz="0" iyy="0.1361" iyz="0" izz="0.7171"/>
    </inertial>
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://turtlebot3_description/scout/meshes/wheel_type1.dae"/>
      </geometry>
    </visual>
    <collision>
      <origin rpy="1.570795 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.11653" radius="0.16459"/>
      </geometry>
    </collision>
  </link>

  <joint name="front_right_wheel" type="fixed">
    <parent link="base_link"/>
    <child link="front_right_wheel_link"/>
    <origin rpy="3.14 0 0" xyz="0.249 -0.29153 -0.0702"/>
    <axis rpy="0 0 0" xyz="0 -1 0"/>
  </joint>

  <link name="front_left_wheel_link">
    <inertial>
      <mass value="3"/>
      <origin xyz="0 0 0"/>
      <inertia ixx="0.7171" ixy="0" ixz="0" iyy="0.1361" iyz="0" izz="0.7171"/>
    </inertial>
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://turtlebot3_description/scout/meshes/wheel_type2.dae"/>
      </geometry>
    </visual>
    <collision>
      <origin rpy="1.570795 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.11653" radius="0.16459"/>
      </geometry>
    </collision>
  </link>

  <joint name="front_left_wheel" type="fixed">
    <parent link="base_link"/>
    <child link="front_left_wheel_link"/>
    <origin rpy="0 0 0" xyz="0.249 0.29153 -0.0702"/>
    <axis rpy="0 0 0" xyz="0 -1 0"/>
  </joint>

  <link name="rear_left_wheel_link">
    <inertial>
      <mass value="3"/>
      <origin xyz="0 0 0"/>
      <inertia ixx="0.7171" ixy="0" ixz="0" iyy="0.1361" iyz="0" izz="0.7171"/>
    </inertial>
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://turtlebot3_description/scout/meshes/wheel_type2.dae"/>
      </geometry>
    </visual>
    <collision>
      <origin rpy="1.570795 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.11653" radius="0.16459"/>
      </geometry>
    </collision>
  </link>

  <joint name="rear_left_wheel" type="fixed">
    <parent link="base_link"/>
    <child link="rear_left_wheel_link"/>
    <origin rpy="0 0 0" xyz="-0.249 0.29153 -0.0702"/>
    <axis rpy="0 0 0" xyz="0 -1 0"/>
  </joint>

  <link name="rear_right_wheel_link">
    <inertial>
      <mass value="3"/>
      <origin xyz="0 0 0"/>
      <inertia ixx="0.7171" ixy="0" ixz="0" iyy="0.1361" iyz="0" izz="0.7171"/>
    </inertial>
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://turtlebot3_description/scout/meshes/wheel_type1.dae"/>
      </geometry>
    </visual>
    <collision>
      <origin rpy="1.570795 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.11653" radius="0.16459"/>
      </geometry>
    </collision>
  </link>

  <joint name="rear_right_wheel" type="fixed">
    <parent link="base_link"/>
    <child link="rear_right_wheel_link"/>
    <origin rpy="3.14 0 0" xyz="-0.249 -0.29153 -0.0702"/>
    <axis rpy="0 0 0" xyz="0 -1 0"/>
  </joint>

  <!-- Robosense16 -->
  <link name="laser">
    <visual>
      <origin xyz="0.0 0.0 0.0" />
      <geometry>
        <cylinder length="0.10" radius="0.03" />
      </geometry>
      <material name="orange" />
    </visual>
  </link>

  <!-- IMU -->
  <link name="imu">
    <visual>
      <origin xyz="0.0 0.0 0.0" />
      <geometry>
        <box size="0.06 0.04 0.02" />
      </geometry>
      <material name="orange" />
    </visual>
  </link>

  <!--<link name="base_link" />-->

  <joint name="laser_joint" type="fixed">
    <parent link="base_link" />
    <child link="laser" />
    <origin xyz="0.1 0.0 0.5" rpy="0 0 0" />
  </joint>

  <joint name="imu_joint" type="fixed">
    <parent link="base_link" />
    <child link="imu" />
    <origin xyz="0 0 0" rpy="0 0 0" />
  </joint>

</robot>

4、把这个描述文件拷到下面这个目录

sudo cp ./scout_v2.urdf /opt/ros/eloquent/share/turtlebot3_description/urdf

5、然后在你的 launch 文件中这样写

    urdf = os.path.join(
            get_package_share_directory('turtlebot3_description'), 'urdf', 'scout_v2.urdf')

    start_robot_state_publisher_cmd = Node(
        condition=IfCondition(use_robot_state_pub),
        package='robot_state_publisher',
        node_executable='robot_state_publisher',
        node_name='robot_state_publisher',
        output='screen',
        parameters=[{'use_sim_time': use_sim_time}],
        use_remappings=IfCondition(use_remappings),
        remappings=remappings,
        arguments=[urdf])

6、成功在 RViz 中看到 Scout mini完整模型

【后言】

点个关注,不迷路!!!

猜你喜欢

转载自blog.csdn.net/weixin_39538031/article/details/130266044
今日推荐