建模练习2 —— 手写一个机械臂的urdf模型

  • Post author:
  • Post category:其他


建模练习2 —— 手写一个机械臂的urdf模型

1.在catkin_ws/src下,创建功能包

catkin_create_pkg marm_description urdf xacro

在功能包中建立urdf、meshes、launch、config这四个文件夹,分别用于存放特定的文件

接下来编写marm.urdf文件

2.用圆柱创建机械臂的基座

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

<!-- /    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>

<!-- /    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>

</robot>

编写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>

编译工作空间后在rviz中查看

roslaunch marm_description display_marm_urdf.launch

在这里插入图片描述

3.添加基座上的第一个连杆

<!-- /   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>

在rviz中查看

在这里插入图片描述

4.添加基座上的第二个连杆

<!-- ///   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>

在rviz中查看

在这里插入图片描述

5.添加基座上的第三个连杆

<!-- /   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>

在rviz中查看

在这里插入图片描述

6.添加基座上的第四个连杆

<!-- ///   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>

在这里插入图片描述

7.添加基座上的第五个连杆

<!-- //   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>

在这里插入图片描述

8.添加基座上的第六个连杆

<!--    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>

在这里插入图片描述

9.添加两个夹爪

<!-- //   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>

在这里插入图片描述

这里边finger_joint1用的是prismatic(平移),它是个主动关节,而finger_joint2用的是fixed,它是不能动的。

10.添加一个虚拟坐标系

<!-- //   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产生的描述。

在这里插入图片描述

这个坐标系位于两个手指之间,相当于未来的抓取点,比如用该机械臂抓取一个木块,那么就可以通过判断这个坐标系原点是否到达了木块的位置,从而实施抓取动作。

在很多的ROS建模中会遇到base_footprint这样的link,这个link并没有太多的含义,他只是去创建一个机器人映射到地面投影的一个坐标系,一般坐标系的原点都位于地面,方便后续做一些导航、建模相关工作。

11.检查urdf模型整体结构

进入urdf文件夹下

urdf_to_graphiz marm.urdf

在这里插入图片描述
在这里插入图片描述



版权声明:本文为huangjunsheng123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。