问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Ubuntu 20.04使用RViz可视化查看URDF机器人模型

创作时间:
作者:
@小白创作中心

Ubuntu 20.04使用RViz可视化查看URDF机器人模型

引用
CSDN
1.
https://blog.csdn.net/2301_80758686/article/details/144662042

介绍

RViz:

  • RViz 是 ROS(机器人操作系统)中的可视化工具。它就像是一个 “机器人世界的窗口”,让你能够看到机器人内部的数据和状态。在 ROS 的生态系统里,机器人的各个部分(如传感器、执行器等)通过节点(Node)来发送和接收信息。RViz 通过订阅这些节点发布的话题(Topic)来获取数据,然后将其以直观的图形化方式展示出来。

  • 例如,当机器人的激光雷达扫描周围环境后,会将扫描数据发布到一个特定的话题上。RViz 可以订阅这个话题,把激光雷达数据以点云(Point Cloud)的形式显示出来,你就能看到机器人周围物体的大致轮廓,就像你在透过机器人的 “眼睛” 观察世界一样。

URDF文件:

  • URDF(Unified Robot Description Format)即统一机器人描述格式,是一种用于描述机器人模型的 XML 文件格式。它是 ROS(机器人操作系统)中非常重要的一部分,其目的是提供一种标准化的方式来描述机器人的物理结构,包括机器人的连杆(links)、关节(joints)、视觉外观和惯性特性等诸多方面。

  • URDF 文件可以被 RViz(ROS 可视化工具)读取并可视化展示。当你在 RViz 中加载一个 URDF 文件时,它会根据文件中的描述构建出机器人的 3D 模型。这样,你可以从不同的角度直观地查看机器人的外观结构,检查关节的连接是否正确以及连杆的形状是否符合预期。

一、安装必要的软件包

一般来说,之前正常安装了ros对应的版本以下步骤都做过了,可以跳过第一步,多来一遍流程也无妨

1、ROS(机器人操作系统)安装

首先确保已经安装了 ROS Noetic(因为 Ubuntu 20.04 对应的 ROS 版本是 Noetic)。如果没有安装,可以按照以下步骤进行安装:

  • 设置软件源:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros - latest.list'  
  • 添加密钥:

sudo apt - key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv - key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654  
  • 更新软件包列表:

sudo apt update  
  • 安装ROS Noetic桌面完整版(包含rviz等工具):

sudo apt install ros - noetic - desktop - full  
  • 初始化rosdep:rosdep 是一个用于安装 ROS 软件包的依赖项工具。

sudo rosdep init
rosdep update  
  • 设置环境变量:

将以下内容添加到
.bashrc
文件中(这样每次打开终端时都会自动设置环境变量):


echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc  

然后在当前终端中使环境变量生效:


source ~/.bashrc  

二、创建工作空间(如果没有的话)

1、打开终端

  • 创建一个新的工作空间目录(如果已经有工作空间可以跳过这一步)。例如,创建一个名为
    catkin_ws
    的工作空间:

运行以下命令:


mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src  
  • 初始化工作空间:

cd ~/catkin_ws/src
catkin_init_workspace  


src
目录下,运行
catkin_init_workspace
命令。这会在
src
目录下创建
CMakeLists.txt
文件,它是构建 ROS 软件包的关键文件。

  • 编译工作空间

回到工作空间根目录(
catkin_ws
)并进行编译:


cd..
catkin_make  
  • 设置工作空间环境变量(添加到
    .bashrc
    文件)

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc  

2、将 URDF 文件放入工作空间

  • 把 URDF 文件复制到
    ~/catkin_ws/src
    目录下(你也可以根据实际情况放在工作空间的其他合适位置)。假设URDF 文件名为tinker_urdf.urdf。

  • 创建 ROS 软件包(如果还没有相关软件包)


src
目录下,创建一个新的 ROS 软件包(如果已经有用于存放 URDF 模型的软件包可以跳过这一步)。运行以下命令:

例如,创建一个名为tinker_robot_description的软件包(这里以tinker机器人为例,github连接在文末)


catkin_create_pkg tinker_robot_description urdf xacro  

注意:这里
urdf

xacro
是软件包的依赖项,
urdf
用于处理 URDF 文件格式,
xacro
是一种用于简化 URDF 文件编写的工具。如果你的 URDF 文件是纯 URDF 格式,
xacro
依赖可以根据实际情况省略。


tinker_urdf.urdf
文件复制或移动到新创建的包目录下的
urdf
文件夹中(即
~/catkin_ws/src/tinker_robot_description/urdf
路径下)。

3、检查 URDF 文件语法

在终端中,确保已经在 ROS 环境下(已经执行过
source /opt/ros/noetic/setup.bash
),并且位于包含
tinker_urdf.urdf
文件的目录(即
~/catkin_ws/src/tinker_robot_description/urdf
)中,然后运行:


check_urdf tinker_urdf.urdf  

如果语法正确,它会输出机器人模型的结构信息,例如各个连杆(link)、关节(joint)等相关信息;如果有错误,会显示相应的错误提示,你需要根据提示对
tinker_urdf.urdf
文件进行修改,直到通过语法检查。

三、创建启动文件(launch file)

1、创建launch文件夹:


tinker_robot_description
包的根目录下创建一个
launch
文件夹


cd ~/catkin_ws/src/tinker_robot_description
mkdir launch  

2、创建launch文件:

进入
launch
文件夹,使用文本编辑器(如
gedit
)创建一个名为
display.launch
的文件,并添加以下内容


<launch>
  <!-- 加载 URDF 文件到 ROS 参数服务器 -->
  <param name="robot_description" command="cat /home/user(用户名)/catkin_ws/src/tinker_robot_description/urdf/tinker_urdf.urdf" />
  <!-- 启动 robot_state_publisher -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen">
    <param name="robot_description" command="cat /home/user(用户名)/catkin_ws/src/tinker_robot_description/urdf/tinker_urdf.urdf" />
  </node>
  <!-- 启动 RViz -->
  <node name="rviz" pkg="rviz" type="rviz" output="screen" />
</launch>

这个启动文件的作用是:

  • 通过

    标签设置机器人描述参数( robot_description ),它会读取指定的 URDF 文件内容。
  • 启动
    joint_state_publisher
    节点,用于发布机器人关节状态,这样在 rviz 中可以通过界面操作来改变关节角度等参数。

  • 启动
    robot_state_publisher
    节点,用于根据机器人的关节状态发布机器人的整体状态信息,确保 rviz 能正确获取模型的位姿等信息。

  • 启动
    rviz
    节点,并指定一个配置文件(
    urdf.rviz
    )路径,首次使用时如果这个配置文件不存在,后续可以在 rviz 中进行配置并保存下来方便后续使用。

四、启动相关节点并在 rviz 中查看模型

1、启动 ROS 核心

打开一个新的终端,输入命令:


roscore  

2、编译工作空间(如果有修改或者是首次使用该包)

在另一个终端中,进入工作空间的根目录(
catkin_ws
),执行编译命令:


cd ~/catkin_ws
catkin_make  

3、**启动

joint_state_publisher

robot_state_publisher
节点,同时打开 rviz 并加载模型**:

执行以下命令(确保
display.launch
文件中参数传递格式正确):


roslaunch tinker_robot_description display.launch model:=$(rospack find tinker_robot_description)/urdf/tinker_urdf.urdf  

这时候 rviz 窗口会自动打开,在左侧的 “Displays” 面板中,确保 “RobotModel” 选项被勾选。这样就可以在 3D 视图区域看到
tinker_urdf
机器人模型的可视化效果了。可以通过拖动滑块(如果
joint_state_publisher
提供了可调节的关节滑块)来改变机器人的关节状态,观察模型的运动情况。、

报错问题排查

1、情况1

运行后会发现报错,具体内容为
Could not load resource [../meshes/base_link.STL]: Unable to open file "../meshes/base_link.STL".

说明在 URDF 文件中指定的用于表示机器人各个连杆可视化和碰撞几何形状的
.STL
格式的网格文件无法被正确加载,很可能是文件路径设置不正确或者对应的
.STL
文件确实不存在于指定的路径下。

我们要回到下载的tinker模型包中,找到mesh文件夹
复制内容到自己创建的
tinker_robot_description包中(和launch同级目录)

并且确保 URDF 文件里

标签中
filename
属性指定的路径是正确的。例如在

标签内有这样的定义:

<visual>
    <geometry>
        <mesh filename="../meshes/base_link.STL" />
    </geometry>
</visual>

这里的
../meshes/
路径表示相对于 URDF 文件所在目录的上级目录下的
meshes
文件夹。你需要确认实际的
.STL
文件是否就在这个相对路径所指向的位置。如果路径不对,可以修改为正确的相对路径或者绝对路径(例如使用绝对路径
/home/user(根据自己名字修改)/catkin_ws/src/tinker_robot_description/meshes/base_link.STL
这种形式,要根据实际文件存放位置来写)。

这个时候再去运行


roslaunch tinker_robot_description display.launch model:=$(rospack find tinker_robot_description)/urdf/tinker_urdf.urdf  

2、情况2

有可能出现以下情况

模型全白,左侧有报错

这是因为通常意味着在导入的机器人系统里,找不到从
base_link
这个连杆到
map
坐标系的坐标变换关系,其他关节连接处也有类似情况

例如:

报错内容No transform from [link_l_roll] to [map]

表明在 TF 树中没有从
map

link_l_roll
的变换。问题可能出在以下几点:

  • URDF 文件中未正确连接
    link_l_roll
    到机器人模型的根链接(
    base_link

  • 缺乏
    map

    base_link
    的静态变换

  • **
    robot_state_publisher
    没有正常发布 TF**。

需要去做相应排查

我经过排查发现是相关的静态变换未发布,有两个解决方案

1、添加静态变换

终端运行以下命令临时发布静态变换:


rosrun tf static_transform_publisher 0 0 0 0 0 0 map base_link 10  

2、修改.launch文件

在启动文件中添加静态变换节点:

因此将launch文件修改为如下内容


<launch>
  <!-- 加载 URDF 文件到 ROS 参数服务器 -->
  <param name="robot_description" command="cat /home/user(用户名)/catkin_ws/src/tinker_robot_description/urdf/tinker_urdf.urdf" />
  <!-- 发布 map 到 base_link 的静态变换 -->
<node pkg="tf" type="static_transform_publisher" name="map_to_base" args="0 0 0 0 0 0 map base_link 10" />
<node pkg="tf" type="static_transform_publisher" name="base_to_l_ankle" args="0 0 0 0 0 0 base_link link_l_ankle 10" />
<node pkg="tf" type="static_transform_publisher" name="l_ankle_to_l_knee" args="0 0 0 0 0 0 link_l_ankle link_l_knee 10" />
<node pkg="tf" type="static_transform_publisher" name="l_knee_to_l_pitch" args="0 0 0 0 0 0 link_l_knee link_l_pitch 10" />
<node pkg="tf" type="static_transform_publisher" name="l_pitch_to_r_pitch" args="0 0 0 0 0 0 link_l_pitch link_r_pitch 10" />
<node pkg="tf" type="static_transform_publisher" name="base_to_l_yaw" args="0 0 0 0 0 0 base_link link_l_yaw 10" />
<node pkg="tf" type="static_transform_publisher" name="map_to_link_l_roll" args="0 0 0 0 0 0 map link_l_roll 10" />
<node pkg="tf" type="static_transform_publisher" name="map_to_link_r_ankle" args="0 0 0 0 0 0 map link_r_ankle 10" />
<node pkg="tf" type="static_transform_publisher" name="map_to_link_r_knee" args="0 0 0 0 0 0 map link_r_knee 10" />
<node pkg="tf" type="static_transform_publisher" name="map_to_link_r_roll" args="0 0 0 0 0 0 map link_r_roll 10" />
<node pkg="tf" type="static_transform_publisher" name="map_to_link_r_yaw" args="0 0 0 0 0 0 map link_r_yaw 10" />
  <!-- 启动 robot_state_publisher -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen">
    <param name="robot_description" command="cat /home/user(用户名)/catkin_ws/src/tinker_robot_description/urdf/tinker_urdf.urdf" />
  </node>
  <!-- 启动 RViz -->
  <node name="rviz" pkg="rviz" type="rviz" output="screen" />
</launch>

保存重新执行roslaunch

加载成功

近期在使用ros进行模拟仿真,使用rviz查看urdf机器人模型,以上是学习笔记,欢迎探讨交流

附tinker机器人urdf文件github链接:Tinker/development at main · Yuexuan9/Tinker · GitHub

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号