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

news2025/2/26 2:30:33

文章目录

  • 前言
  • 一、基本理论
  • 二、实现步骤
    • 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.coloradmin.cn/o/1058034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

博途SCL区间搜索指令(判断某个数属于某个区间)

S型速度曲线行车位置控制,停靠位置搜索功能会用到区间搜索指令,下面我们详细介绍区间搜索指令的相关应用。 S型加减速行车位置控制(支持点动和停车位置搜索)-CSDN博客S型加减速位置控制详细算法和应用场景介绍,请查看下面文章博客。本篇文章不再赘述,这里主要介绍点动动和…

【nginx】Nginx配置:

文章目录 一、什么是Nginx&#xff1a;二、为什么使用Nginx&#xff1a;三、如何处理请求&#xff1a;四、什么是正向代理和反向代理&#xff1a;五、nginx 启动和关闭&#xff1a;六、目录结构&#xff1a;七、配置文件nginx.conf&#xff1a;八、location&#xff1a;九、单页…

嵌入式C 语言函数宏封装妙招

1. 函数宏介绍 函数宏&#xff0c;即包含多条语句的宏定义&#xff0c;其通常为某一被频繁调用的功能的语句封装&#xff0c;且不想通过函数方式封装来降低额外的弹栈压栈开销。 函数宏本质上为宏&#xff0c;可以直接进行定义&#xff0c;例如&#xff1a; #define INT_SWA…

Spring的注解开发-注解方式整合MyBatis代码实现

之前使用xml方式整合了MyBatis&#xff0c;文章导航&#xff1a;Spring整合第三方框架-MyBatis整合Spring实现-CSDN博客 现在使用注解的方式无非是就是将xml标签替换为注解&#xff0c;将xml配置文件替换为配置类而已。 非自定义配置类 package com.example.Configure;import c…

嵌入式系统中如何正确使用动态内存?

​ 大家好&#xff0c;今天给大家分享一下&#xff0c;动态内存的使用方法 一&#xff0e; 常见错误与预防 1. 分配后忘记释放内存 void func(void) {p malloc(len);do_something(p);return; /*错误&#xff01;退出程序时没有释放内存*/ }预防&#xff1a; 编写代码…

DevExpress ChartControl 画间断线

效果如下&#xff1a; 解决办法&#xff1a;数据源间断位置加入double.NaN demo下载

Linux 下如何调试代码

debug 和 release 在Linux下的默认模式是什么&#xff1f; 是release模式 那你怎么证明他就是release版本? 我们知道如果一个程序可以被调试&#xff0c;那么它一定是debug版本&#xff0c;如果它是release版本&#xff0c;它是没法被调试的&#xff0c;所以说我们可以来调试一…

基于SpringBoot+MyBatis实现的个人博客系统(一)

这篇主要讲解一下如何基于SpringBoot和MyBatis技术实现一个简易的博客系统(前端页面主要是利用CSS,HTML进行布局书写),前端的静态页面代码可以直接复制粘贴,后端的接口以及前端发送的Ajax请求需要自己书写. 博客系统需要完成的接口: 注册登录博客列表页展示博客详情页展示发布博…

【重拾C语言】二、顺序程序设计(基本符号、数据、语句、表达式、顺序控制结构、数据类型、输入/输出操作)

目录 前言 二、顺序程序设计 2.1 求绿化带面积——简单程序 2.2基本符号&#xff1a; 2.2.1 字符集 可视字符 不可视字符 2.2.2 C特定符 关键字 分隔符 运算符 2.2.3 标识符 2.2.4 间隔符 2.2.5 注释 2.3 数据 2.3.1 字面常量&#xff08;Literal Constants&am…

Flutter+SpringBoot实现ChatGPT流实输出

FlutterSpringBoot实现ChatGPT流式输出、上下文了连续对话 最终实现Flutter的流式输出上下文连续对话。 这里就是提供一个简单版的工具类和使用案例&#xff0c;此处页面仅参考。 服务端 这里直接封装提供工具类&#xff0c;修改自己的apiKey即可使用&#xff0c;支持连续…

FOC程序cubemx配置-ADC配置

具体配置步骤大家参考&#xff1a;这篇文章 我配置后用keil5自带的仿真工具查看引脚波形&#xff0c;在这里写一下遇到的问题。 1、波形仿真的时候出现 Unknown Signal&#xff1a;参考 这篇文章 2、生成的波形并不完全互补。 PS&#xff1a;出现以上这种情况时&#xff0…

【斗罗大陆2】动画新增12集备案,冰碧帝皇蝎形象被吐槽遭狂喷!

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析斗罗大陆2绝世唐门。 《斗罗大陆2》动画新增12集备案 《斗罗大陆2》动画正在如火如荼的上映着&#xff0c;《斗罗大陆2》动画也在同步新增了。 在2023年9月全国重点网络动画片规划备案通过剧目信息中&#xff0c;《斗罗大…

【计算机网络】高级IO之select

文章目录 1. 什么是IO&#xff1f;什么是高效 IO? 2. IO的五种模型五种IO模型的概念理解同步IO与异步IO整体理解 3. 阻塞IO4. 非阻塞IOsetnonblock函数为什么非阻塞IO会读取错误&#xff1f;对错误码的进一步判断检测数据没有就绪时&#xff0c;返回做一些其他事情完整代码myt…

【算法|动态规划No.8】leetcode面试题 17.16. 按摩师

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

Python使用词云图展示

网上看到一个txt文本信息&#xff0c;共2351条饭否记录&#xff0c;据说是微信之父每天发的饭否记录&#xff0c;其实我不知道什么是饭否。我读取这个文本内容&#xff0c;展示到词语图上。之前也使用过&#xff0c;但是好久没有玩Python了&#xff0c;称假期空闲&#xff0c;练…

【从入门到起飞】IO高级流(1)(缓冲流,转换流,序列化流,反序列化流)

&#x1f38a;专栏【JavaSE】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f384;缓冲流&#x1f354;字节缓冲流&#x1f6f8;一次读取…

vue ant 隐藏列

vue ant 隐藏列 重要代码 type: FormTypes.hidden{ title: 序号, key: barCode, width: 10%, type: FormTypes.hidden},

YTM32的电源管理与低功耗系统详解

YTM32的电源管理与低功耗系统详解 苏勇&#xff0c;2023年10月 文章目录 YTM32的电源管理与低功耗系统详解缘起原理与机制电源管理模型的功耗模式正常模式&#xff08;Normal&#xff09;休眠模式&#xff08;Sleep&#xff09;深度休眠模式&#xff08;DeepSleep&#xff09;…

树概念及结构

.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff0c;称为根结点&a…

新手学习笔记-----编译和链接

目录 1. 翻译环境和运⾏环境 2. 翻译环境&#xff1a;预编译编译汇编链接 2.1 预处理 2.2 编译 2.2.1 词法分析 2.2.2 语法分析 2.2.3 语义分析 2.3 汇编 2.4 链接 3. 运⾏环境 1. 翻译环境和运⾏环境 在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第…