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

目录

  • 前言
  • 一、创建工作空间
    • 1.新建工作空间文件夹moveit_ws
    • 2.对工作空间moveit_ws进行编译
    • 3.设置环境变量
  • 二、创建机器人建模的功能包
  • 三、创建URDF模型
    • 1.添加robot标签
    • 2.使用link标签创建底盘
        • 1.添加颜色参数
        • 2.配置底盘参数
    • 3.编写launch文件并查看底盘创建效果
        • 配置rviz参数并显示底盘模型
    • 4.使用link标签创建车轮,并利用joint标签将轮子与底盘连接起来
        • 1.使用link标签创建车轮模型
        • 2.使用joint标签将车轮模型与底盘连接起来
    • 5.使用link标签创建支撑轮,并利用joint标签将轮子与底盘连接起来
    • 6.在底盘模型上添加激光雷达以及深度相机传感器
      • 1.添加激光雷达
      • 2.添加kinect深度相机
  • 总结
  • 参考阅读


前言

最近新入手一款机械臂,同时想学习机器人建模相关知识,所以购买了古月居的从零手写urdf模型课程,该文章是用以记录学习过程以及踩过的坑的。


一、创建工作空间

进行ros开发所需要的第一步就是创建工作空间,创建工作空间步骤如下:

1.新建工作空间文件夹moveit_ws

创建src文件,存放功能包源码:

mkdir -p ~/moveit_ws/src

进入src文件夹:

cd ~/moveit_ws/src

初始化文件夹:

catkin_init_workspace 

完成这步以后,在src目录下会创建一个CMakelists.txt文件,初始化后,系统就知道这个文件夹是ROS的工作空间了。

2.对工作空间moveit_ws进行编译

进入moveit_ws文件夹:

cd ~/moveit_ws/

对工作空间进行编译(注:所有编译工作都需要在工作空间文件夹moveit_ws内进行):

catkin_make

编译成功后,会发现多了两个文件夹,分别是devel和build,如下图所示:
从零手写移动机器人URDF模型学习记录(一)_第1张图片

3.设置环境变量

该操作是将新建的工作空间环境变量设置到Ubuntu系统的bashrc中,设置后就不用每次电脑重启后都要source一遍,就能找到工作空间下的launch等文件了。

echo "source ~/moveit_ws/devel/setup.bash" >> ~/.bashrc

让上面的配置在当前终端生效:

source ~/.bashrc 

二、创建机器人建模的功能包

功能包是ROS中组织代码的基本容器,方便我们进行编译、安装、分发开发的代码,一般来讲,每个功能包都是用来完成某项具体的功能相对完整的单元。这里,在进行机器人建模前,也需要对其创建一个功能包。

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

 cd ~/moveit_ws/src/

创建功能包,这里,创建格式为(catkin_create_pkg+功能包名字+依赖项1+依赖项2):

catkin_create_pkg mbot_description urdf xacro

这里,urdf和xacro都是用来解析模型的功能包依赖项。

创建成功后,打开src文件夹下刚创建好的功能包mbot_description,可以看到有以下文件:
从零手写移动机器人URDF模型学习记录(一)_第2张图片这两个文件是功能包所必须的,CMakelists.txt文件直接规定了这个功能包需要依赖哪些package,要编译生成哪些目标,如何编译等流程,而package.xml文件则是这个软件包的描述文件,包含了该功能包的名称、版本号、维护人员等信息。

在创建好的功能包mbot_description下,新建如下图所示的四个文件夹:
从零手写移动机器人URDF模型学习记录(一)_第3张图片其中,urdf文件夹用以存放机器人模型的urdf或者xacro文件,meshes文件夹用以防止urdf中引用的模型渲染文件(如使用solidworks导出的stl文件等),launch文件夹用以保存相关launch启动文件,config文件夹用以保存rviz的配置文件。

三、创建URDF模型

URDF的全称是Unified Robot Description Format,统一机器人描述格式,是ROS中一个重要的机器人描述格式,用以对机器人进行建模。ROS同时也提供urdf文件的C++解析器,可以解析urdf文件中使用的xml格式描述的机器人模型。

进入urdf文件夹:

cd ~/moveit_ws/src/mbot_description/urdf/

创建urdf模型文件并打开:

touch mbot.urdf
gedit mbot.urdf

在urdf文件夹内添加xml格式的模型代码,课程配套代码可以到:https://github.com/guyuehome/guyueclass/tree/main/ros_basic/handwriting_urdf/mbot_description找。

1.添加robot标签

robot标签是用以描述整个机器人的。这里要注意的是xml语言中标签是要闭合的,要是不闭合的话后面是会报错误的,刚开始时就是因为将老师的代码直接一段段拷贝过来忘记了闭合标签,导致花了不少时间去找错误,所以一定得注意闭合标签。


<robot name="mbot">

robot>

这里第一行是对xml语言的版本号进行描述,声明以下代码是使用xml语言进行编写的;mbot是所创建机器人模型的名称,在两个robot标签之间就可以添加模型配置参数了。

2.使用link标签创建底盘

link标签是用以描述机器人某个刚体部分的外观和物理属性的,其参数包括连杆尺寸(size)、颜色(color)、形状(shape)、惯性矩阵(inertial matrix)、碰撞参数(collision properties)等。

1.添加颜色参数

在两个robot标签中间添加如下代码:


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

这里的material标签与函数功能相类似,后面在link标签中间使用material标签并赋予对应颜色的名字参数,即可将link渲染成目标颜色。color参数rgba分别代表红色、蓝色、绿色、透明度的比例,取值为0-1。

2.配置底盘参数

在color代码下添加如下代码:


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

这里,visual标签用以描述底盘的外观状态,在visual标签中间可对link外观进行具体设置;origin标签定义底盘所处位置,其中xyz为所处空间三维坐标,rpy则是底盘在该坐标下旋转的角度;geometry标签用以定义底盘的形状,这里cylinder定义底盘形状为圆柱体,length是圆柱体的高(单位是米),radius是圆柱体的半径(单位是米),要是想使用自己所画出的几何模型stl文件,在geometry标签中也可通过格式"mesh filename=“xxx.stl”"进行导入;material标签用以对底盘颜色进行定义。

保存urdf文件,底盘创建完成。

3.编写launch文件并查看底盘创建效果

创建好底盘后,可通过编写launch文件,启动rviz查看底盘的创建效果

进入launch文件夹:

cd ~/moveit_ws/src/mbot_description/launch/

创建display_mbot_urdf.launch文件:

touch display_mbot_urdf.launch

打开创建好的launch文件:

gedit display_mbot_urdf.launch 

添加如下代码:

<launch>
	
	<param name="robot_description" textfile="$(find mbot_description)/urdf/mbot.urdf" />

	
	<node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
	
	
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
	
	
	<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" />
launch>

param标签是用以描述参数的,所描述参数会保存到ROS master中;textfile参数描述的是一个路径,用以表示机器人模型在哪个路径下,通过启动文件到该路径中将urdf文件加载出来;rviz节点是用以加载rviz配置文件,同时打开上位机,通过rviz上位机可以看到创建的urdf机器人模型。

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

cd ~/moveit_ws/
catkin_make

编译完成后,重启终端,使用roslaunch命令启动display_mbot_urdf.launch文件:

roslaunch mbot_description display_mbot_urdf.launch 

输入命令后,可以看到rviz界面打开:
从零手写移动机器人URDF模型学习记录(一)_第4张图片

配置rviz参数并显示底盘模型

点击Add,添加机器人模型RobotModel:
从零手写移动机器人URDF模型学习记录(一)_第5张图片从零手写移动机器人URDF模型学习记录(一)_第6张图片这里可以看到模型已经被添加进来了,但是左边base_link有报错,说没有一个从base_link到map坐标系的变换,这里需要将Global Options下Fixed Frame名称修改为base_link,错误就会消失了:
从零手写移动机器人URDF模型学习记录(一)_第7张图片可以看到机器人底盘已经创建完成。

为避免下次重新启动launch文件需要重新配置参数,这里对当前rviz参数配置进行保存:
点击rviz界面左上角的file–>Save Config As,选择mbot_description下的config文件夹,命名mbot_urdf并进行保存,这样,下次启动时就会加载该文件参数,无需再次设置参数了。

4.使用link标签创建车轮,并利用joint标签将轮子与底盘连接起来

1.使用link标签创建车轮模型

重新打开urdf文件夹下的mbot.urdf文件,在base代码下添加如下代码:


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

    <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>
2.使用joint标签将车轮模型与底盘连接起来

joint标签用于描述机器人的运动学和运动学属性,包括关节运动的位置和速度限制。机器人关节运动形式可分为六种:1.continues(旋转关节,围绕单个无限旋转) 2.revolute (旋转关节,有旋转角度限制) 3.prismatic (滑动关节,沿某一轴线移动的关节,带有位置限制) 4.planar (平面关节,允许在平面正交方向上平移或旋转) 5.floating (浮动关节,允许进行平移、旋转运动) 6.fixed (固定关节,不允许运动的特殊关节)

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

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

这里,定义左右轮均为continues旋转关节类型;origin标签用以定义轮子方位;parent和child标签分别用以定义两个连接关节的从属关系,这里底盘是父关节,轮子是子关节;axis标签用以定义旋转的轴,这里定义绕y轴旋转。

保存后,通过launch文件启动,效果如下:
从零手写移动机器人URDF模型学习记录(一)_第8张图片
可以看到轮子镶嵌到了底盘上,并且左边gui界面可以通过滑动滑块对轮子关节状态进行发布,从而控制轮子的转动。

同时,可以通过rviz中的add添加tf坐标系视角,更直观的看到三个空间状态的变化,效果如下:
从零手写移动机器人URDF模型学习记录(一)_第9张图片
到这里,旋转轮就创建好了。但仅有旋转轮还不能把底盘稳定的放在地上,还需有支撑轮,因此,下一步就是创建支撑轮。

5.使用link标签创建支撑轮,并利用joint标签将轮子与底盘连接起来

在wheel代码后,添加如下代码:


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

front_caster和back_caster分别是前后支撑轮,支撑轮的形状是圆球(sphere),半径是0.015米;使用的关节类型是fixed(固定关节)类型,将支撑轮固定到底盘上。
保存urdf文件后,通过launch启动rviz,效果如下图:

从零手写移动机器人URDF模型学习记录(一)_第10张图片
可以看到,支撑轮已添加到底盘上。
至此,一个基本的urdf机器人底盘模型就创建完毕了。

6.在底盘模型上添加激光雷达以及深度相机传感器

1.添加激光雷达

在mbot.urdf文件中添加如下代码:


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

在工作空间根目录moveit_ws下进行编译,编译后通过roslaunch命令启动rviz:

cd ~/moveit_ws
catkin_make
roslaunch mbot_description display_mbot_urdf.launch

效果如下图:
从零手写移动机器人URDF模型学习记录(一)_第11张图片

2.添加kinect深度相机

在mbot.urdf文件中添加如下代码:


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

这里,深度相机的模型不再是使用简易的模型,而是使用与真实深度相机1:1比例的真实模型,通过mesh标签对深度相机模型进行导入,而这里的深度相机模型文件,可在guyuehome这里找到。将下载好的三个模型文件,放在之前创建好的meshes文件夹下。

在工作空间根目录moveit_ws下进行编译,编译后通过roslaunch命令启动rviz,效果如下:
从零手写移动机器人URDF模型学习记录(一)_第12张图片

总结

至此,一个简易的带传感器的urdf模型就已经创建完毕了,下一篇文章将记录简易机械臂urdf模型的创建。

参考阅读

机器人Urdf模型
ROS探索总结(二十三)——解读URDF

你可能感兴趣的:(自动驾驶,ubuntu,人工智能)