当前位置:   article > 正文

用RVIZ2创建一个可视化的机器人_rviz完整机器人urdf文件

rviz完整机器人urdf文件

要在 RViz2 中创建一个可视化的机器人,首先需要有一个机器人的 URDF (Unified Robot Description Format) 文件。URDF 文件描述了机器人的物理组成和关节等动态特性。接下来,就可以使用 RViz2 来加载和查看这个模型。

一. urdf简介与转换

在 ROS(Robot Operating System)的环境中,URDF(Unified Robot Description Format)是用于描述机器人模型的 XML 格式。虽然手动编写 URDF 文件是一种常见的做法,但也存在一些可视化工具可以帮助简化和加速这一过程。以下是一些可用的工具,它们可以在创建和编辑 URDF 文件时提供图形界面或可视化支持:

1. SolidWorks to URDF Exporter

描述:这是一个 SolidWorks 插件,允许用户直接从 SolidWorks CAD 软件中导出 URDF 文件。这个工具特别适合那些已经使用 SolidWorks 设计机器人的用户。
链接:SolidWorks to URDF Exporter on GitHub

2. Fusion 360 to URDF Exporter

描述:Autodesk Fusion 360 用户可以利用这个插件将他们的 CAD 模型转换成 URDF 格式。这提供了从流行的 CAD 软件到 ROS 的无缝过渡。
链接:Fusion 360 to URDF Exporter

3. SW2URDF (SolidWorks to URDF Exporter)

描述:这是 SolidWorks 的另一个插件,用于将 SolidWorks 模型转换为 URDF。它支持导出复杂的装配体,并包括联动和其他动态特性。
链接:通常可以在 SolidWorks 插件市场或 ROS 社区资源中找到。

4. Phobos

描述:Phobos 是一个 Blender 插件,使用户能够在 Blender 内编辑和导出 URDF 文件。这不仅可以创建静态模型,还可以定义动态属性和机器人的运动学。
链接:Phobos on GitHub

5. URDF for Blender

描述:这是另一个 Blender 插件,专注于改进 Blender 制作的模型到 URDF 格式的转换过程。它适用于希望在图形界面中操作并直观看到结果的用户。
链接:URDF for Blender

二. 创建包及文件

1.创建包

ros2 pkg create rviz2_4_udf_package --build-type ament_python
  • 1

这个包可以在某个文件夹的src文件夹下。
packagename:rviz2_4_udf_package
编译方式:ament_python

2. 建立urdf文件夹及文件、建立launch文件夹及文件

cd rviz2_4_udf_package/
mkdir urdf
cd urdf
touch virtural_botbase.urdf
cd ..
mkdir launch
cd launch
touch display_rviz2.launch.py
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

现在的文件夹结构如下:

├── launch
    └── display_rviz2.launch.py
├── package.xml
├── resource
    └── rviz2_4_udf_package
├── rviz2_4_udf_package
    └── __init__.py
├── setup.cfg
├── setup.py
├── test
    ├── test_copyright.py
    ├── test_flake8.py
    └── test_pep257.py
└── urdf
    └── virtural_botbase.urdf

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

3.打开编辑urdf文件

参考 fishros 8.2 RVIZ2可视化移动机器人模型中的模型构建
以下代码为构建一个4轮麦克纳姆轮的正方形底盘

<?xml version="1.0"?>
<robot name="mecanum_robot">

  <!-- Base Link -->
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.5 0.5 0.1"/> <!-- Length, Width, Height -->
      </geometry>
      <material name="blue">
        <color rgba="0 0 1 1"/> <!-- RGBA Colors -->
      </material>
    </visual>
    <collision>
      <geometry>
        <box size="0.5 0.5 0.1"/>
      </geometry>
    </collision>
  </link>

  <!-- Mecanum Wheels -->
  <!-- Wheel Front Left -->
  <link name="wheel_front_left">
    <visual>
      <geometry>
        <cylinder length="0.1" radius="0.05"/> <!-- Height and radius of the wheel -->
      </geometry>
      <material name="black"/>
    </visual>
    <collision>
      <geometry>
        <cylinder length="0.1" radius="0.05"/>
      </geometry>
    </collision>
  </link>

  <!-- Joint connecting front left wheel to base -->
  <joint name="joint_front_left" type="continuous">
    <parent link="base_link"/>
    <child link="wheel_front_left"/>
    <origin xyz="0.25 0.25 0" rpy="0 0 0"/> <!-- Position of the wheel -->
    <axis xyz="0 0 1"/> <!-- Rotation axis -->
  </joint>

  <!-- Similar definitions for other three wheels -->
  <link name="wheel_front_right">
    <visual>
      <geometry>
        <cylinder length="0.1" radius="0.05"/>
      </geometry>
      <material name="black"/>
    </visual>
    <collision>
      <geometry>
        <cylinder length="0.1" radius="0.05"/>
      </geometry>
    </collision>
  </link>

  <joint name="joint_front_right" type="continuous">
    <parent link="base_link"/>
    <child link="wheel_front_right"/>
    <origin xyz="0.25 -0.25 0" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
  </joint>

  <!-- Rear Left -->
  <link name="wheel_rear_left">
    <visual>
      <geometry>
        <cylinder length="0.1" radius="0.05"/>
      </geometry>
      <material name="black"/>
    </visual>
    <collision>
      <geometry>
        <cylinder length="0.1" radius="0.05"/>
      </geometry>
    </collision>
  </link>

  <joint name="joint_rear_left" type="continuous">
    <parent link="base_link"/>
    <child link="wheel_rear_left"/>
    <origin xyz="-0.25 0.25 0" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
  </joint>

  <!-- Rear Right -->
  <link name="wheel_rear_right">
    <visual>
      <geometry>
        <cylinder length="0.1" radius="0.05"/>
      </geometry>
      <material name="black"/>
    </visual>
    <collision>
      <geometry>
        <cylinder length="0.1" radius="0.05"/>
      </geometry>
    </collision>
  </link>

  <joint name="joint_rear_right" type="continuous">
    <parent link="base_link"/>
    <child link="wheel_rear_right"/>
    <origin xyz="-0.25 -0.25 0" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
  </joint>

</robot>


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113

**基本结构:**机器人包括一个基本的 base_link 和四个 wheel_ 链接。
**视觉和碰撞元素:**每个链接都有视觉和碰撞属性定义。视觉属性定义了该部件的外观,碰撞属性定义了物理交互时的形状。
**关节:**每个轮子通过一个类型为 continuous 的关节与底盘相连。这允许轮子围绕其安装点无限旋转。

4.编辑launch文件


import os
from launch import LaunchDescription
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare


def generate_launch_description():
    package_name = 'rviz2_4_udf_package'
    urdf_name = "virtural_botbase.urdf"

    ld = LaunchDescription()
    pkg_share = FindPackageShare(package=package_name).find(package_name) 
    urdf_model_path = os.path.join(pkg_share, f'urdf/{urdf_name}')

    robot_state_publisher_node = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        arguments=[urdf_model_path]
        )

    joint_state_publisher_node = Node(
        package='joint_state_publisher_gui',
        executable='joint_state_publisher_gui',
        name='joint_state_publisher_gui',
        arguments=[urdf_model_path]
        )

    rviz2_node = Node(
        package='rviz2',
        executable='rviz2',
        name='rviz2',
        output='screen',
        )

    ld.add_action(robot_state_publisher_node)
    ld.add_action(joint_state_publisher_node)
    ld.add_action(rviz2_node)

    return ld

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

5. 编辑setup.py

导入库

from glob import glob 
import os
  • 1
  • 2

设置包名称

package_name = 'rviz2_4_udf_package'
  • 1

添加launch和urdf

(os.path.join('share', package_name, 'launch'), glob('launch/*.launch.py')),
        (os.path.join('share', package_name, 'urdf'), glob('urdf/**')),
        
  • 1
  • 2
  • 3

完整代码

from setuptools import find_packages, setup
from glob import glob 
import os

package_name = 'rviz2_4_udf_package'

setup(
    name=package_name,
    version='0.0.0',
    packages=find_packages(exclude=['test']),
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
       	(os.path.join('share', package_name, 'launch'), glob('launch/*.launch.py')),
        (os.path.join('share', package_name, 'urdf'), glob('urdf/**')),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='harebert',
    maintainer_email='harebert@todo.todo',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
        ],
    },
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

三. 编译及运行

1.编译

回到src以上层级文件夹,编译

colcon build
source install/setup.bash
  • 1
  • 2

2.安装缺失库

以下命令是在基于 Ubuntu 的系统中安装 ROS 的 joint-state-publisher-gui 和 robot-state-publisher 包。这些是 ROS 组件,用于发布机器人关节状态,并提供一个 GUI(图形用户界面)来手动操作这些关节状态,非常有用于调试和可视化机器人模型的运动。

sudo apt install ros-$ROS_DISTRO-joint-state-publisher-gui ros-$ROS_DISTRO-robot-state-publisher

  • 1
  • 2

在安装完毕后,可以使用如下命令来检查是否安装成功:

apt list --installed | grep ros-$ROS_DISTRO-joint-state-publisher-gui
apt list --installed | grep ros-$ROS_DISTRO-robot-state-publisher

  • 1
  • 2
  • 3

3.运行

ros2 launch rviz2_4_udf_package display_rviz2.launch.py
  • 1

在这里插入图片描述

打开add按钮,添加RobotModel,然后选择当前的机器人
在这里插入图片描述
在RobotModel的DescriptionTopic中选择当前机器人
在这里插入图片描述
在GlobalOption的FixFrame中选择base_link
在这里插入图片描述

最终呈现的效果如下

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/623641
推荐阅读
相关标签
  

闽ICP备14008679号