从0手写两轮差速机器人urdf模型

文章目录

  • 前言
  • 一、基本理论
  • 二、实现步骤
    • 1.创建一个机器人建模功能包
    • 2.使用圆柱体创建一个车体模型
    • 2.同理创建机器人其它构件
    • 3.机器人模型添加传感器


前言

最近为找到与自己课题应用场景相适应的机器人结构,对机器人建模方面的内容进行了了解和学习,计划是通过solidworks自己设计一个机器人模型,然后将其导入到gazebo仿真环境下进行三维世界的仿真。先实现最简单的创建两轮差速机器人urdf模型


一、基本理论

URDF(Unified Robot Description Format)即统一机器人描述格式,是ROS中一个非常重要的机器人模型描述格式,包含link和joint自身及相关属性的描述信息,可以通过手写URDF文件中XML格式代码来构建自己的机器人模型。
<link>
(1)描述机器人某个刚体部分的外观和物理属性
(2)描述连杆尺寸(size)、颜色(color)、形状(shape)、惯性矩阵(inertial matrix)、碰撞参数(collision properties)等
(3)每个link会成为一个坐标系
<joint>
(1)描述两个link之间的关系,分为六种类型
(2)包括关节运动的位置和速度限制
(3)描述机器人关节的运动学和动力学属性

<robot>
(1)完整机器人模型的最顶层标签
(2)和标签都必须包含在标签内
(3)一个完整的机器人模型,由;一系列和组成

二、实现步骤

1.创建一个机器人建模功能包

(1)创建工作空间:mkdir -p ~/test_ws/src
在这里插入图片描述

(2)在新创建的test工作空间的src文件夹中创建mbot_description建模功能包,即在src文件夹下,打开终端,输入:

catkin_create_pkg mbot_description urdf xacro

在这里插入图片描述(3)在mbot_description功能包下床价以下4个文件夹:

urdf: 存放机器人模型的URDF或xacro文件

meshes: 放置URDF中饮用的模型渲染文件

launch: 保存相关启动文件

config: 保存rviz的配置文件
在这里插入图片描述

2.使用圆柱体创建一个车体模型

(1)进入mbot_description功能包中的urdf文件夹,打开终端,输入:

touch mbot.urdf

在这里插入图片描述
(2)手写link和node对机器人模型进行描述
base_link

<?xml version="1.0" ?>   	 <!-- xml版本号为1.0 -->
<robot name="mbot">      	 <!--设置机器人的名字 --><link name="base_link">   			                <!--设置link名字:base_link为底盘 --><visual>									    <!--visual为可视化部分 --><origin xyz=" 0 0 0" rpy="0 0 0" />  	    <!--机器人的初始位置 --><geometry><cylinder length="0.16" radius="0.20"/> <!--机器人主体设为圆柱体,高度0.16m,半径0.20m --></geometry><material name="Yellow"/>					<!--设置机器人底座的外观颜色 --></visual></link></robot>

颜色 material

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

(3)写launch文件调用rviz进行显示

进入工作空间的launch文件夹中,打开终端,输入:

touch display_mbot_urdf.launch

在这里插入图片描述
在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>

运行launch文件前在工作空间下进行编译,在终端输入catkin_make,确保环境变量能够找到功能包。
颜色 material

    <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>
```![在这里插入图片描述](https://img-blog.csdnimg.cn/b3bdaecc9d874c22ba9afb7875504364.png#pic_center)
启动mbot_description.launch文件,打开终端输入:```cpp
roslaunch mbot_description display_mbot_urdf.launch

出现报错:
在这里插入图片描述在终端输入:

echo 'source ~/test_ws/devel/setup.bash' >> ~/.bashrc
source .bashrc

在这里插入图片描述
再次启动mbot_description.launch文件,可成功启动

在这里插入图片描述
通过Add来添加一个机器人模型:

在这里插入图片描述
报错No transform from [base_link] to [map],将Fixed Frame改为base_link,可成功显示机器人底盘,如图:

mbot_description.launch在这里插入图片描述
为避免下次启动还要重新添加一遍,保存一下
mbot_description.launch
在这里插入图片描述

2.同理创建机器人其它构件

左轮 left_wheel_link

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

右轮 right_wheel_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><joint name="right_wheel_joint" type="continuous"><origin xyz="0 -launch0.19 -0.05" rpy="0 0 0"/><parent link="base_link"/><child link="right_wheel_link"/><axis xyz="0 1 0"/></joint>

前后支撑轮 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>

创建成功,运行mbot_description.launch文件,如图:
在这里插入图片描述

3.机器人模型添加传感器

(1)添加激光雷达
保存上面构建的机器人呢小车基本模型,在urdf文件夹下复制mbot.urdf文件,重新起名为mbot_with_laser.urdf
在这里插入图片描述
mbot_with_laser.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>

添加启动的display_mbot_with_laser_urdf.launch文件

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

启动launch文件如下图:
在这里插入图片描述
(2)添加kinect相机
同理复制mbot.urdf文件,重命名display_mbot_with_kinect_urdf.launch
在这里插入图片描述

深度相机 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>

添加启动的display_mbot_with_kinect_urdf.launch文件

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

启动launch文件如下图:
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/147272.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数组及指针经典笔试题解析】

1.数组和指针笔试题 题目1 int main(){int a[5] { 1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5};int * ptr (int * )(&a 1);printf("%d&#xff0c;%d"&#xff0c;*(a 1)&#xff0c;*(ptr - 1));return 0;}图文解析&#xff1a; int * ptr …

【JavaEE】JavaScript webAPI的基本知识

JavaScript Web API 文章目录 JavaScript Web APIwebAPI背景DOMDOM树 获取元素querySelectorquerySelectorAll 事件初识键盘事件onkeydownonkeypressonkeyup 操作元素获取/修改元素内容1.innerText2.innerHTML 获取/修改元素属性获取/修改表单元素属性获取/修改样式属性行内样式…

redis的简单使用

文章目录 环境安装与配置redis发布-订阅相关命令redis发布-订阅的客户端编程redis的订阅发布的例子 环境安装与配置 sudo apt-get install redis-server # ubuntu命令安装redis服务ubuntu通过上面命令安装完redis&#xff0c;会自动启动redis服务&#xff0c;通过ps命令确认&a…

用于YOLO格式分割的咖啡叶病害数据集。

下载链接&#xff1a;https://download.csdn.net/download/qq_40840797/88389334 数据集&#xff0c;一共1164张照片 随机选取几张照片及对应的目标标签 因为健康&#xff0c;所以标签为空

[BJDCTF2020]The mystery of ip

打开环境 点击flag&#xff0c;提示ip&#xff0c;这里确实就比较容易联想到x-forwarded-for 点击hint 这个好像没啥用 使用bp抓包 添加请求头 X-Forwarded-For:1 试一下 发现ip可控 后来查了发现 PHP可能存在Twig模版注入漏洞 参考https://www.cnblogs.com/zzjdbk/p/13…

【C语言】循环结构程序设计 (详细讲解)

前言&#xff1a;前面介绍了程序中常常用到的顺序结构和选择结构&#xff0c;但是只有这两种结构是不够的&#xff0c;还有用到循环结构(或者称为重复结构)。因为在日常生活中或是在程序所处理的问题中常常遇到需要重复处理的问题。 【卫卫卫的代码仓库】 【选择结构】 【专栏链…

HTML的相关知识

1.什么是HTML&#xff1f;基本语法 HTML: Hyper Text Markup Language &#xff08;超文本标记语言&#xff09; 超文本&#xff1f;超级文本&#xff0c;例如流媒体&#xff0c;声音、视频、图片等。 标记语言&#xff1f;这种语言是由大量的标签组成。HTML标签参考手…

【数据结构】堆的应用-----TopK问题

目录 一、前言 二、Top-k问题 &#x1f4a6;解法一&#xff1a;暴力排序 &#x1f4a6;解法二&#xff1a;建立N个数的堆 &#x1f4a6;解法三&#xff1a;建立K个数的堆&#xff08;最优解&#xff09; 三、完整代码和视图 四、共勉 一、前言 在之前的文章中&#xff…

React18入门(第一篇)——JSX、TSX语法详解

文章目录 一、JSX 语法简介二、和 HTML 标签的几点不同三、JSX 属性四、JSX 事件4.1 简单点击事件4.2 类型限制4.3 带参数&#xff0c;箭头函数 五、插入 JS 变量六、JSX 中使用条件判断七、循环 一、JSX 语法简介 JSX - 是 JS 的扩展&#xff0c;写在 JS 代码里面&#xff0c…

计算机算法分析与设计(4)---凸多边形的最优三角划分(含C++代码)

文章目录 一、概述1.1 概念说明1.2 与矩阵连乘对应关系1.3 递归定义 二、代码 一、概述 1.1 概念说明 1. 用多边形顶点的逆时针序列表示凸多边形&#xff0c;即P{V0, V1, … Vn-1, Vn}表示具有n1条边的凸多边形。 2. 若Vi和Vj是多边形上不相邻的两个顶点&#xff0c;则线段ViV…

SEO搜索引擎

利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名&#xff0c;吸引更多的用户访问网站&#xff0c;提高网站的访问量&#xff0c;提高网站的销售能力和宣传能力&#xff0c;从而提升网站的品牌效应 搜索引擎优化的技术手段 黑帽SEO 通过欺骗技术和滥用搜索算法来推销毫不…

Armv8/Armv9 Cache知识大纲分享--思维导图

关键词&#xff1a;cache学习、mmu学习、cache资料、mmu资料、arm资料、armv8资料、armv9资料、 trustzone视频、tee视频、ATF视频、secureboot视频、安全启动视频、selinux视频&#xff0c;cache视频、mmu视频&#xff0c;armv8视频、armv9视频、FF-A视频、密码学视频、RME/CC…

力扣:118. 杨辉三角(Python3)

题目&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官…

DS线性表之链表

前言 我们上一期介绍了顺序表&#xff0c;它的底层就是数组&#xff0c;我们也分别对顺序表的动态版本和静态版本进行了实现&#xff01;并且分析了顺序表的优缺点&#xff0c;优点是&#xff1a;尾插、尾删效率很高&#xff0c;其时间复杂度是O(1)&#xff1b;缺点是&#xff…

使用 ClassFinal 对 java class 文件进行加密防止反编译

ClassFinal 是一款 java class文件安全加密工具&#xff0c;支持直接加密 jar 包或 war 包&#xff0c;无需修改任何项目代码&#xff0c;兼容 spring-framework&#xff1b;可避免源码泄漏或字节码被反编译 特点 无需修改原项目代码&#xff0c;只要把编译好的jar/war包用本工…

Nginx简介与Docker Compose部署指南

Nginx是一款高性能的开源Web服务器和反向代理服务器&#xff0c;以其卓越的性能、可伸缩性和灵活性而闻名。它在全球范围内广泛用于托管Web应用程序、负载均衡、反向代理和更多场景中。在本文中&#xff0c;我们将首先介绍Nginx的基本概念&#xff0c;然后演示如何使用Docker C…

tortoiseSVN树冲突解决方案

方案一&#xff1a; 手动导出 trunk 上的文件(夹)&#xff0c;把本地目录文件(夹)删了并替换成 trunk上的&#xff0c;再点击测试合并方案二&#xff1a; 如果执行了方案一还是冲突&#xff0c;确认本地和trunk文件一致后&#xff0c;可以跳过冲突的revision

【NLP的python库(03/4) 】: 全面概述

一、说明 Python 对自然语言处理库有丰富的支持。从文本处理、标记化文本并确定其引理开始&#xff0c;到句法分析、解析文本并分配句法角色&#xff0c;再到语义处理&#xff0c;例如识别命名实体、情感分析和文档分类&#xff0c;一切都由至少一个库提供。那么&#xff0c;你…

Linux--socket编程

socket套接字编程 一、服务器和客户端的开发步骤&#xff1a; 1、创建套接字 2、为套接字添加信息&#xff08;ip地址和端口号&#xff09; 3、监听网络连接 4、监听到有客户端接入&#xff0c;接受连接&#xff08;如没有接入&#xff0c;会发生阻塞到&#xff09; 5、数据…

【机器学习】熵和概率分布,图像生成中的量化评估IS与FID

详解机器学习中的熵、条件熵、相对熵、交叉熵 图像生成中常用的量化评估指标通常有Inception Score (IS)和Frchet Inception Distance (FID) Inception Score (IS) 与 Frchet Inception Distance (FID) GAN的量化评估方法——IS和FID&#xff0c;及其pytorch代码