ROS机器人URDF建模

网友投稿 970 2022-05-30

在阅读本文之前,推荐阅读前篇ROS机器人TF基础和全部资料文档:

TF基础:https://blog.csdn.net/ZhangRelay/article/details/108374509

全文档:https://blog.csdn.net/ZhangRelay/article/details/108192167

所有内容均在ROS1 indigo,kinetic,melodic,noetic以及ROS2 dashing,foxy等测试通过。

但介绍以noetic和foxy为主。

在ROS中自定义机器人的3D模型

机器人模型通常为移动机器人和工业机械臂,那么如果在rviz中进行三维可视化的URDF模型设计呢?

先看如下两副截图(点击可看大图,细节清晰):

参考命令:

ros2 launch urdf_tutorial display.launch.py model:=/home/ros/RobCode/urdf_tutorial/src/urdf/magician.urdf

/\/\/\移动机器人案例如上/\/\/\

参考命令:

ros2 launch urdf_tutorial display.launch.py model:=/home/ros/RobCode/urdf_tutorial/src/urdf/cozmo2.urdf

/\/\/\工业机械臂案例如上/\/\/\

可以看到机器人各关节的坐标以及非常精细的模型,并可以通过人机交互面板(joint_state_publisher)控制其状态。

由此可知:

相比于仿真,虽然直接在一个真正的机器人上进行编程能够给我们最佳的反馈,并且也更加令人激动,但是并不是每个人都有机会接触到真正的机器人。基于这个原因,我们需要对整个物理世界进行建模与仿真。机器人三维模型或部分结构模型主要用于仿真机器人或者为了帮助开发者简化他们的常规工作,在ROS中通过URDF文件实现。标准化机器人描述格式(Unified Robot Description Format , URDF)是一种用于描述机器人及其部分结构、关节、自由度等的XML格式文件。每次在ROS系统中看到3D机器人都会有URDF文件与之对应,例如PR2(Willow Garage)或者Robonaut(NASA)。在下面的章节中我们将会学习如何创建这种文件和格式用于定义不同的值。

在正式开启之前,再观看一个视频,了解以下官方案例:

ros1ros2urdf

此部分介绍在ROSwiki中,不在此赘述。URDF模型在ROS1和ROS2中通用。

特别注意两者launch文件差别:

ros1(indigo,kinetic,melodic,noetic):

ros2(dashing,foxy):

import launch

from launch.substitutions import Command, LaunchConfiguration

import launch_ros

import os

def generate_launch_description():

pkg_share = launch_ros.substitutions.FindPackageShare(package='urdf_tutorial').find('urdf_tutorial')

default_model_path = os.path.join(pkg_share, 'urdf/01-myfirst.urdf')

default_rviz_config_path = os.path.join(pkg_share, 'rviz/urdf.rviz')

robot_state_publisher_node = launch_ros.actions.Node(

package='robot_state_publisher',

executable='robot_state_publisher',

parameters=[{'robot_description': Command(['xacro ', LaunchConfiguration('model')])}]

)

joint_state_publisher_node = launch_ros.actions.Node(

package='joint_state_publisher',

executable='joint_state_publisher',

name='joint_state_publisher',

condition=launch.conditions.UnlessCondition(LaunchConfiguration('gui'))

)

joint_state_publisher_gui_node = launch_ros.actions.Node(

package='joint_state_publisher_gui',

executable='joint_state_publisher_gui',

name='joint_state_publisher_gui',

condition=launch.conditions.IfCondition(LaunchConfiguration('gui'))

)

rviz_node = launch_ros.actions.Node(

package='rviz2',

executable='rviz2',

name='rviz2',

output='screen',

arguments=['-d', LaunchConfiguration('rvizconfig')],

)

return launch.LaunchDescription([

launch.actions.DeclareLaunchArgument(name='gui', default_value='True',

description='Flag to enable joint_state_publisher_gui'),

launch.actions.DeclareLaunchArgument(name='model', default_value=default_model_path,

description='Absolute path to robot urdf file'),

launch.actions.DeclareLaunchArgument(name='rvizconfig', default_value=default_rviz_config_path,

description='Absolute path to rviz config file'),

joint_state_publisher_node,

joint_state_publisher_gui_node,

robot_state_publisher_node,

rviz_node

])

掌握此部分内容非常重要,更具体的讲解参考如下链接:

ROS 2启动-launch-:https://blog.csdn.net/ZhangRelay/article/details/103498784

机器人+复杂环境案例:https://blog.csdn.net/ZhangRelay/article/details/105707950

那么开始创建第一个URDF案例吧!

创建第一个URDF文件

一个四轮小车模型如下:

其urdf代码为:

Gazebo/Green

false

简单解释一下,如需了解更全面具体的内容参考(wiki.ros.org/urdf/XML)。

这些URDF代码是基于XML的,这种格式并不强制缩进,但还是建议大家这么做。因此,建议大家使用一个支持缩进的编辑器或者找到适当插件并进行配置(例如,比较好的是Vim中的.vimrc文件)。

解释文件格式

如在代码中所见,有两种用于描述机器人几何结构的基本字段:连接(link)和关节(joint)。

如连接的名字是base_link(本体连接),这个名称在文件中必须唯一。

为了定义我们在仿真环境中的物体,在前面的代码中使用了visual字段。在代码中你能够定义几何形状(圆柱体、立方体、球体和纹理网格)、材质(颜色和纹理)和原点。

然后使用以下代码定义关节:

在joint字段中,我们先定义名称(名称要求唯一)。然后定义关节类型(固定关节fixed,转动关节revolute,旋转关节continuous,自由度浮动关节floating,或平面运动关节planar),以及父连接坐标系和子连接坐标系(关节相连的前后坐标系)。在本例中,wheel_1是base_link的子连接坐标系。它是固定关节(fixed),但如果这个关节是一个轮轴,那么我们可以设置其为转动关节(revolute)。

关于urdf各类工具如check,tf等自行探索实践!

使用如下命令查看模型:

ros2 launch urdf_tutorial display.launch.py model:=/home/ros/RobCode/urdf_tutorial/src/urdf/robot1_base1.urdf

如果使用ros1,将ros2 launch替换为roslaunch即可。

ROS1的urdf模型都可以直接移植到ROS2中,需要修改的代码非常少,主要为launch和其他配置文件,如功能包名称以及纹理材质配置的路径等。

加载纹理网格到机器人模型

以ROS1的cozmo模型为例:

izz="${0.0833333 * mass * (3 * radius * radius + length * length)}" iyz="0.0"

iyy="${0.5 * mass * radius * radius}" />

transmission_interface/SimpleTransmission

hardware_interface/EffortJointInterface

hardware_interface/EffortJointInterface

1

transmission_interface/SimpleTransmission

hardware_interface/EffortJointInterface

hardware_interface/EffortJointInterface

1

/cozmo

10.0

1.3962634

400

400

R8G8B8

0.01

100

gaussian

0.0

0.007

true

10.0

cozmo_camera

image

camera_info

camera_link

0.07

0.0

0.0

0.0

0.0

0.0

0 0 0 0 0 0

true

50

10

1

-0.14835

0.14835

10

1

-0.14835

0.14835

0.01

2

0.02

0.005

true

50

drop_sensor

drop_ir

INFRARED

0.2967

true

true

100

true

__default_topic__

imu

imu

10.0

${0.0017*0.0017}

0 0 0

0 0 0

imu

0 0 0 0 0 0

25.0

/

base_to_flw

base_to_frw

base_to_rlw

base_to_rrw

0.048

0.04

base_link

20

cmd_vel

cmd_vel

odom

odom

1

注意,加载纹理的部分:

对应文件为:

有时候希望自己构建的模型能够更加真实,并不是说简单地增加更多的基本几何形状和模块,而是通过添加更多的现实元素使模型变得更加丰富和细致。这就需要加载我们自行创建的纹理网格(mesh)或者使用其他机器人模型的纹理网格。URDF模型支持.stl和.dae格式的纹理网格。

使机器人模型运动

为了将模型转换成能实际运动的机器人,我们唯一需要做的是检查好所选用的关节类型。如果你检查URDF模型文件,将会看到我们在模型中使用了不同类型的关节。

要判断关节的轴或转动限值是否合适,有一种好的办法就是使用Join_State_Publisher图形化用户界面(GUI)。

这意味着它们能够像旋转关节一样转动,但是它们的转动角具有一定的限制。

标签用于选择以下属性:effort关节所承受的最大力,lower赋值给关节的下限(旋转接头revolute joint的单位是弧度,带滑移链prismatic joint的单位是米),upper赋值给关节的上限,velocity强制关节的最大速度。

物理和碰撞属性

如果想在Gazebo或者其他仿真软件中进行机器人仿真,就需要添加物理属性和碰撞属性。这意味着我们需要设定几何尺寸来计算可能的碰撞。例如,需要首先设定重量我们才能够计算惯性等。

需要保证模型文件中的所有连接都有这些参数,否则就无法对这些机器人进行仿真。

对于纹理网格模型文件来说,使用简单的几何形状比实际的纹理网格模型更容易进行碰撞计算。相比简单的几何形状,在两个纹理网格模型之间进行碰撞计算要使用更加复杂的计算方法,也会耗费更多的计算资源。

注意:

对于其他的link也是如此。记住,要为所有link添加collision和inertial元素,因为如果不这样做的话,Gazebo将无法使用这些模型。

当然urdf的升级版为xacro——一种更好的机器人建模方法。

izz="${0.0833333 * mass * (3 * radius * radius + length * length)}" iyz="0.0"

iyy="${0.5 * mass * radius * radius}" />

ROS机器人URDF建模

后续博文再做详细介绍吧。

思考与提升:

将ROS1中丰富的URDF模型移植到ROS2中吧^_^

单片机 机器人

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:项目管理常用术语
下一篇:在 Python 中使用“not”布尔运算符
相关文章