从零手写移动机器人URDF模型学习记录(二)


前言

本文是基于古月居从零手写移动机器人urdf模型课程,进行学习记录的第二篇,下文讲述了构建一个基本机械臂urdf模型的过程。

一、创建工作空间

这里沿用了第一篇学习记录里的工作空间moveit_ws,因此在这里不再过多叙述。

二、创建机械臂建模的功能包

进入工作空间下的src文件夹:

cd ~/moveit_ws/src/

创建机器臂功能包:

catkin_create_pkg marm_description urdf xacro

在创建好的marm_description文件夹下创建config、launch、meshes、urdf四个文件夹,如下图所示:
在这里插入图片描述

三.创建URDF模型

进入urdf文件夹:

cd ~/moveit_ws/src/marm_description/urdf/

创建urdf模型文件并打开:

touch marm.urdf
gedit marm.urdf 

在urdf文件内添加xml格式的机械臂模型代码,课程配套代码可到:guyuehome 中找

1.添加robot标签

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

</robot>

机械臂模型命名为marm,在两个robot标签中间可添加机械臂模型参数代码。这里还是要注意标签一定要闭合。

2.添加颜色参数

<!-- /    COLOR    / -->
	<material name="Black">
		<color rgba="0 0 0 1"/>
	</material>
	<material name="White">
		<color rgba="1 1 1 1"/>
	</material>
	<material name="Blue">
		<color rgba="0 0 1 1"/>
	</material>
	<material name="Red">
		<color rgba="1 0 0 1"/>
	</material>

3.创建机械臂基座

<!-- /    BASE    / -->
	<link name="base_link">
		<visual>
			<origin rpy="0 0 0" xyz="0 0 0"/>
			<geometry>
				<cylinder length="0.04" radius="0.05"/>
			</geometry>
			<material name="White"/>
		</visual>
	</link>

4.创建launch文件,查看模型创建效果

进入launch文件夹:

cd ~/moveit_ws/src/marm_description/launch/

创建display_marm_urdf.launch文件并打开:

touch display_marm_urdf.launch
gedit display_marm_urdf.launch 

在新创建的display_marm_urdf.launch文件中添加如下代码:

<launch>
	<!-- 设置机器人模型路径参数 -->
	<param name="robot_description" textfile="$(find marm_description)/urdf/marm.urdf" />
	
	<!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
	<node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
	
	<!-- 运行robot_state_publisher节点,发布tf  -->
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
	
	<!-- 运行rviz可视化界面 -->
	<node name="rviz" pkg="rviz" type="rviz" args="-d $(find marm_description)/config/marm_urdf.rviz" required="true" />
</launch>

保存launch文件后返回工作空间moveit_ws根目录进行编译,确保环境变量能找到功能包:

cd ~/moveit_ws/
catkin_make

通过roslaunch命令打开rviz:

roslaunch marm_description display_marm_urdf.launch

输入命令后,可以看到rviz界面打开:
在这里插入图片描述配置rviz参数并显示底盘模型:
点击Add,添加机器人模型RobotModel:
在这里插入图片描述修改Global Options下Fixed Frame名称为base_link:
在这里插入图片描述可以看到所创建的机械臂底座已经创建完成。

保存rviz当前设置参数:
点击rviz界面左上角的file->Save Config As,选择marm_description下的config文件夹,命名marm_urdf并进行保存。

5.创建机械臂关节

通过在marm.urdf文件中添加如下代码添加第一节关节模型:

<!-- /   LINK1  // -->
	<link name="link1">
		<visual>
			<origin rpy="0 1.5707 0" xyz="-0.05 0 0"/>
			<geometry>
				<cylinder length="0.1" radius="0.03"/>
			</geometry>
			<material name="Blue"/>
		</visual>
	</link>

	<joint name="joint1" type="revolute">
		<parent link="base_link"/>
		<child link="link1"/>
		<origin rpy="0 1.5707 0" xyz="0 0 0.02"/>
		<axis xyz="-1 0 0"/>
		<limit effort="300" lower="-3.14159" upper="3.14159" velocity="1"/>
	</joint>

joint类型定义为revolute,这是一个有上下限位的旋转关节,limit标签中,参数effort为关节的力矩,lower为下限位,upper为上限位,velocity为关节旋转的速度.
在rviz中显示效果如下:
在这里插入图片描述
紧接着添加剩余五个关节:

<!-- ///   LINK2  // -->
	<link name="link2">
		<visual>
			<origin rpy="0 0 0" xyz="0 0 0.07"/>
			<geometry>
				<cylinder length="0.14" radius="0.03"/>
			</geometry>
			<material name="White"/>
		</visual>
	</link>

	<joint name="joint2" type="revolute">
		<parent link="link1"/>
		<child link="link2"/>
		<origin rpy="-1.5707 0 1.5707" xyz="-0.1 0 0.0"/>
		<axis xyz="1 0 0"/>
		<limit effort="300" lower="-3.14159" upper="3.14159" velocity="1"/>
	</joint>

<!-- /   LINK3  / -->
	<link name="link3">
		<visual>
			<origin rpy="0 0 0" xyz="0 0 -0.075"/>
			<geometry>
				<cylinder length="0.15" radius="0.03"/>
			</geometry>
			<material name="Blue"/>
		</visual>
	</link>

	<joint name="joint3" type="revolute">
		<parent link="link2"/>
		<child link="link3"/>
		<origin rpy="0 3.14159 0" xyz="0 0 0.14"/>
		<axis xyz="-1 0 0"/>
		<limit effort="300" lower="-3.14159" upper="3.14159" velocity="1"/>
	</joint>

<!-- ///   LINK4   -->
	<link name="link4">
		<visual>
			<origin rpy="0 1.5707 0" xyz="0.03 0 0"/>
			<geometry>
				<cylinder length="0.06" radius="0.025"/>
			</geometry>
			<material name="Black"/>
		</visual>
	</link>

	<joint name="joint4" type="revolute">
		<parent link="link3"/>
		<child link="link4"/>
		<origin rpy="0 1.5707 3.14159" xyz="0.0 0.0 -0.15"/>
		<axis xyz="1 0 0"/>
		<limit effort="300" lower="-3.14159" upper="3.14159" velocity="1"/>
	</joint>

<!-- //   LINK5  / -->
	<link name="link5">
		<visual>
			<origin rpy="0 0 0" xyz="0 0 0.03"/>
			<geometry>
				<cylinder length="0.06" radius="0.03"/>
			</geometry>
			<material name="White"/>
		</visual>
	</link>

	<joint name="joint5" type="revolute">
		<parent link="link4"/>
		<child link="link5"/>
		<origin rpy="0 1.5707 0" xyz="0.06 0.0 0.0"/>
		<axis xyz="1 0 0"/>
		<limit effort="300" lower="-3.14159" upper="3.14159" velocity="1"/>
	</joint>

<!--    LINK6  / -->
	<link name="link6">
		<visual>
			<origin rpy="0 1.5707 0" xyz="0.01 0 0 "/>
			<geometry>
				<cylinder length="0.02" radius="0.04"/>
			</geometry>
			<material name="Blue"/>
		</visual>
	</link>

	<joint name="joint6" type="revolute">
		<parent link="link5"/>
		<child link="link6"/>
		<origin rpy="4.712385 -1.5707 0" xyz="0 0 0.06"/>
		<axis xyz="1 0 0"/>
		<limit effort="300" lower="-6.28318" upper="6.28318" velocity="1"/>
	</joint>

添加后效果如下:
在这里插入图片描述通过左边的gui控件可以控制机械臂各个关节的运动.
通过tf坐标下的tree,我们可以看到关节都是一层套一层的:
在这里插入图片描述tf坐标下的Frames选项可以看到每一个关节的相对坐标和绝对坐标,因为我们一开始定义的Fixed Frame(全局坐标系)为base_link,所以这里每一个关节的绝对坐标都是相对于base_link来定义的:
在这里插入图片描述这里的Position和Orientation为相对于base_link的绝对位置,而Relative Position和Relative Orientation则是当前关节相对于父关节的相对位置。

6.创建机械臂夹爪

在marm.urdf中添加如下代码:

<!-- //   GRIPPER   // -->
	<link name="gripper_finger_link1">
		<visual>
			<origin rpy="0 1.5707 0" xyz="0.03 0 0"/>
			<geometry>
				<box size="0.03 0.01 0.06"/>
			</geometry>
			<material name="White"/>
		</visual>
	</link>

	<link name="gripper_finger_link2">
		<visual>
			<origin rpy="0 1.5707 0" xyz="0.03 0 0"/>
			<geometry>
				<box size="0.03 0.01 0.06"/>
			</geometry>
			<material name="White"/>
		</visual>
	</link>

	<joint name="finger_joint1" type="prismatic">
		<parent link="link6"/>
		<child link="gripper_finger_link1"/>
		<origin rpy="0 0 0" xyz="0.02 -0.03 0"/>
		<axis xyz="0 1 0"/>
		<limit effort="100" lower="0" upper="0.06" velocity="0.02"/>
	</joint>

	<joint name="finger_joint2" type="fixed">
		<parent link="link6"/>
		<child link="gripper_finger_link2"/>
		<origin rpy="0 0 0" xyz="0.02 0.03 0"/>
	</joint>

这里两个机械臂夹爪手指头通过joint分别装配到机械臂终端关节link6上,夹爪关节的joint1使用的是prismatic类型,是一个平移关节类型,可以做平移运动,而joint2使用的是fixed类型,是一个固定关节类型,不能运动。加入夹爪关节后,效果如下:
在这里插入图片描述

7.设置机械臂抓取点坐标系

添加如下代码:

<!-- //   GRASPING FRAME   // -->
	<link name="grasping_frame"/>
	
	<joint name="grasping_frame_joint" type="fixed">
		<parent link="link6"/>
		<child link="grasping_frame"/>
		<origin rpy="0 0 0" xyz="0.06 0 0"/>
	</joint>

这里其实无实际含义,是一个虚的坐标系,这只是为了创建一个与link6相对的一个坐标系,方便后面对抓取点进行描述和计算。
在这里插入图片描述可以看到这个坐标系位于夹爪的中间。日后要计算抓取位置时,只需要计算该坐标系原点与物体相对位置即可。

8.查看各坐标系的相对位置

在终端中输入以下命令:

cd ~/moveit_ws/src/marm_description/urdf
urdf_to_graphiz marm.urdf

可以看到在文件夹下生成了一个pdf文件,这个文件描述了各关节间的位置关系,如下图所示:
在这里插入图片描述

总结

至此,一个基本的六轴机械臂urdf模型就创建完成了。

  • 10
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值