ROS建模:一起从零手写URDF模型

1、机器人的定义与组成

2、URDF建模方法

link的描述部分:

其中geometry中参数origin的xyz单位为: m,其描述的是相对于坐标系的平移变换;

rpy单位为:弧度,其描述的是相对于坐标系下的旋转偏移

collision是指碰撞属性,也有着几何参数,图中的绿色方框就是cylinder圆柱体,可设置长和半径,主要是描述的区域不同了,与mesh中的stl文件模型相比,这个定义可以减少计算量,因为碰撞检测的计算是十分耗时的,所以将实际模型用绿色方框代替,来做简化操作。

当然,也可以用实际模型来做计算,只要将cylinder换成mesh实际模型即可

惯性矩阵图中没有展示出来(省略了),如果实际模型的几何不规则,那么需要借助第三方的工具来进行输出,比如SW等等,可以帮助我们完成计算,后面会进行介绍。

 joint的描述部分:

link1和link2两个连杆之间坐标系的运动关系就是靠joint关节来产生的运动类型

其中name可以自定义,type是指运动类型,下面注意:
在ROS中,一个joint必须只能连接2个连杆,不能连接3个及以上的连杆,也不能连接1个连杆。

在上图中,link1就是parent,而link2就是child,origin描述了2个连杆之间的坐标变换关系,axis描述了关节对于的旋转轴,limit是指限位,上下限为(-180°,180°),上限的速度设置的是1.0,因为revolute是含限位的。

 robot的描述部分:

整个URDF模型的最顶层的标签叫做robot,其中name可以自定义,注意所有的连杆和关节标签必须在robot中进行描述,在别处描述是不行的。

3、从零手写移动机器人的URDF模型

下面开始在linux系统中进行操作:

   在home目录中创建一个文件夹,../src:

进入src文件夹中打开一个终端,运行如下命令:

catkin_create_pkg mbot_description urdf xacro

会在src中的mbot_description文件夹中出现如下文件夹:

继续:下面分别创建4个文件夹

 下面进一步来创建URDF模型:

下面进入urdf文件夹后开启一个终端后输入:

touch mbot.urdf

打开刚刚创建的模型文件,复制粘贴如下内容并保存:

<?xml version="1.0" ?>
<robot name="mbot"><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><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>

下面进入到 launch 文件中去,开启一个终端后输入:

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

下面来到这个文件夹的页面处:

在工作空间下进行编译,让环境变量能够找到功能包:

catkin_make

出现以下截图界面:

重合任意开启一个终端,输入:

roslaunch mbot_description display_mbot_urdf.launch

注意--如果遇到如下报错:

解决方案

在home下打开.bashrc文件,在该文件的最后添加如下代码,catkin_ws是我的ROS工作路径:

source /home/hjx/hjx_file/URDF_model/catkin_ws/devel/setup.bash

export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:~/catkin_ws/

然后保存bashrc,查看ROS路径是否添加上:

echo $ROS_PACKAGE_PATH

设置成功会显示你添加的路径。

下面继续新开一个终端输入

roslaunch mbot_description display_mbot_urdf.launch

会出现如下Rviz界面:

下面点击——> Add,找到RobotModel:

 

 成功添加出urdf模型!

但是,左边出现了明显的报错信息,进行查看:

这个是说没有base_link到map坐标系的一个变换,其中map是rviz默认设置的一个坐标系,但当前我们并没有这个坐标系。下面进行更改操作:

点击 Fixed Frame 并将其更改为 base_link:

可以发现,模型显示正常!!!

这个base_link对应于我们之前模型文件中的base_link,每一个link都会产生一个同名的坐标系:

下面为防止每次打开模型文件时都要添加Add,可以进行rviz模型的保存:

在开启的rviz中点击File——> Save config As:

 找到我们功能包下面的config文件夹后,点击进行,进行命名(自定义):

 再点击save保存即可

OK,下次如果调整rviz整个界面的时候,按ctrl+s即可保存界面中的整个配置,保存至刚刚完成命名的config文件夹中

下面我们将urdf文件中的参数进行一些修改:

关闭rviz后再次打开urdf文件,使用:

roslaunch mbot_description display_mbot_urdf.launch

 可以明显发现原来的长度变长了,由0.16m变为了1.16m,同理:半径也可以进行修改。

下面继续更改origin部分,将xyz变为0.5,0,0:

关闭rviz后再次打开urdf文件,发现模型有了偏移,base_link还是位于原点位置:

下面再更改rpy试试看,注意rpy的单位是“弧度”:

 关闭rviz后再次打开urdf文件,发现模型有了旋转:

到此为止车体模型的建立完成!

下面继续:

 进一步通过link来做描述,将urdf文件改为:

<?xml version="1.0" ?>
<robot name="mbot"><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><link name="base_link"><visual><origin xyz=" 0 0 0" rpy="1 0 0" /><geometry><cylinder length="0.16" radius="0.20"/></geometry><material name="Yellow"/></visual></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></robot>

保存urdf文件后再次启动launch文件进行查看,发现出现如下报错:

解决方法:

joint_state_publisher_gui 中的 slider.setValue 方法接收到了一个浮点数(float)作为参数,而它期望的是一个整数(int

编辑文件:请确保您正确保存了对 /opt/ros/noetic/lib/python3/dist-packages/joint_state_publisher_gui/__init__.py 文件的更改。使用有管理员权限的编辑器打开该文件,以确保您能够保存更改。

sudo nano /opt/ros/noetic/lib/python3/dist-packages/joint_state_publisher_gui/__init__.py

确认并修改代码:找到第 103 行,确保将浮点数转换为整数。代码应该如下所示:

slider.setValue(int(RANGE/2))

 保存并关闭文件:如果您使用 nano,通过按 Ctrl+X,然后按 Y,最后按 Enter 保存更改。

 再次运行launch文件发现:

这个新的错误信息仍然是关于类型错误,但这次它出现在 joint_state_publisher_gui 的另一个位置。错误发生在 __init__.py 文件的第 182 行,涉及到 joint_info['slider'].setValue 方法。就像之前的错误一样,setValue 方法接收到了一个浮点数(float)而不是它期望的整数(int)。

打开文件进行编辑:打开 /opt/ros/noetic/lib/python3/dist-packages/joint_state_publisher_gui/__init__.py 文件进行编辑。确保您使用的是具有管理员权限的文本编辑器:

sudo nano /opt/ros/noetic/lib/python3/dist-packages/joint_state_publisher_gui/__init__.py

定位并修改代码:找到第 182 行,您可能会看到类似这样的代码:

joint_info['slider'].setValue(self.valueToSlider(joint['zero'], joint))

需要确保 setValue 接收到的参数是整数类型。假设 self.valueToSlider(joint['zero'], joint) 返回一个浮点数,您可以通过使用 int() 函数来转换它:

joint_info['slider'].setValue(int(self.valueToSlider(joint['zero'], joint)))

保存并关闭文件:保存更改并关闭编辑器。

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

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

相关文章

深度探讨 Golang 中并发发送 HTTP 请求的最佳技术

目录 推荐 使用 Goroutines 的基本方法 Goroutine 入门 处理多个请求 并发 HTTP 请求的方法 基本 Goroutine WaitGroup Channels Worker Pools 使用通道限制 Goroutine 使用信号量限制 Goroutines 那么&#xff0c;最好的方法是什么&#xff1f; 评估你的需求 错误…

DevOps系列文章之 GitLab CI/CD

CICD是什么? 由于目前公司使用的gitlab&#xff0c;大部分项目使用的CICD是gitlab的CICD&#xff0c;少部分用的是jenkins&#xff0c;使用了gitlab-ci一段时间后感觉还不错&#xff0c;因此总结一下 介绍gitlab的CICD之前&#xff0c;可以先了解CICD是什么 我们的开发模式…

algotithm -- 排序算法

排序算法总结表&#xff1a; 1. In-place 和 Out-place 含义 参考链接 in-place 占用常数内存&#xff0c;不占用额外内存 假如问题规模是n&#xff0c;在解决问题过程中&#xff0c;只开辟了常数量的空间&#xff0c;与n无关&#xff0c;这是原址操作&#xff0c;就是In-…

安卓平板局域网内远程控制工控机方法

安卓平板局域网内远程控制工控机方法 将所需要远程控制的工控机通过网线连接到具有WiFi功能的路由器上&#xff0c;将安卓平板连接上WiFi&#xff0c;如下图所示 下载NoMachine远程软件安装包&#xff0c;官网地址&#xff1a;https://www.nomachine.com/ 点击Download now按钮…

Vulnhub靶机:FunBox 3

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;FunBox 3&#xff08;10.0.2.28&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com/funbo…

2018年认证杯SPSSPRO杯数学建模C题(第一阶段)机械零件加工过程中的位置识别全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 基于轮廓特征的机械零件位置识别研究 C题 机械零件加工过程中的位置识别 原题再现&#xff1a; 在工业制造自动生产线中&#xff0c;在装夹、包装等工序中需要根据图像处理利用计算机自动智能识别零件位置&#xff0c;并由机械手将零件自动搬…

【Elasticsearch】索引恢复(recovery)流程梳理之副本分片数据恢复

replica shard重启具体流程 replica shard node &#xff08;generic threadpool&#xff09; 也是因为应用新的集群状态触发recovery&#xff0c;进入index阶段进入translog 阶段。先尝试重放本地的translog到global checkpoint向primary shard发起start recovery的请求&…

第6章 现代通信技术

文章目录 6.1 图像与多媒体通信6.1.1 图像通信6.1.2 多媒体通信技术1、多媒体通信概念2、多媒体通信的组成3、多媒体通信的业务分类4、实用化的多媒体通信系统类型5、多媒体通信应用系统&#xff08;1&#xff09;多媒体会议电视系统&#xff08;2&#xff09;IPTV 6.2 移动通信…

uniapp uni.chooseLocation调用走失败那里,错误码:112

问题&#xff1a;我配置了百度上所有能配置的&#xff0c;一直调用不成功&#xff0c;如下图配置的 1:第一个 配置 代码&#xff1a; "permission": {"scope.userLocation": {"desc": "你的位置信息将用于小程序位置接口的效果展示"}…

Statistics with Python知识总结:库、统计图

前言 统计学作为一门重要的数据分析领域&#xff0c;为我们理解和解释数据提供了有力的工具。而Python是用来进行统计自动化和画图的重要工具。本文总结了与统计学相关的Python数据库和不同类型的统计图的关键知识点&#xff0c;帮助读者更好地理解工具&#xff0c;以及各知识…

RocketMQ学习总结

一、架构 1、NameServer&#xff1a;注册中心。Broker信息注册到NameServer&#xff1b;producer/consumer根据某个topic通过NameServer获取对应broker的路由信息 &#xff1b; 2、Broker&#xff1a;负责存储、拉取、转发消息&#xff1b; 3、Producer&#xff1a;消息生产者…

浅谈情绪的分类合集

一、什么是情绪分类 情绪分类&#xff0c;是指区分或者对比一种情绪与另一种情绪的方法&#xff0c;目前在情绪研究&#xff08;emotion research&#xff09;与情感科学&#xff08;affective science&#xff09;是具有争议的问题。有两个讨论情绪分类的基本观点&#xff1a…

ARP相关

ARP报文格式&#xff1a; 目的以太网地址&#xff0c;48bit&#xff0c;发送ARP请求时&#xff0c;目的以太网地址为广播MAC地址&#xff0c;即0xFF.FF.FF.FF.FF.FF。 源以太网地址&#xff0c;48bit。 帧类型&#xff0c;对于ARP请求或者应答&#xff0c;该字段的值都为0x08…

Traceroute 详解

前言 如果您是网络管理员&#xff0c;系统管理员或任何系统操作团队的一员&#xff0c;那么您可能已经听说过名为TRACEROUTE的工具。默认情况下&#xff0c;它是大多数操作系统中都提供的非常方便的工具。 网络管理员和系统管理员在日常活动中最常使用此工具。它基本上是一个…

pandas操作excel

目录 一&#xff1a;创建excel 二&#xff1a;修改excel 三&#xff1a;查找excel 四&#xff1a;删除数据 五&#xff1a;合并excel数据 一&#xff1a;创建excel import pandas as pd # 创建DataFrame对象 data { Name: [Alice, Bob, Charlie], Age: [25, 30, 35], S…

Microsoft Visual C++ RunTime怎么下载?

64位下载链接 下载好程序后双击&#xff0c;勾选“我同意许可条款和条件”&#xff0c;然后点击“安装” 安装完成后点击“关闭”即可 感谢您的阅读与关注&#xff0c;服务器大本营助您成为更专业的服务器管理员&#xff01;

32 登录页组件

效果演示 实现了一个登录页面的样式&#xff0c;包括一个容器、左侧和右侧部分。左侧部分是一个背景图片&#xff0c;右侧部分是一个表单&#xff0c;包括输入框、复选框、按钮和忘记密码链接。整个页面的背景色为白色&#xff0c;容器为一个圆角矩形&#xff0c;表单为一个半透…

华为机考入门python3--(0)模拟题2-vowel元音字母翻译

分类&#xff1a;字符串 知识点&#xff1a; 字符串转list&#xff0c;每个字符成为list中的一个元素 list(string) 字符串变大小写 str.upper(), str.lower() 题目来自【华为招聘模拟考试】 # If you need to import additional packages or classes, please import …

UE5 独立程序的网络TCP/UDP服务器与客户端基础流程

引擎源码版&#xff0c;复制\Engine\Source\Programs\路径下的BlankProgram空项目示例。 重命名BlankProgram&#xff0c;例如CustomTcpProgram&#xff0c;并修改项目名称。 修改.Build.cs内容 修改Target.cs内容 修改Private文件夹内.h.cpp文件名并修改.cpp内容 刷新引擎 …

C++入门学习(七)整型

整型就是整数类型的数据&#xff08;-1&#xff0c;0&#xff0c;1等等&#xff09; 数据类型占用空间取值范围short(短整型)2字节 (-2^15 ~ 2^15-1) 32768~32767 int(整型)4字节(-2^31 ~ 2^31-1)long(长整形) Windows为4字节, Linux为4字节(32位), 8字节(64位) (-2^31 ~ 2^31…