0


【ROS学习笔记15】ROS仿真常用组件URDF集成rviz

【ROS学习笔记15】ROS仿真常用组件URDF集成rviz

文章目录

写在前面,本系列笔记参考的是AutoLabor的教程,具体项目地址在 这里


前言

1.URDF

URDF是 Unified Robot Description Format 的首字母缩写,直译为统一(标准化)机器人描述格式,可以以一种 XML 的方式描述机器人的部分结构,比如底盘、摄像头、激光雷达、机械臂以及不同关节的自由度…,该文件可以被 C++ 内置的解释器转换成可视化的机器人模型,是 ROS 中实现机器人仿真的重要组件

2.rviz

RViz 是 ROS Visualization Tool 的首字母缩写,直译为ROS的三维可视化工具。它的主要目的是以三维方式显示ROS消息,可以将 数据进行可视化表达。例如:可以显示机器人模型,可以无需编程就能表达激光测距仪(LRF)传感器中的传感 器到障碍物的距离,RealSense、Kinect或Xtion等三维距离传感器的点云数据(PCD, Point Cloud Data),从相机获取的图像值等

以“ros- [ROS_DISTRO] -desktop-full”命令安装ROS时,RViz会默认被安装。

运行使用命令

rviz

rosrun rviz rviz

如果rviz没有安装,请调用如下命令自行安装:

sudoaptinstall ros-[ROS_DISTRO]-rviz

3.gazebo

Gazebo是一款3D动态模拟器,用于显示机器人模型并创建仿真环境,能够在复杂的室内和室外环境中准确有效地模拟机器人。与游戏引擎提供高保真度的视觉模拟类似,Gazebo提供高保真度的物理模拟,其提供一整套传感器模型,以及对用户和程序非常友好的交互方式。

以“ros- [ROS_DISTRO] -desktop-full”命令安装ROS时,gzebo会默认被安装。

运行使用命令

gazebo

rosrun gazebo_ros gazebo

**注意1:**在 Ubuntu20.04 与 ROS Noetic 环境下,gazebo 启动异常以及解决

  • **问题1:**VMware: vmw_ioctl_command error Invalid argument(无效的参数)解决:echo "export SVGA_VGPU10=0" >> ~/.bashrc``````source .bashrc
  • 问题2:[Err] [REST.cc:205] Error in REST request解决:sudo gedit ~/.ignition/fuel/config.yaml然后将url : https://api.ignitionfuel.org使用 # 注释再添加url: https://api.ignitionrobotics.org
  • **问题3:**启动时抛出异常:[gazebo-2] process has died [pid xxx, exit code 255, cmd.....解决:killall gzserverkillall gzclient

**注意2:**如果 gazebo没有安装,请自行安装:

1.添加源:

sudosh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" 
>
 /etc/apt/sources.list.d/gazebo-stable.list'wget http://packages.osrfoundation.org/gazebo.key -O - |sudo apt-key add -

2.安装:

sudoapt update
sudoaptinstall gazebo11 
sudoaptinstall libgazebo11-dev

机器人的系统仿真是一种集成实现,主要包含三部分:

  • URDF 用于创建机器人模型
  • Gzebo 用于搭建仿真环境
  • Rviz 图形化的显示机器人各种传感器感知到的环境信息

三者应用中,只是创建 URDF 意义不大,一般需要结合 Gazebo 或 Rviz 使用,在 Gazebo 或 Rviz 中可以将 URDF 文件解析为图形化的机器人模型,一般的使用组合为:

  • 如果非仿真环境,那么使用 URDF 结合 Rviz 直接显示感知的真实环境信息
  • 如果是仿真环境,那么需要使用 URDF 结合 Gazebo 搭建仿真环境,并结合 Rviz 显示感知的虚拟环境信息

1.URDF集成Rviz基本流程

前面介绍过,URDF 不能单独使用,需要结合 Rviz 或 Gazebo,URDF 只是一个文件,需要在 Rviz 或 Gazebo 中渲染成图形化的机器人模型,当前,首先演示URDF与Rviz的集成使用,因为URDF与Rviz的集成较之于URDF与Gazebo的集成更为简单,后期,基于Rviz的集成实现,我们再进一步介绍URDF语法。

需求描述:

在 Rviz 中显示一个盒状机器人

结果演示:

实现流程:

  1. 准备:新建功能包,导入依赖
  2. 核心:编写 urdf 文件
  3. 核心:在 launch 文件集成 URDF 与 Rviz
  4. 在 Rviz 中显示机器人模型

1.创建功能包,导入依赖

创建一个新的功能包,名称自定义,导入依赖包:

urdf

xacro

在当前功能包下,再新建几个目录:

urdf

: 存储 urdf 文件的目录

meshes

:机器人模型渲染文件(暂不使用)

config

: 配置文件

launch

: 存储 launch 启动文件

2.编写 URDF 文件

新建一个子级文件夹:

urdf

(可选),文件夹中添加一个

.urdf

文件,复制如下内容:

<robotname="mycar"><linkname="base_link"><visual><geometry><boxsize="0.5 0.2 0.1"/></geometry></visual></link></robot>

3.在 launch 文件中集成 URDF 与 Rviz

launch

目录下,新建一个 launch 文件,该 launch 文件需要启动 Rviz,并导入 urdf 文件,Rviz 启动后可以自动载入解析

urdf

文件,并显示机器人模型,核心问题:如何导入 urdf 文件? 在 ROS 中,可以将 urdf 文件的路径设置到参数服务器,使用的参数名是:

robot_description

,示例代码如下:

<launch><!-- 设置参数 --><paramname="robot_description"textfile="$(find 包名)/urdf/urdf/urdf01_HelloWorld.urdf"/><!-- 启动 rviz --><nodepkg="rviz"type="rviz"name="rviz"/></launch>

4.在 Rviz 中显示机器人模型

rviz 启动后,会发现并没有盒装的机器人模型,这是因为默认情况下没有添加机器人显示组件,需要手动添加,添加方式如下:

设置完毕后,可以正常显示了

5.优化 rviz 启动

重复启动

launch

文件时,Rviz 之前的组件配置信息不会自动保存,需要重复执行步骤4的操作,为了方便使用,可以使用如下方式优化:

首先,将当前配置保存进

config

目录

然后,

launch

文件中 Rviz 的启动配置添加参数:

args

,值设置为

-d 配置文件路径
<launch><paramname="robot_description"textfile="$(find 包名)/urdf/urdf/urdf01_HelloWorld.urdf"/><nodepkg="rviz"type="rviz"name="rviz"args="-d $(find 报名)/config/rviz/show_mycar.rviz"/></launch>

再启动时,就可以包含之前的组件配置了,使用更方便快捷。


2. URDF语法详解

URDF 文件是一个标准的 XML 文件,在 ROS 中预定义了一系列的标签用于描述机器人模型,机器人模型可能较为复杂,但是 ROS 的 URDF 中机器人的组成却是较为简单,可以主要简化为两部分:连杆(link标签) 与 关节(joint标签),接下来我们就通过案例了解一下 URDF 中的不同标签:

  • robot 根标签,类似于 launch文件中的launch标签
  • link 连杆标签
  • joint 关节标签
  • gazebo 集成gazebo需要使用的标签

关于gazebo标签,后期在使用 gazebo 仿真时,才需要使用到,用于配置仿真环境所需参数,比如: 机器人材料属性、gazebo插件等,但是该标签不是机器人模型必须的,只有在仿真时才需设置


2.1 URDF语法详解——robot

robot

urdf 中为了保证 xml 语法的完整性,使用了

robot

标签作为根标签,所有的 link 和 joint 以及其他标签都必须包含在 robot 标签内,在该标签内可以通过 name 属性设置机器人模型的名称

1.属性

name: 指定机器人模型的名称

2.子标签

其他标签都是子级标签


2.2 URDF语法详解——link

link

urdf 中的 link 标签用于描述机器人某个部件(也即刚体部分)的外观和物理属性,比如: 机器人底座、轮子、激光雷达、摄像头…每一个部件都对应一个 link, 在 link 标签内,可以设计该部件的形状、尺寸、颜色、惯性矩阵、碰撞参数等一系列属性

1.属性

  • name —> 为连杆命名

2.子标签

  • visual —> 描述外观(对应的数据是可视的) - geometry 设置连杆的形状 - 标签1: box(盒状) - 属性:size=长(x) 宽(y) 高(z)- 标签2: cylinder(圆柱) - 属性:radius=半径 length=高度- 标签3: sphere(球体) - 属性:radius=半径- 标签4: mesh(为连杆添加皮肤) - 属性: filename=资源路径(格式:**package:/// /文件 **)- origin 设置偏移量与倾斜弧度 - 属性1: xyz=x偏移 y便宜 z偏移- 属性2: rpy=x翻滚 y俯仰 z偏航 (单位是弧度)- metrial 设置材料属性(颜色) - 属性: name- 标签: color - 属性: rgba=红绿蓝权重值与透明度 (每个权重值以及透明度取值[0,1])
  • collision —> 连杆的碰撞属性
  • Inertial —> 连杆的惯性矩阵

在此,只演示

visual

使用。

3.案例

**需求:**分别生成长方体、圆柱与球体的机器人部件

<robotname="my_car"><linkname="base_link"><visual><!-- 形状 --><geometry><!-- 长方体的长宽高 --><!-- <box size="0.5 0.3 0.1" /> --><!-- 圆柱,半径和长度 --><cylinderradius="0.5"length="0.1"/><!-- 球体,半径--><!-- <sphere radius="0.3" /> --></geometry><!-- xyz坐标 rpy翻滚俯仰与偏航角度(3.14=180度 1.57=90度) --><originxyz="0 0 0"rpy="0 0 0"/><!-- 颜色: r=red g=green b=blue a=alpha --><materialname="black"><colorrgba="0.7 0.5 0 0.5"/></material></visual></link></robot>

示例结果:

首先下载素材,素材链接,将素材放置在

功能包/meshes

路径下


2.3 URDF语法详解——joint

joint

urdf 中的 joint 标签用于描述机器人关节的运动学和动力学属性,还可以指定关节运动的安全极限,机器人的两个部件(分别称之为 parent link 与 child link)以"关节"的形式相连接,不同的关节有不同的运动形式: 旋转、滑动、固定、旋转速度、旋转角度限制…,比如:安装在底座上的轮子可以360度旋转,而摄像头则可能是完全固定在底座上。

joint标签对应的数据在模型中是不可见的

1.属性

  • name —> 为关节命名
  • type —> 关节运动形式 - continuous: 旋转关节,可以绕单轴无限旋转- revolute: 旋转关节,类似于 continues,但是有旋转角度限制- prismatic: 滑动关节,沿某一轴线移动的关节,有位置极限- planer: 平面关节,允许在平面正交方向上平移或旋转- floating: 浮动关节,允许进行平移、旋转运动- fixed: 固定关节,不允许运动的特殊关节

2.子标签

  • parent(必需的)parent link的名字是一个强制的属性:- link:父级连杆的名字,是这个link在机器人结构树中的名字。
  • child(必需的)child link的名字是一个强制的属性:- link:子级连杆的名字,是这个link在机器人结构树中的名字。
  • origin- 属性: xyz=各轴线上的偏移量 rpy=各轴线上的偏移弧度。
  • axis- 属性: xyz用于设置围绕哪个关节轴运动。

3.案例

**需求:**创建机器人模型,底盘为长方体,在长方体的前面添加一摄像头,摄像头可以沿着 Z 轴 360 度旋转。

URDF文件示例如下:

<!-- 
    需求: 创建机器人模型,底盘为长方体,
         在长方体的前面添加一摄像头,
         摄像头可以沿着 Z 轴 360 度旋转

 --><robotname="mycar"><!-- 底盘 --><linkname="base_link"><visual><geometry><boxsize="0.5 0.2 0.1"/></geometry><originxyz="0 0 0"rpy="0 0 0"/><materialname="blue"><colorrgba="0 0 1.0 0.5"/></material></visual></link><!-- 摄像头 --><linkname="camera"><visual><geometry><boxsize="0.02 0.05 0.05"/></geometry><originxyz="0 0 0"rpy="0 0 0"/><materialname="red"><colorrgba="1 0 0 0.5"/></material></visual></link><!-- 关节 --><jointname="camera2baselink"type="continuous"><parentlink="base_link"/><childlink="camera"/><!-- 需要计算两个 link 的物理中心之间的偏移量 --><originxyz="0.2 0 0.075"rpy="0 0 0"/><axisxyz="0 0 1"/></joint></robot>

launch文件示例如下:

<launch><paramname="robot_description"textfile="$(find urdf_rviz_demo)/urdf/urdf/urdf03_joint.urdf"/><nodepkg="rviz"type="rviz"name="rviz"args="-d $(find urdf_rviz_demo)/config/helloworld.rviz"/><!-- 添加关节状态发布节点 --><nodepkg="joint_state_publisher"type="joint_state_publisher"name="joint_state_publisher"/><!-- 添加机器人状态发布节点 --><nodepkg="robot_state_publisher"type="robot_state_publisher"name="robot_state_publisher"/><!-- 可选:用于控制关节运动的节点 --><nodepkg="joint_state_publisher_gui"type="joint_state_publisher_gui"name="joint_state_publisher_gui"/></launch>

PS:

1.状态发布节点在此是必须的:

<!-- 添加关节状态发布节点 --><nodepkg="joint_state_publisher"type="joint_state_publisher"name="joint_state_publisher"/><!-- 添加机器人状态发布节点 --><nodepkg="robot_state_publisher"type="robot_state_publisher"name="robot_state_publisher"/>

2.关节运动控制节点(可选),会生成关节控制的UI,用于测试关节运动是否正常。

<!-- 可选:用于控制关节运动的节点 --><nodepkg="joint_state_publisher_gui"type="joint_state_publisher_gui"name="joint_state_publisher_gui"/>

示例效果:

4.base_footprint优化urdf

前面实现的机器人模型是半沉到地下的,因为默认情况下: 底盘的中心点位于地图原点上,所以会导致这种情况产生,可以使用的优化策略,将初始 link 设置为一个尺寸极小的 link(比如半径为 0.001m 的球体,或边长为 0.001m 的立方体),然后再在初始 link 上添加底盘等刚体,这样实现,虽然仍然存在初始link半沉的现象,但是基本可以忽略了。这个初始 link 一般称之为 base_footprint

<!--

    使用 base_footprint 优化

--><robotname="mycar"><!-- 设置一个原点(机器人中心点的投影) --><linkname="base_footprint"><visual><geometry><sphereradius="0.001"/></geometry></visual></link><!-- 添加底盘 --><linkname="base_link"><visual><geometry><boxsize="0.5 0.2 0.1"/></geometry><originxyz="0 0 0"rpy="0 0 0"/><materialname="blue"><colorrgba="0 0 1.0 0.5"/></material></visual></link><!-- 底盘与原点连接的关节 --><jointname="base_link2base_footprint"type="fixed"><parentlink="base_footprint"/><childlink="base_link"/><originxyz="0 0 0.05"/></joint><!-- 添加摄像头 --><linkname="camera"><visual><geometry><boxsize="0.02 0.05 0.05"/></geometry><originxyz="0 0 0"rpy="0 0 0"/><materialname="red"><colorrgba="1 0 0 0.5"/></material></visual></link><!-- 关节 --><jointname="camera2baselink"type="continuous"><parentlink="base_link"/><childlink="camera"/><originxyz="0.2 0 0.075"rpy="0 0 0"/><axisxyz="0 0 1"/></joint></robot>

launch 文件内容不变。

示例结果:

5.遇到问题以及解决

问题1:

命令行输出如下错误提示

UnicodeEncodeError: 'ascii' codec can't encode characters in position 463-464: ordinal not in range(128)
[joint_state_publisher-3] process has died [pid 4443, exit code 1, cmd /opt/ros/melodic/lib/joint_state_publisher/joint_state_publisher __name:=joint_state_publisher __log:=/home/rosmelodic/.ros/log/b38967c0-0acb-11eb-aee3-0800278ee10c/joint_state_publisher-3.log].
log file: /home/rosmelodic/.ros/log/b38967c0-0acb-11eb-aee3-0800278ee10c/joint_state_publisher-3*.log

rviz中提示坐标变换异常,导致机器人部件显示结构异常

**原因:**编码问题导致的

**解决:**去除URDF中的中文注释

问题2:

[ERROR][1584370263.037038]: Could not find the GUI, install the 'joint_state_publisher_gui' package

解决:

sudoaptinstall ros-noetic-joint-state-publisher-gui

2.4 URDF练习

需求描述:

创建一个四轮圆柱状机器人模型,机器人参数如下,底盘为圆柱状,半径 10cm,高 8cm,四轮由两个驱动轮和两个万向支撑轮组成,两个驱动轮半径为 3.25cm,轮胎宽度1.5cm,两个万向轮为球状,半径 0.75cm,底盘离地间距为 1.5cm(与万向轮直径一致)

结果演示:

实现流程:

创建机器人模型可以分步骤实现

  1. 新建 urdf 文件,并与 launch 文件集成
  2. 搭建底盘
  3. 在底盘上添加两个驱动轮
  4. 在底盘上添加两个万向轮

1.新建urdf以及launch文件

urdf 文件:基本实现

<robotname="mycar"><!-- 设置 base_footprint  --><linkname="base_footprint"><visual><geometry><sphereradius="0.001"/></geometry></visual></link><!-- 添加底盘 --><!-- 添加驱动轮 --><!-- 添加万向轮(支撑轮) --></robot>

launch 文件:

<launch><!-- 将 urdf 文件内容设置进参数服务器 --><paramname="robot_description"textfile="$(find demo01_urdf_helloworld)/urdf/urdf/test.urdf"/><!-- 启动 rivz --><nodepkg="rviz"type="rviz"name="rviz_test"args="-d $(find demo01_urdf_helloworld)/config/helloworld.rviz"/><!-- 启动机器人状态和关节状态发布节点 --><nodepkg="robot_state_publisher"type="robot_state_publisher"name="robot_state_publisher"/><nodepkg="joint_state_publisher"type="joint_state_publisher"name="joint_state_publisher"/><!-- 启动图形化的控制关节运动节点 --><nodepkg="joint_state_publisher_gui"type="joint_state_publisher_gui"name="joint_state_publisher_gui"/></launch>

2.底盘搭建

<!-- 
        参数
            形状:圆柱 
            半径:10     cm 
            高度:8      cm 
            离地:1.5    cm

    --><linkname="base_link"><visual><geometry><cylinderradius="0.1"length="0.08"/></geometry><originxyz="0 0 0"rpy="0 0 0"/><materialname="yellow"><colorrgba="0.8 0.3 0.1 0.5"/></material></visual></link><jointname="base_link2base_footprint"type="fixed"><parentlink="base_footprint"/><childlink="base_link"/><originxyz="0 0 0.055"/></joint>

3.添加驱动轮

<!-- 添加驱动轮 --><!--
        驱动轮是侧翻的圆柱
        参数
            半径: 3.25 cm
            宽度: 1.5  cm
            颜色: 黑色
        关节设置:
            x = 0
            y = 底盘的半径 + 轮胎宽度 / 2
            z = 离地间距 + 底盘长度 / 2 - 轮胎半径 = 1.5 + 4 - 3.25 = 2.25(cm)
            axis = 0 1 0
    --><linkname="left_wheel"><visual><geometry><cylinderradius="0.0325"length="0.015"/></geometry><originxyz="0 0 0"rpy="1.5705 0 0"/><materialname="black"><colorrgba="0.0 0.0 0.0 1.0"/></material></visual></link><jointname="left_wheel2base_link"type="continuous"><parentlink="base_link"/><childlink="left_wheel"/><originxyz="0 0.1 -0.0225"/><axisxyz="0 1 0"/></joint><linkname="right_wheel"><visual><geometry><cylinderradius="0.0325"length="0.015"/></geometry><originxyz="0 0 0"rpy="1.5705 0 0"/><materialname="black"><colorrgba="0.0 0.0 0.0 1.0"/></material></visual></link><jointname="right_wheel2base_link"type="continuous"><parentlink="base_link"/><childlink="right_wheel"/><originxyz="0 -0.1 -0.0225"/><axisxyz="0 1 0"/></joint>

4.添加万向轮

<!-- 添加万向轮(支撑轮) --><!--
        参数
            形状: 球体
            半径: 0.75 cm
            颜色: 黑色

        关节设置:
            x = 自定义(底盘半径 - 万向轮半径) = 0.1 - 0.0075 = 0.0925(cm)
            y = 0
            z = 底盘长度 / 2 + 离地间距 / 2 = 0.08 / 2 + 0.015 / 2 = 0.0475 
            axis= 1 1 1

    --><linkname="front_wheel"><visual><geometry><sphereradius="0.0075"/></geometry><originxyz="0 0 0"rpy="0 0 0"/><materialname="black"><colorrgba="0.0 0.0 0.0 1.0"/></material></visual></link><jointname="front_wheel2base_link"type="continuous"><parentlink="base_link"/><childlink="front_wheel"/><originxyz="0.0925 0 -0.0475"/><axisxyz="1 1 1"/></joint><linkname="back_wheel"><visual><geometry><sphereradius="0.0075"/></geometry><originxyz="0 0 0"rpy="0 0 0"/><materialname="black"><colorrgba="0.0 0.0 0.0 1.0"/></material></visual></link><jointname="back_wheel2base_link"type="continuous"><parentlink="base_link"/><childlink="back_wheel"/><originxyz="-0.0925 0 -0.0475"/><axisxyz="1 1 1"/></joint>

示例效果:


2.5 URDF工具

在 ROS 中,提供了一些工具来方便 URDF 文件的编写,比如:

  • check_urdf命令可以检查复杂的 urdf 文件是否存在语法问题
  • urdf_to_graphiz命令可以查看 urdf 模型结构,显示不同 link 的层级关系

当然,要使用工具之前,首先需要安装,安装命令:

sudo apt install liburdfdom-tools

1.check_urdf 语法检查

进入urdf文件所属目录,调用:

check_urdf urdf文件

,如果不抛出异常,说明文件合法,否则非法

2.urdf_to_graphiz 结构查看

进入urdf文件所属目录,调用:

urdf_to_graphiz urdf文件

,当前目录下会生成 pdf 文件



Reference

http://www.autolabor.com.cn/book/ROSTutorials/di-2-zhang-ros-jia-gou-she-ji/23-fu-wu-tong-xin/224-fu-wu-tong-xin-zi-ding-yi-srv-diao-yong-b-python.html


本文转载自: https://blog.csdn.net/qq_44940689/article/details/129478106
版权归原作者 木心 所有, 如有侵权,请联系我们删除。

“【ROS学习笔记15】ROS仿真常用组件URDF集成rviz”的评论:

还没有评论