介绍
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>
这个启动文件的作用是:
- 通过
<param>
标签设置机器人描述参数(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 文件里 <mesh>
标签中 filename
属性指定的路径是正确的。例如在 <link>
标签内有这样的定义:
<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