ROS理论与实践(以移动机器人为例)连载(四) ——URDF机器人建模

在这里插入图片描述


老规矩先放张URDF机器人建模出的图片,养养眼smirk~

URDF


1. 机器人的定义与组成

ROS日常中最常见的机器人就是TurtleBot了叭↓
在这里插入图片描述

(1)定义

  • 诞生
    • 1920年捷克斯洛伐克作家卡雷尔·恰佩克在他的科幻小说《罗萨姆的机器人万能公司》中,根据Robota(捷克文,原意为“劳役、苦工”)和Robotnik(波兰文,原意为“工人”),创造出“机器人”这个词。
  • 百度百科
    在这里插入图片描述
    • 机器人(Robot)是自动执行工作的机器装置。它既可以接受人类指挥,又可以运行预先编排的程序,也可以根据以人工智能技术制定的原则纲领行动。它的任务是协助或取代人类工作,例如生产业、建筑业,或是危险的工作。
  • 美国机器人协会(RIA)
    RIA
    • 机器人是用以搬运材料、零件、工具的可编程序的多功能操作器或是通过可改变程序动作来完成各种作业的特殊机械装置。

(2)组成(控制的角度)

在这里插入图片描述
优质参考推荐

在这里插入图片描述

  • 执行机构:人体的手和脚,直接面向工作对象的机械装置。
  • 驱动系统:人体的肌肉和经络,负责驱动执行机构,将控制系统下达的命令转换成执行机构需要的信号。
  • 传感系统:人体的感官和神经,主要完成信号的输入和反馈,包括内部传感系统和外部传感系统。
  • 控制系统:人体的大脑,实现任务及信息的处理,输出控制命令信号。

补充:

什么是闭环? 闭环(闭环结构)也叫反馈控制系统,是将系统输出量的测量值与所期望的给定值相比较,由此产生一个偏差信号,利用此偏差信号进行调节控制,使输出值尽量接近于期望值。
在这里插入图片描述
常见的有对电机的闭环控制驱动板:

在这里插入图片描述

2. URDF建模方法

(1)什么是URDF?

  • Unified Robot Description Format,统一机器人描述格式;
  • ROS中一个非常重要的机器人模型描述格式;
  • 可以解析URDF文件中使用XML格式描述的机器人模型;
  • 包含link(近似与大臂和小臂,是不能旋转的)和joint(用于连接link)自身及相关属性的描述信息,外界的环境同样可以用URDF去描述。
    在这里插入图片描述

示例:

<?xml version="1.0" ?>
<robot name="mbot">

	<link name="base_link">
		<visual>
			<origin xyz=" 0 0 0 " rpy=" 0 0 0 " />
			<geometry>
				<cylinder length="0.16" radius="0.20" />
			</geometry>
			<material name="yellow">
				<color rgba="1 0.4 0 1" />
			</material>
		</visual>
	</link>

	<joint name="left_wheel_joint" type="continuous">
		<origin xyz="0 0.19 -0.05" rpy="0 0 0" />
		<parent link="base_link" />
		<child link="left_wheel_link" />
		<axis xyz="0 1 0" />
	</joint>

	<link name="left_wheel_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0" />
			<geometry>
				<cylinder radius="0.06" length="0.025" />
			</geometry>
			<material name="while">
				<color rgba="1 1 1 0.9" />
			</material>
		</visual>
	</link>

</robot>

(2)link

  • 描述机器人某个刚体部分的外观和物理属性;
  • 描述连杆尺寸(size)、颜色(color)、形状(shape)、惯性矩阵(inertial matrix)(刚体运动时参照的参数)、碰撞参数(collision properties)(近似于描述刚体边界,会发生物理碰撞,在图中表现为一个浅色的边框(做了简化))等;
    在这里插入图片描述
  • 每个link会成为一个坐标系(便可以使用TF坐标变换)

刚体部分外观过于复杂时,可以使用SolidWorks建模,导出.stl文件

SolidWorks建模导出URDF文件常见错误解决方法
在这里插入图片描述

<link name="link_4">
	<visual>
		<geometry>
			<mesh filename="link_4.stl" />
		</geometry>
		<origin xyz="0 0 0" rpy="0 0 0" />
	</visual>
	<collision>
		<geometry>
			<cylinder lenth="0.5" radius="0.1" />
		</geometry>
		<origin xyz="0 0 -0.05" rpy="0 0 0" />
	</collision>
</link>

(3)joint

  • 描述两个link之间的关系,分为六种类型;
关节类型 描述
continuous 旋转关节,可以围绕单轴无限旋转
revolute 旋转关节,类似于continuous(如:机械臂)
prismatic 滑动关节,沿某一轴线移动的关节,带有位置极限
planar 平面关节,允许在平面正交方向上平移或者旋转
floating 浮动关节,允许进行平移、旋转运动
fixed 固定关节,不允许运动的特殊关节(如:桌腿)
  • 包括关节运动的位置和速度限制;
  • 描述机器人关节的运动学和动力学属性。
    在这里插入图片描述
<joint name="joint_2" type="revolute">
	<parent link="link_1" />
	<child link="link_2" />
	<origin xyz="0.2 0.2 0" rpy="0 0 0" />
	<axis xyz="0 0 1" />
	<limit lower="-3.14" upper="3.14" velocity="1.0" />
</joint>
  • 例中velocity模拟了电机或者舵机的旋转速度,lower/upper确定了revolute最大旋转角(弧度制)
  • axis代表了该joint沿哪个轴旋转,例中绕z轴旋转

(4)robot

  • 完整机器人模型的最顶层标签
  • <link>和<joint>标签都必须包含在<robot>标签内
  • 一个完整的机器人模型,由一系列<link>和<joint>组成

在这里插入图片描述

<robot name="<name of the robot>" >
	<link> ...... </link>
	<link> ...... </link>

	<joint> ...... </joint>
	<joint> ...... </joint>	
</robot>

3.URDF机器人模型案例分析

(1)创建一个机器人建模的功能包

$ catkin_create_pkg mbot_description urdf xacro
  • urdf: 存放机器人模型的URDF或xacro文件
  • meshes: 放置URDF中引用的模型渲染文件
  • launch: 保存相关启动文件
  • config: 保存rviz的配置文件

(2)使用圆柱体创建一个车体模型

首先,在udrf文件夹下创建底盘文件

$ touch mbot_base.urdf

开始码…

<?xml version="1.0" ?>
<robot name="mbot">
	
	<link name="base_link">
		<visual>
			<!-- 每个Link都有一个坐标系 -->
			<origin xyz="0 0 0" rpy="0 0 0" />
			<geometry>
				<!-- 产生一个半径为0.20,高为0.16的圆柱 -->
				<cylinder length="0.16" radius="0.20" />
			</geometry>
			<material name="yellow" />
				<!-- a是透明度 -->
				<color rgba="1 0.4 0 1" />
			</material>
		</visual>
	</link>
	
</robot>

这时已经得到了一个这个在这里插入图片描述颜色的圆柱体(查rgba色彩工具),随后使用 .launch 文件将该模型在rviz中显示出来。

<!-- launch -->
<launch>
	<!-- robot_description是默认的机器人描述文件路径的名字 -->
	<param name="robot_description" textfile="$(find mbot_description)/urdf/mbot_base.urdf" />

	<!-- 设置GUI参数,显示关节控制插件 -->
	<param name="use_gui" value="true" />

	<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
	<!-- 打包关节运动的信息,并以话题方式发布 -->
	<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

	<!-- 运行 robot_state_publisher节点,发布tf -->
	<!-- 将joint_state_publisher发布的话题打包成tf坐标的形式 -->
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />

	<!-- 运行rviz可视化界面 -->
	<!-- 前一讲用过rosrun rviz rviz -d `rospack find turtle_tf`/.rviz   -d代表目录 -->
	<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" />
</launch>

效果图:
在这里插入图片描述

(3)创建左右轮

在上面<robot>和</robot>内继续添加

	<joint name="left_wheel_joint" type="continuous">
		<origin xyz="0 0.19 -0.05" rpy="0 0 0">
		<parent link="base_link" />
		<child link="left_wheel_link" />
		<axis xyz="0 1 0" />
	</joint>
	
	<link name="left_wheel_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0" />
			<geometry>
				<cylinder radius="0.06" length="0.025" />
			</geometry>
			<material name="white" />
				<color rgba="1 1 1 0.9" />
			</material>
		</visual>
	</link>
	
	<joint name="right_wheel_joint" type="continuous" />
		<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
		<parents name="base_link" />
		<child name="right_wheel_link" />
		<axis xyz="0 1 0" />
	</joint>
	
	<link name="right_wheel_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0" />
			<geometry>
				<cylinder radius="0.06" length="0.025" />
			</geometry>
			<material name="white" />
				<color rgba="1 1 1 0.9" />
			</material>
		</visual>
	</link>

效果图:
在这里插入图片描述

(4)创建前、后置万向轮

	<joint name="front_caster_joint" type="continuous" />
		<origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
		<parents name="base_link" />
		<child name="front_caster_link" />
		<axis xyz="0 1 0" />
	</joint>
	
	<link name="front_caster_link">
		<visual>
			<origin xyz="0 0 0" rpy="0 0 0" />
			<geometry>
				<sphere radius="0.015" />
			</geometry>
			<material name="black" />
				<color rgba="0 0 0 0.95" />
			</material>
		</visual>
	</link>
	
	<joint name="back_caster_joint" type="continuous" />
		<origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
		<parents name="base_link" />
		<child name="back_caster_link" />
		<axis xyz="0 1 0" />
	</joint>
	
	<link name="back_caster_link">
		<visual>
			<origin xyz="0 0 0" rpy="0 0 0" />
			<geometry>
				<sphere radius="0.015" />
			</geometry>
			<material name="black" />
				<color rgba="0 0 0 0.95" />
			</material>
		</visual>
	</link>

效果图:在这里插入图片描述

(5)添加kinect

首先将网盘中文件放入meshes文件夹内

链接: https://pan.baidu.com/s/1vER7NlLcjuIXuj04ni1Y0A 密码: 9p9v

编辑一个.urdf文件,这里就不将修改后的.launch文件贴出了,仅在

<param name="robot_discription" textfile="$(find mbot_discription)/urdf/mbot_with_kinect.urdf" />

做出相对要显示模型的.urdf文件的路径修改即可。

mbot_with_kinect.urdf(完整版):

<?xml version="1.0" ?>
<robot name="mbot">
	
	<link name="base_link">
		<visual>
			<!-- 每个Link都有一个坐标系 -->
			<origin xyz="0 0 0" rpy="0 0 0" />
			<geometry>
				<!-- 产生一个半径为0.20,高为0.16的圆柱 -->
				<cylinder length="0.16" radius="0.20" />
			</geometry>
			<material name="yellow" />
				<!-- a是透明度 -->
				<color rgba="1 0.4 0 1" />
			</material>
		</visual>
	</link>
	
	<!-- 左驱动轮 -->
	<joint name="left_wheel_joint" type="continuous">
		<origin xyz="0 0.19 -0.05" rpy="0 0 0">
		<parent link="base_link" />
		<child link="left_wheel_link" />
		<axis xyz="0 1 0" />
	</joint>
	
	<link name="left_wheel_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0" />
			<geometry>
				<cylinder radius="0.06" length="0.025" />
			</geometry>
			<material name="white" />
				<color rgba="1 1 1 0.9" />
			</material>
		</visual>
	</link>
	
	<!-- 右驱动轮 -->
	<joint name="right_wheel_joint" type="continuous" />
		<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
		<parents name="base_link" />
		<child name="right_wheel_link" />
		<axis xyz="0 1 0" />
	</joint>
	
	<link name="right_wheel_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0" />
			<geometry>
				<cylinder radius="0.06" length="0.025" />
			</geometry>
			<material name="white" />
				<color rgba="1 1 1 0.9" />
			</material>
		</visual>
	</link>
	
	<!-- 前脚轮 -->
	<joint name="front_caster_joint" type="continuous" />
		<origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
		<parents name="base_link" />
		<child name="front_caster_link" />
		<axis xyz="0 1 0" />
	</joint>
	
	<link name="front_caster_link">
		<visual>
			<origin xyz="0 0 0" rpy="0 0 0" />
			<geometry>
				<sphere radius="0.015" />
			</geometry>
			<material name="black" />
				<color rgba="0 0 0 0.95" />
			</material>
		</visual>
	</link>
	
	<!-- 后脚轮 -->
	<joint name="back_caster_joint" type="continuous" />
		<origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
		<parents name="base_link" />
		<child name="back_caster_link" />
		<axis xyz="0 1 0" />
	</joint>
	
	<link name="back_caster_link">
		<visual>
			<origin xyz="0 0 0" rpy="0 0 0" />
			<geometry>
				<sphere radius="0.015" />
			</geometry>
			<material name="black" />
				<color rgba="0 0 0 0.95" />
			</material>
		</visual>
	</link>
	
	<!-- kinect -->
	<joint name="kinect_joint" type="fixed">
		<origin xyz="0.15 0 0.11" rpy="0 0 0" />
		<parent link="base_link" />
		<child link="kinect_link" />
	</joint>

	<link name="kinect_link" >
		<visual>
			<origin xyz="0 0 0" rpy="0 0 1.5708" />
			<geometry>
				<mesh filename="package://mbot_description/meshes/kinect.dae" />
			</geometry>
		</visual>
	</link>
	
</robot>

效果图:在这里插入图片描述

(6)检查URDF模型整体结构

$ urdf_to_graphiz mbot_base.urdf

在这里插入图片描述
分享一下自己后来随便画了一个

链接: https://pan.baidu.com/s/1cOaxROGak5TVpfg2hd_7Lw
密码: sn72
在这里插入图片描述

内容大概就是这样,忘记的内容会继续作补充,下一期ヾ( ̄▽ ̄)ByeBye

发布了27 篇原创文章 · 获赞 60 · 访问量 6578

猜你喜欢

转载自blog.csdn.net/qq_44455588/article/details/105026397