在rviz2中显示urdf模型

1.建立工作空间

cd /home/fishbot_ws/src
ros2 pkg create fishbot_description --build-type ament_python

2.创建并编写URDF文件

cd /home/fishbot_ws/src/fishbot_description
mkdir urdf
cd urdf
touch fishbot_base.urdf

完成后的src中的文件结构

├── fishbot_description
│   ├── __init__.py
├── package.xml
├── setup.cfg
├── setup.py
└── urdf
    └── fishbot_base.urdf

编辑fishbot_base.urdf

<?xml version="1.0"?>
<robot name="fishbot">
    
  <!-- base link -->
  <link name="base_link">
      <visual>
      <origin xyz="0 0 0.0" rpy="0 0 0"/>
      <geometry>
        <cylinder length="0.12" radius="0.10"/>
      </geometry>
    </visual>
  </link>
    
  <!-- laser link -->
  <link name="laser_link">
      <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <cylinder length="0.02" radius="0.02"/>
      </geometry>
      <material name="black">
          <color rgba="0.0 0.0 0.0 0.8" /> 
      </material>
    </visual>
  </link>
    
  <!-- laser joint -->
    <joint name="laser_joint" type="fixed">
        <parent link="base_link" />
        <child link="laser_link" />
        <origin xyz="0 0 0.075" />
    </joint>

</robot>

3.创建并编写launch文件

cd /home/fishbot_ws/src/fishbot_description
mkdir launch
cd launch
touch display_rviz2.launch.py

完成后的目录结构

├── fishbot_description
│   ├── __init__.py
├── launch
│   └── display_rviz2.launch.py
├── package.xml
├── setup.cfg
├── setup.py
└── urdf
    └── fishbot_base.urdf

编辑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 = 'fishbot_description'
    urdf_name = "fishbot_base.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

  • generate_launch_description() 函数是入口点,用于生成 LaunchDescription 对象,描述了启动的节点及其参数。
  • FindPackageShare 类用于查找指定包的共享目录,以便获取该包中的资源文件。在这里,它用于获取机器人描述包(fishbot_description)的共享目录路径。
    - LaunchDescription 对象用于存储要启动的节点及其参数。

其中涉及三个节点:

  • joint_state_publisher_gui 负责发布机器人关节数据信息,通过joint_states话题发布
  • robot_state_publisher_node负责发布机器人模型信息robot_description,并将joint_states数据转换tf信息发布
  • rviz2_node负责显示机器人的信息

最终,通过调用 ld.add_action() 将这些节点添加到 LaunchDescription 对象中,并将其返回,以便由 ROS 2 的启动系统加载并执行。

joint_state_publisher_gui,还有一个兄弟叫做joint_state_publisher
两者区别在于joint_state_publisher_gui运行起来会跳出一个界面,通过界面可以操作URDF中能动的关节

4.修改setup.py

from glob import glob
import os

完整setup.py

from setuptools import setup
from glob import glob
import os

package_name = 'fishbot_description'

setup(
    name=package_name,
    version='0.0.0',
    packages=[package_name],
    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='root',
    maintainer_email='root@todo.todo',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
        ],
    },
)

5.编译测试

回到工作空间(fishbot_ws),编译

cd /home/fishbot_ws
colcon build

运行测试

source install/setup.bash
ros2 launch fishbot_description display_rviz2.launch.py
ROS中加载并显示URDF模型,主要涉及以下几个步骤:创建工作空间、编写URDF文件、配置发布机器人状态的节点以及启动RVIZ进行可视化。以下是具体的操作流程和相关说明。 ### 1. 创建工作空间和功能包 首先需要创建一个ROS2的工作空间,并在其中创建一个用于存放URDF模型的功能包。例如: ```bash cd /home/fishbot_ws/src ros2 pkg create fishbot_description --build-type ament_python ``` 此命令将创建一个名为`fishbot_description`的功能包,专门用于描述机器人的模型信息 [^2]。 ### 2. 编写URDF文件 接下来,在功能包中创建一个`urdf`目录,并在该目录下创建一个`.urdf`文件,例如`fishbot_base.urdf`: ```bash cd /home/fishbot_ws/src/fishbot_description mkdir urdf cd urdf touch fishbot_base.urdf ``` 然后,使用文本编辑器打开该文件,编写机器人的URDF描述。以下是一个简单的示例: ```xml <robot name="fishbot"> <link name="base_link"> <visual> <geometry> <box size="0.5 0.5 0.1"/> </geometry> <origin rpy="0 0 0" xyz="0 0 0.05"/> <material name="blue"> <color rgba="0 0 1 1"/> </material> </visual> </link> </robot> ``` 此代码定义了一个简单的立方体作为机器人的基座链接 [^2]。 ### 3. 配置机器人状态发布节点 为了在ROS系统中发布机器人的状态信息(如关节角度、位置等),需要运行`robot_state_publisher`节点。可以在功能包中创建一个启动文件来启动该节点。例如,在`launch`目录下创建一个名为`display.launch.py`的文件: ```python from launch import LaunchDescription from launch_ros.actions import Node from launch.substitutions import Command from ament_index_python.packages import get_package_share_directory def generate_launch_description(): package_dir = get_package_share_directory('fishbot_description') urdf = package_dir + '/urdf/fishbot_base.urdf' return LaunchDescription([ Node( package='robot_state_publisher', executable='robot_state_publisher', arguments=[urdf] ), Node( package='rviz2', executable='rviz2', name='rviz2', output='screen' ) ]) ``` 此脚本将启动`robot_state_publisher`节点,并直接启动`rviz2` [^1]。 ### 4. 启动RVIZ并加载URDF模型 完成上述配置后,可以运行以下命令启动整个流程: ```bash cd /home/fishbot_ws colcon build source install/setup.bash ros2 launch fishbot_description display.launch.py ``` 执行完以上命令后,`robot_state_publisher`节点会解析URDF文件并将机器人的状态信息发布到ROS系统中,同时`rviz2`会启动并加载这些信息以显示模型 。 ### 5. 在RVIZ中查看URDF模型 启动`rviz2`后,需要手动添加机器人模型显示组件: - 点击“Add”按钮。 - 选择“RobotModel”类型。 - 确认TF和机器人模型的主题设置正确(默认为`/tf`和`/robot_description`)。 完成这些操作后,应该能够在RVIZ中看到加载的URDF模型 。 ### 常见问题及解决方法 如果遇到类似以下错误: ``` Error retrieving file [file:///home/jtl/rviz_demo/install/dualrobot/share/dualrobot/meshes/leftarm_link6.STL]: Couldn't open file /home/jtl/rviz_demo/install/dualrobot/share/dualrobot/meshes/leftarm_link6.STL ``` 这通常是因为URDF文件中引用的网格文件路径不正确。请确保所有外部资源(如STL文件)的路径正确,并且文件确实存在于指定位置 [^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值