建模练习1 —— 手写一个移动机器人urdf模型

学习了好一阵子Gazebo相关和Moveit相关知识,本以为搭建husky和kinova机械臂仿真环境只不过是把下载的软件包修修改改就好了,没必要深究这两个机器人的细致之处,而事实是,经修改后的仿真模型总是bug百出,可能自己还是掌握的不扎实,所以从零开始,看看如何一步一步建模,看看自己“篡改”的代码究竟哪里出了错。

本博客按照古月大神的视频课程整理学习笔记,旨在方便自己今后的回顾与学习。

1 机器人的定义与组成

在这里插入图片描述

2 URDF建模方法

URDF:

  • Unfied Robot Description Format,统一机器人描述格式;
  • 可以解析URDF文件中使用XML格式描述的机器人模型;
  • 包含link和joint自身及相关属性的描述信息;

2.1 < link >

  • 描述机器人某个刚体部分的外观和物理属性
  • 描述连杆尺寸(size)、颜色(color)、形状(shape)、惯性矩阵(inertial matrix)、碰撞参数(collision properties)等
  • 每个link都会成为一个坐标系

link的充分描述需要有三大部分:< visual >< collision >< inertial matrix >

  <!-- Base link is the center of the robot's bottom plate -->
  <link name="base_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <mesh filename="package://husky_description/meshes/base_link.dae" />
      </geometry>
    </visual>
    <collision>
      <origin xyz="${( husky_front_bumper_extend - husky_rear_bumper_extend ) / 2.0} 0 ${base_z_size/4}" rpy="0 0 0" />
      <geometry>
        <box size="${ base_x_size + husky_front_bumper_extend + husky_rear_bumper_extend } ${base_y_size} ${base_z_size/2}"/>
      </geometry>
    </collision>
    <collision>
      <origin xyz="0 0 ${base_z_size*3/4-0.01}" rpy="0 0 0" />
      <geometry>
        <box size="${base_x_size*4/5} ${base_y_size} ${base_z_size/2-0.02}"/>
      </geometry>
    </collision>
  </link>

这是husky中的base_link描述

      <origin xyz="0 0 0" rpy="0 0 0" />

其中的这句代码很关键,与坐标变换有关系,xyz表示在三个坐标轴上的平移变换,单位是米,rpy是坐标系下的旋转偏移,单位是弧度,分别是围绕x、y、z三轴旋转的角度。所以< visual >部分主要描述了长什么样、位置如何。

会发现< collision >部分的geometry是用box描述的,这样做的目的是简化模型,减少碰撞检测的计算量。

对于惯性矩阵参数,如果是标准几何体,就用公式计算即可,如果是不规则物体,则要借助工具比如Solidworks来计算了。

2.2 < joint >

  • 描述两个link之间的关系
  • 包括关节运动的位置和速度限制
  • 描述机器人关节的运动学和动力学属性
    在这里插入图片描述

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

    <origin xyz="0.2 0.2 0" rpy="0 0 0" />

描述child link相对于parent link的坐标变换关系。

<axis xyz="0 0 1"/>

说明z是旋转轴
在这里插入图片描述

3 从零写一个移动机器人URDF模型

在catkin_ws/src下,创建功能包

catkin_create_pkg mbot_description urdf xacro

在功能包中建立四个文件夹,分别用于存放特定的文件
接下来编写mbot.urdf文件

3.1 使用圆柱体创建底盘

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

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

 <!-- /    BASE    / -->
    <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"/>
        </visual>
    </link>

</robot>

然后编写display_mbot_urdf.launch文件,在rviz中可视化一下

<launch>
	<!-- 设置机器人模型路径参数 -->
	<param name="robot_description" textfile="$(find mbot_description)/urdf/mbot.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 mbot_description)/config/mbot_urdf.rviz" required="true" />
</launch>

catkin_make编译一下工作区
运行rviz

 roslaunch mbot_description display_mbot_urdf.launch

在这里插入图片描述简单配置:
Add->RobotModel,出现下图所示白色模型
在这里插入图片描述发现错误,其中的map坐标系是rviz默认的坐标系,这里需要将Fixed Frame改为base_link
在这里插入图片描述
这个base_link就是刚刚建立的base_link,所以说,每个link都会建立一个同名的坐标系。

Save Config As到自己的config文件夹下,下次再打开rviz时就会保存上述配置了。

3.2 使用圆柱体创建左侧车轮,继续添加

<!-- /    WHEEL    / -->

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

再用rviz看一下
在这里插入图片描述点击Add,添加TF,可以观看坐标系的姿态关系
在这里插入图片描述也可以把robotmodel取消掉,更直观的查看
在这里插入图片描述上图所示的箭头是一个向量,这个向量就是origin的内容
注意:
左轮的visual中的origin是描述左轮相对于第二个坐标系而言的

3.3 同理,添加右轮模型

    <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"/>
        </visual>
    </link>

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

在rviz中查看
在这里插入图片描述

3.4 这样的小车是无法直立的,再创建两个支撑轮

<!-- /    CASTER    / -->
    <link name="front_caster_link">
        <visual>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <geometry>
                <sphere radius="0.015" />
            </geometry>
            <material name="Black"/>
        </visual>
    </link>

    <joint name="front_caster_joint" type="fixed">
        <origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="front_caster_link"/>
    </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"/>
        </visual>
    </link>

    <joint name="back_caster_joint" type="fixed">
        <origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="back_caster_link"/>
    </joint>

在rviz中查看
在这里插入图片描述

3.5 到此,模型基本创建完毕,但是他还不能感知环境,所以,为他添加一些传感器,在上述基础上,添加laser的Link和joint

<!-- /    LASER    / -->
    <link name="laser_link">
		<visual>
			<origin xyz=" 0 0 0 " rpy="0 0 0" />
			<geometry>
				<cylinder length="0.05" radius="0.05"/>
			</geometry>
			<material name="Black"/>
		</visual>
    </link>

    <joint name="laser_joint" type="fixed">
        <origin xyz="0 0 0.105" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="laser_link"/>
    </joint>

用rviz查看
在这里插入图片描述

3.6 添加一个kinetic

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

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

同时注意在meshes文件夹中添加kinetic的3D描述文件
在rviz中查看
在这里插入图片描述

3.7 检查urdf模型整体结构

进入urdf目录下,以终端形式打开
在这里插入图片描述发现在urdf文件夹下生成了两个文件
在这里插入图片描述
这样以树形图的方式,joint和link一目了然,便于排查模型错误

在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值