ROS建模:从零手写机械臂的URDF模型

14 篇文章 0 订阅

上一篇博客为【ROS建模:一起从零手写URDF模型】:

https://blog.csdn.net/qq_54900679/article/details/135726348?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135726348%22%2C%22source%22%3A%22qq_54900679%22%7D

这次我们继续来学习URDF模型,开始进行机械臂部分的URDF模型学习:

我们以6DOF的机械臂为例子

 算上夹爪的自由度,整个机械臂的DOF=7

下面我们开始进行创建,来到我们的工作空间下,创建功能包:

进入src文件夹中打开一个终端,运行如下命令:

catkin_create_pkg marm_description urdf xacro

发现marm_description功能包创建成功。

继续进入marm_description功能包中,下面分别创建4个文件夹:

下面进入urdf文件夹后开启一个终端后输入:

touch marm.urdf

打开刚刚创建的urdf文件,复制粘贴如下内容并保存:

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

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

下面进入到 launch 文件中去,开启一个终端后输入:

touch display_marm_urdf.launch

打开刚刚创建的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>

下面来到这个文件夹的页面处:

在工作空间下进行编译,让环境变量能够找到功能包:

conda activate hjx

catkin_make

出现以下截图界面:

 下面任意开启一个终端来运行launch文件,指令:

roslaunch marm_description display_marm_urdf.launch

会出现如下Rviz界面:

下面点击——> Add,找到RobotModel; 再点击 Fixed Frame 并将其更改为 base_link:

下面为防止每次打开模型文件时都要添加Add,可以进行rviz模型的保存:

在开启的rviz中点击File——> Save config As:

找到我们功能包下面的config文件夹后,点击进行,进行命名(自定义):

再点击save保存即可

OK,下次如果调整rviz整个界面的时候,按ctrl+s即可保存界面中的整个配置,保存至刚刚完成命名的config文件夹中

----------------------------------------------------------------------------------------

下面在此基础上依次建立其他的joint和link, 将urdf文件改为:

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

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

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

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

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

</robot>

再次执行launch指令,进入你自己设定的conda环境中:

conda activate hjx

roslaunch marm_description display_marm_urdf.launch

下面添加TF,如果觉得TF太粗,可以进行大小设置:

在Displays中的Frames中,可以查看各个link之间的坐标系关系,如下图:

显示了base_link和link6之间的坐标系,其中link6下的position和orientation,表示link6相对于base_link的坐标位姿(相对位置,相对姿态)。base_link相当于全局坐标系。

而link6下的Relative position和Relative orientation则表示link6相对于上一个link5的位姿。

值得注意的是,在urdf文件中,最后一段代码描述的是夹爪位置的抓取点坐标:

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

对应于下面的rviz显示中圈出的坐标系:

 这个只是生成一个坐标系,并没有连杆link,用于抓取点位的算法控制,方便设置抓取点

-----------------------------------------------------------------------------------

最后,我们来检查一下URDF模型的整体结构,可以借助下面的工具进行查看:

进入到urdf文件夹中开启一个终端,在终端中输入并执行如下指令:

urdf_to_graphiz marm.urdf

 显示如下:

点开marm.pdf文件:

通过树形图来描述各个link,各个joint之间的联系,这种描述可视化方便对urdf文件的检查。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随机惯性粒子群

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值