当前位置: 首页 > news >正文

ROS 2边学边练(45)-- 构建一个能动的机器人模型

前言

        在上篇中我们搭建了一个机器人模型(其由各个关节(joint)和连杆(link)组成),此篇我们会通过设置关节类型来实现机器人的活动。

        在ROS中,关节一般有无限旋转(continuous),有限旋转(revolute)和滑动(prismatic)三种类型,除了上述三种关节类型外,ROS还支持其他类型的关节,如planar(平面关节,允许在平面正交方向上平移或旋转)和floating(浮动关节,允许进行平移和旋转运动)等。这些关节类型提供了更复杂的运动学模型,以支持更广泛的机器人设计和应用。

动动手

        同样是在urdf文件中实现。[原文件:06-flexible.urdf]

运行

        按下面命令看看这个可活动的机器人效果如何。

$ros2 launch urdf_tutorial display.launch.py model:=urdf/06-flexible.urdf

        可以发现除了Rviz机器人模型出现外,还有另外一个小窗口也弹了出来(上一篇中也有,只不过内容很少),上面罗列了好几个关节(joint)的控制条,我们可以尝试拖动这些滑动条看看机器人如何活动。

关节

<joint name="head_swivel" type="continuous"><parent link="base_link"/><child link="head"/><axis xyz="0 0 1"/><origin xyz="0 0 0.3"/>
</joint>

        这里描述了头部关节的相关属性,该关节连接了机器人身体(base_link)和头部(head),类型为continuous,意味着可以无限制旋转(所有方向所有角度),受限于实际的物理限制,往往不能做到全方位全角度旋转,几个轮子关节的类型也是同样如此。需要注意的是我们从上面的代码中可以看到axis属性,这指定了旋转轴,(x, y, z)-> (0, 0, 1),该头部节点只能绕着z轴转动。

抓手
<joint name="left_gripper_joint" type="revolute"><axis xyz="0 0 1"/><limit effort="1000.0" lower="0.0" upper="0.548" velocity="0.5"/><origin rpy="0 0 0" xyz="0.2 0.01 0"/><parent link="gripper_pole"/><child link="left_gripper"/>
</joint>

        机器人的左右两只抓手关节类型都为revolute,有限制(角度)的旋转,通过limit属性我们指定了力矩(effort,单位Nm)、最小最大角度(lower/upper,单位弧度)、速度(velocity),实际过程中的值可能会与目标值不一致。

对于旋转关节(revolute),effort 通常表示的是力矩(torque),单位可能是牛顿·米(Nm)或磅·英尺(lb-ft),而不是牛顿(N)。牛顿(N)是力的单位,而力矩是力和力臂的乘积,用来描述力对物体绕某点旋转的效果。

对于滑动关节(prismatic),effort 通常表示的是力(force),单位可能是牛顿(N)或磅(lb)。

抓臂
<joint name="gripper_extension" type="prismatic"><parent link="base_link"/><child link="gripper_pole"/><limit effort="1000.0" lower="-0.38" upper="0" velocity="0.5"/><origin rpy="0 0 0" xyz="0.19 0 0.2"/>
</joint>

        抓臂关节的类型设置成了prismatic,滑动,能起到让手臂伸缩的作用。对于滑动关节的属性lower和upper单位不再是弧度而是米。

其他

       除了前面提到的关节类型,还有两种关节能够在空间中移动。其中,滑动关节(prismatic joint)只能沿一个维度移动,而平面关节(planar joint)则可以在一个平面,或者说两个维度上移动。此外,浮动关节(floating joint)是不受约束的,可以在三个维度中的任意一个维度上移动。这些关节不能仅用一个数值来指定,因此在本教程中不包括它们。

姿态控制原理(Rviz)

        在我们拖动滑动条时,Rviz中的机器人关节也随着活动,并带动与其连接的其他组件运动,这是怎么实现的呢?

  1. GUI(控制窗口)解析urdf文件并确定各个活动关节及其限制;
  2. GUI读取滑动条数值并发布sensor_msgs/msg/JointState消息;
  3. 节点robot_state_publisher利用这些消息数据计算不同模块之间的位姿转换;
  4. Rviz最终通过转换树的信息数据进行显示转换后的机器人位姿。

        后续的章节我们会添加一些物理属性到urdf中,并利用xacro(xml格式的宏)来精简我们的代码。

本篇完。

相关文章:

ROS 2边学边练(45)-- 构建一个能动的机器人模型

前言 在上篇中我们搭建了一个机器人模型(其由各个关节&#xff08;joint&#xff09;和连杆&#xff08;link&#xff09;组成)&#xff0c;此篇我们会通过设置关节类型来实现机器人的活动。 在ROS中&#xff0c;关节一般有无限旋转&#xff08;continuous&#xff09;,有限旋转…...

【第66例】IPD体系进阶:华为IPD发展历程

目录 简介 样例 作者简介 简介 想要引入 IPD,首先就要思考一些问题: 跟我的企业适配吗? 流程会不会太重了? 一定要引入吗,有没有其他方式? 从目前大的环境来说。 中国制造业正在由“中国制造”向“中国创造”转变。 这也是企业价值转移的趋势。 宏碁集团创始人施振…...

websevere服务器从零搭建到上线(四)|muduo网络库的基本原理和使用

文章目录 muduo源码编译安装muduo框架讲解muduo库编写服务器代码示例代码解析用户连接的创建和断开回调函数用户读写事件回调 使用vscode编译程序配置c_cpp_properties.json配置tasks.json配置launch.json编译 总结 muduo源码编译安装 muduo依赖Boost库&#xff0c;所以我们应…...

C语言笔记10

1.用指针打印一维数组 //1.用指针打印一维数组 #include <stdio.h> int main() {//int arr[] { 1,2,3,4,5 };int arr[5] { 0 };int* p &arr[0];int sz sizeof(arr) / sizeof(arr[0]);for (int i 0; i < sz; i){scanf("%d", &arr[i]);}//int* …...

BMS-HiL主要功能

BMS HIL 系统中 PC 机中安装实验管理软件用于测试过程管理和测试序列编辑&#xff0c;通过以太网与 PXI 机箱中的处理器进行连接&#xff0c;处理器中运行实时系统&#xff08;Real Time&#xff09;并安装 Veristand 终端引擎&#xff0c;通过与 PC 中的数据传输&#xff0c;对…...

idea无法识别加载pom.xml文件

有时idea无法识别加载pom.xml文件&#xff0c;直接打开pom.xml文件&#xff0c;然后添加到maven就行...

C语言笔记12

1.使用qsort函数进行排序 #include <stdio.h> #include <stdlib.h> #include <string.h>//void qsort(void* base, //指向待排序数组的第一个元素的指针 // size_t num, //base指向数组中的元素个数 // size_t size,//base指向的数组中一…...

说一下 hibernate 的缓存机制?

Hibernate 的缓存机制是为了提高应用程序的性能&#xff0c;通过减少对数据库物理数据源的访问频次而设计的。Hibernate 的缓存主要可以分为两个级别&#xff1a;一级缓存&#xff08;也称为 Session 级别的缓存&#xff09;和二级缓存&#xff08;也称为 SessionFactory 级别的…...

Mac安装jadx

1、使用命令brew安装 : brew install jadx 输入完命令,等待安装完毕 备注&#xff08;关于Homebrew &#xff09;&#xff1a; Homebrew 是 MacOS 下的包管理工具&#xff0c;类似 apt-get/apt 之于 Linux&#xff0c;yum 之于 CentOS。如果一款软件发布时支持了 homebrew 安…...

风扇开启执行逻辑

执行流程 public static void businessExecutionWork(){//以下为业务逻辑部分System.out.println("1、根据电池包控制风扇服务执行 开始!");//1、获取电池包电压、电流、环境温度//获取电池包电压、电流、环境温度ObtainBatteryDataService obtainBatteryDataServic…...

调用函数实现数组的输入排序插入与输出

输入一串数字&#xff0c;输出排序插入后输出最后的数字序列&#xff1b; 把主要步骤交给主函数&#xff0c;通过调用函数来实现整体的功能&#xff1a; 写出主函数&#xff08;这里使用冒泡排序&#xff09;&#xff1a; int main(){int n;int a[10];cin>>n;inputa(a…...

代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树

代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树 文章目录 代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树343. 整数拆分一、动态规划二、贪心&#xff08;不需要掌握&#xff09; 96.不同的二叉搜索树一…...

多模态产品在智能文档处理应用的展望------以TextIn模型为例

前言发展现状TextIn 文档解析技术文本向量化展望合合信息 前言 第十四届视觉与学习青年学者研讨会(VALSE 2024)于5月5日-7日在山城重庆渝北区悦来国际会议中心举办。大会聚焦计算机视觉、模式识别、多媒体和机器学习等领域的国际前沿和热点方向。大会中&#xff0c;合合信息智能…...

上海市计算机学会竞赛平台2024年3月月赛丙组最近的数字

题目描述 给定两个正整数 &#x1d45b;n 与 &#x1d451;d &#xff0c;请找到所有最接近 &#x1d45b;n 且是 &#x1d451;d 的倍数的整数。 输入格式 第一行&#xff1a;单个整数表示 &#x1d45b;n第二行&#xff1a;单个整数表示 &#x1d451;d 输出格式 若干行…...

RFID在汽车制造中的应用如何改变行业

随着工业4.0和中国制造2025的推进&#xff0c;企业对于智能化、自动化的需求日益增长&#xff0c;RFID射频技术在制造业中已经相当普遍了。在如今这瞬息万变的行业与时代中&#xff0c;RFID技术可以帮助企业获得竞争优势&#xff0c;简化日益复杂的生产流程&#xff0c;推动企业…...

sCrypt受邀在中国人民大学举办《区块链与数字经济》课程讲座

4月17日&#xff0c;可一科技特邀美国sCrypt公司的开发工程师周全&#xff0c;在中国人民大学的《区块链与数字经济》课程上进行了讲座。周全讲解了区块链的分布式设计、不可篡改特性&#xff0c;以及智能合约的基本原理&#xff0c;利用“智能家居触发机制”等生动比喻&#x…...

pc端的鼠标箭头变换

<div style"cursor:pointer"></div>...

ICode国际青少年编程竞赛- Python-2级训练场-for循环练习2

ICode国际青少年编程竞赛- Python-2级训练场-for循环练习2 1、 for i in range(5):Dev.step(9 - i * 2)Dev.turnLeft()2、 for i in range(3):Spaceship.step(i 1)Spaceship.turnRight()Spaceship.step(i 1)Spaceship.turnLeft()3、 for i in range(4):Dev.step(10 - i…...

RiPro主题美化【支付弹窗底部提示语根据入口不同有不同的提示】ritheme主题美化RiProV2 增加支付提示语,按支付类型不同,入口不同提示语不同的设置

RiPro主题美化【支付弹窗底部提示语根据入口不同有不同的提示】ritheme主题美化RiProV2 增加支付提示语,按支付类型不同,入口不同提示语不同的设置 背景: 接上文:https://www.uu2id.com/827.html 付费组件在以下几个地方会弹出:1)文章隐藏内容付费;2)付费资源下载;3…...

MSMQ消息队列

MQ是一种企业服务的消息中间节技术&#xff0c;这种技术常常伴随着企业服务总线相互使用&#xff0c;构成了企业分布式开发的一部分&#xff0c;如果考虑到消息的发送和传送之间是可以相互不联系的并且需要分布式架构&#xff0c;则可以考虑使用MQ做消息的中间价技术&#xff0…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...