目录

  • 前言
  • 一、创建工作空间
    • 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,如下图所示:

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,可以看到有以下文件:
这两个文件是功能包所必须的,CMakelists.txt文件直接规定了这个功能包需要依赖哪些package,要编译生成哪些目标,如何编译等流程,而package.xml文件则是这个软件包的描述文件,包含了该功能包的名称、版本号、维护人员等信息。

在创建好的功能包mbot_description下,新建如下图所示的四个文件夹:
其中,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语言中标签是要闭合的,要是不闭合的话后面是会报错误的,刚开始时就是因为将老师的代码直接一段段拷贝过来忘记了闭合标签,导致花了不少时间去找错误,所以一定得注意闭合标签。

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

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

2.使用link标签创建底盘

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

1.添加颜色参数

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

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

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

2.配置底盘参数

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

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

这里,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" /><!-- 运行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>

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界面打开:

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

点击Add,添加机器人模型RobotModel:
这里可以看到模型已经被添加进来了,但是左边base_link有报错,说没有一个从base_link到map坐标系的变换,这里需要将Global Options下Fixed Frame名称修改为base_link,错误就会消失了:
可以看到机器人底盘已经创建完成。

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

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

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

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

<!-- /    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><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文件启动,效果如下:

可以看到轮子镶嵌到了底盘上,并且左边gui界面可以通过滑动滑块对轮子关节状态进行发布,从而控制轮子的转动。

同时,可以通过rviz中的add添加tf坐标系视角,更直观的看到三个空间状态的变化,效果如下:

到这里,旋转轮就创建好了。但仅有旋转轮还不能把底盘稳定的放在地上,还需有支撑轮,因此,下一步就是创建支撑轮。

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

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

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

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


可以看到,支撑轮已添加到底盘上。
至此,一个基本的urdf机器人底盘模型就创建完毕了。

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

1.添加激光雷达

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

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

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

cd ~/moveit_ws
catkin_make
roslaunch mbot_description display_mbot_urdf.launch

效果如下图:

2.添加kinect深度相机

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

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

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

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

总结

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

参考阅读

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

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

  1. [Django]模型学习记录篇--基础

    模型学习记录篇,仅仅自己学习时做的记录!!! 实现模型变更的三个步骤: 修改你的模型(在models.py文件中). 运行python manage.py makemigrations ,为这些修改创 ...

  2. 空间计量模型学习记录

    空间计量模型学习记录 空间计量模型模型分类 OSL模型 空间滞后模型 空间误差模型 自变量空间滞后模型 空间杜宾模型 空间杜宾误差模型 操作方式参考 参考文章 空间自回归模型-OLS.SLM.SEM理 ...

  3. linux父设备,linux 设备模型---学习记录(二)

    通过bus_register()函数可以弄清楚整个设备模型的骨架.大致的架构弄清楚之后就可以继续填充这个模型了.根据总线.设备.驱动由高层到底层的顺序,可以以设备为入口点来继续探索. 设备的入口在de ...

  4. DAB-Deformable-DETR代码学习记录之模型构建

    DAB-DETR的作者在Deformable-DETR基础上,将DAB-DETR的思想融入到了Deformable-DETR中,取得了不错的成绩.今天博主通过源码来学习下DAB-Deformable- ...

  5. 概率图模型学习笔记:HMM、MEMM、CRF

    作者:Scofield 链接:https://www.zhihu.com/question/35866596/answer/236886066 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权 ...

  6. 不平等博弈问题学习记录(一)(超实数篇)

    前言 听到博弈问题,第一个想到的想必是用SG函数做的博弈题,就比如Nim游戏 Nim游戏: 有N堆石子,每次选一堆石子,拿走若干石子(不能不取),先不能取的人输 定义个SG函数 对于SG函数,大致就记 ...

  7. ROS学习记录9——urdf文件的创建与使用

    零.前言 在学习这一节之前,至少得明白如何创建一个工作空间,如何编译工作空间,如何运行工作空间里的文件(把工作空间的环境目录添加到环境里).如果有不会的,请看鄙人的ROS学习记录3. 本节默认工作空间 ...

  8. seq2seq模型_Pytorch学习记录-Seq2Seq模型对比

    Pytorch学习记录-torchtext和Pytorch的实例4 0. PyTorch Seq2Seq项目介绍 在完成基本的torchtext之后,找到了这个教程,<基于Pytorch和tor ...

  9. ROS学习记录(二)阿克曼转向车运动学模型及在gazebo中搭建仿真环境

    前言:该篇是ROS学习记录的第二篇,如果还没关注过之前文章的读者,如有需要可以通过下方传送门去看之前的文章: ROS学习记录(一) Plugin插件 这两天关注了古月老师的公众号,看到了其中一篇课程推 ...

最新文章

  1. 笔记:2016-06-03
  2. inotify结合rsync监控目录的实时变化
  3. java环境变量(win10 java8)
  4. 019_html超链接
  5. 卫星参数大全_【视频】早期国外做工精良的海事卫星电话机拆解
  6. win10宽带连接断网自动重连
  7. Bzoj 2662: [BeiJing wc2012]冻结 dijkstra,堆,分层图,最短路
  8. (转载)spring配置hibernate 事务。
  9. 求二叉树中以x为根的子树的深度_还在玩耍的你,该总结啦!(本周小结之二叉树)...
  10. 数据结构-线性相关代码
  11. 二维数组作为形参的参数传递问题[08-0704]-转
  12. php header 无法跳转,PHP利用header跳转失效解决方法
  13. shell脚本练习题
  14. Spring Boot 集成 Spring Security 实现权限认证模块
  15. C++ stdio.h详解
  16. 移除联想M5210阵列卡(3650M5)的缓存模块以开启JBOD模式
  17. pcfg 自然语言处理_自然语言处理的笔记
  18. 前缀和-python
  19. Linux面试指令---nl指令
  20. 运算放大器的交流放大分析

热门文章

  1. 如何去选取第一批要阅读的论文?_【手把手教你写论文】第二期:文献阅读进行时...
  2. ESP32ADC采样率配置(基于ESP-IDF)
  3. 除了Java,还可以培训学习哪些IT技术?
  4. 周立功阅读笔记-CANopen轻松入门基于DS301(一)
  5. com.amap.api.services.core.AMapException: ***确保调用SDK任何接口前先调用更新 3dmap: 隐私合规校验失败
  6. 如何用读书构建你的思维世界
  7. HTC VIVE VR眼镜的介绍以及初始化设置
  8. 亲爱的,你是吃屎了么
  9. howler.js_异步加载音频文件并使用howler.js播放
  10. 用超级计算机打游戏是什么样的体验,[Quora] 在超级计算机上玩游戏是一种怎样的体验?...