ROS——坐标系管理、监听与广播、常用可视化工具

坐标系管理

在这里插入图片描述
x

TF功能包

在这里插入图片描述

小海龟追踪实验

  • ros版本(20.04)的tf安装命令: sudo apt-get install ros-noetic-turtle-tf

  • 解决因python版本出现的无法生成跟随海龟: sudo ln -s /usr/bin/python3 /usr/bin/python ( -s 软链接,符号链接)

  • ln命令(英文全拼:link files)命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。
    当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。

  • Linux文件系统中,有所谓的链接(link),我们可以将其视为档案的别名,而链接又可分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。
    不论是硬链接或软链接都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。

  • 在执行view_frames出现错误: cannot use a string pattern on a bytes-like object

  • 解决方案: 将/opt/ros/noetic/lib/tf/view_frames文件第89行由 m = r.search(vstr) 修改为 m = r.search(str(vstr))(用str将vstr转化为string)。
    在这里插入图片描述

可视化工具

  • rviz: noetic 版本,直接在终端执行 rviz即可
    在这里插入图片描述
  • Fixed Frame: 选择world
  • Add选项:添加TF
    在这里插入图片描述

tf监听和广播

创建功能包

在这里插入图片描述

四元数

Quaternion(四元数)是一种扩展了复数概念的数学系统,由爱尔兰数学家威廉·罗文·汉密尔顿在1843年首次描述。四元数在三维空间的力学中被广泛应用。

一个四元数可以表示为:

q = a + bi + cj + dk

其中:

q 是四元数,
a, b, c, 和 d 是实数,
i, j, 和 k 是四元数的基本单位。
四元数的关键特性是乘法不满足交换律,也就是说 pq 并不一定等于 qp。

四元数在多个领域中都有应用,尤其是在计算机图形学、控制理论、信号处理、姿态控制、物理学和轨道力学中,因为它们提供了一种有效的方式去表示三维空间中的旋转或方向。

在电脑游戏和3D动画中,四元数常用于避免万向锁问题(Gimbal Lock),以及进行平滑的旋转插值(例如SLERP)。

RPY

在坐标系中,RPY代表“Roll(横滚)、Pitch(俯仰)和Yaw(偏航)”,这是描述一个刚体在三维空间中旋转的三个基本角度。这些术语最初源自航空和航海领域,用来描述飞行器或船只相对于地球的定向。

Roll(横滚):绕着物体自身的 x 轴旋转。如果考虑的是一个飞机,横滚是指机翼的上下翻转。
Pitch(俯仰):绕着物体自身的 y 轴旋转。俯仰是指飞机机头的上下移动。
Yaw(偏航):绕着物体自身的 z 轴旋转。偏航是指飞机机头向左或向右的转动。
在机器人学、计算机图形学和导航系统中,RPY 角也被称为欧拉角的一种特定序列。当描述物体的旋转时,通常会按照一个固定的顺序应用这三个旋转,这个顺序可以是 XYZ 或者 ZYX 等,这取决于具体的应用场景和坐标系约定。

RPY 角可以单独使用,也可以组合起来形成一个旋转矩阵或者四元数,以便更有效地进行计算和表示刚体的完整姿态。在机器人技术中,RPY 常用来描述机械臂末端执行器或相机等传感器相对于世界坐标系的位置和方向。

实现 tf 广播器

// 例程产生 tf 数据,并计算、发布 turtle2的速度指令
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>std::string turtle_name;//pose回调函数
void poseCallback(const turtlesim::PoseConstPtr& msg){//创建tf的广播器static tf::TransformBroadcaster br;//初始化tf数据tf::Transform transform;transform.setOrigin(tf::Vector3(msg->x,msg->y,0.0));tf::Quaternion q;q.setRPY(0,0,msg->theta);transform.setRotation(q);//广播world与海龟坐标系之间的tf数据br.sendTransform(tf::StampedTransform(transform,ros::Time::now(),"world",turtle_name));
}int main(int argc,char** argv){ros::init(argc,argv,"my_broadcaster");//输入参数作为海龟的名字if(argc != 2){ROS_ERROR("need turtle name as argument!");return -1;}turtle_name = argv[1];//订阅海龟位置ros::NodeHandle node;ros::Subscriber sub = node.subscribe(turtle_name+"/pose",10,&poseCallback);// 循环等待回调函数ros::spin();return 0;
}

实现tf监听器

#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <turtlesim/Spawn.h>
#include <geometry_msgs/Twist.h>int main(int argc,char **argv){ros::init(argc,argv,"my_tf_listener");ros::NodeHandle node;//请求产生turtle2ros::service::waitForService("/spawn");ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");turtlesim::Spawn srv;add_turtle.call(srv);//创建发布turtle2速度控制指令的发布者ros::Publisher turtle_vel = node.advertise<geometry_msgs::Twist>("/turtle2/cmd_vel",10);//创建tf的监听器tf::TransformListener listener;ros::Rate rate(10.0);while(node.ok()){//获取turtle1与turtle2坐标系之间的tf数据tf::StampedTransform transform;try{// 判断坐标系中是否存在 turtle1 和 turtle2,持续三秒listener.waitForTransform("/turtle2","/turtle1",ros::Time(0),ros::Duration(3.0));// 获取tutle1 和 turtle2 的实时位置,将四元数存到transform变量中listener.lookupTransform("turtle2","/turtle1",ros::Time(0),transform);}catch(tf::TransformException &ex){ROS_ERROR("%s",ex.what());ros::Duration(1.0).sleep();continue;}//根据turtle1与turtle2坐标系之间的位置关系,发布turtle2的速度指令geometry_msgs::Twist vel_msg;vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(),transform.getOrigin().x());vel_msg.angular.x = 0.5 * sqrt(pow(transform.getOrigin().x(),2) + pow(transform.getOrigin().y(),2));turtle_vel.publish(vel_msg);rate.sleep();}return 0;
}

配置监听规则

1

编译运行

  • 此处的… name:=turtle1_tf_broadcaster /turtle1 … 代表broadcaster__name的重命名
    在这里插入图片描述

launch启动文件

在这里插入图片描述

launch文件语法

在这里插入图片描述

参数设置

在这里插入图片描述

重映射与节点嵌套

在这里插入图片描述

更多方法

在这里插入图片描述

样例

在这里插入图片描述

自定义参数实例

在这里插入图片描述

广播与监听的实例

在这里插入图片描述

启动launch文件指令: roslaunch 功能包名 文件名.launch

常用可视化工具

在这里插入图片描述

通过rqt指令,将多个工具综合在同一界面

在这里插入图片描述

RVIZ:机器人数据可视化工具

在这里插入图片描述
在这里插入图片描述

工作区域

在这里插入图片描述

Gazebo

  • gazebo
    在这里插入图片描述

ROS用途

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

相关资源

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

grpc-go服务端接口添加

【1】新建一个目录whgserviceproto&#xff0c;目录下新建一个proto包&#xff1a;whgserviceproto.proto &#xff08;注意目录和包名称保持一致&#xff09; //协议为proto3 syntax "proto3"; // 指定生成的Go代码在你项目中的导入路径 option go_package"…

代理模式详解、RESTFul风格、Spring IOC

Day49 代理模式proxy 概念&#xff1a; 代理(Proxy)是一种设计模式&#xff0c;提供了对目标对象另外的访问方式&#xff0c;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 代理模式分为静态代理和动态代理…

开源数据科学平台Anaconda简介

开源数据科学平台Anaconda简介 零、时光宝盒 最近&#xff0c;某金融行业女性选择以跳楼的形式结束自己的生命&#xff0c;这件不幸的事情成了热门话题&#xff0c;各种猜测的都有&#xff0c;有些人评论的话真的很过分。我想起前段时间看到的&#xff0c;有个女学生跳江&#…

【论文解读】AGENTLESS:揭开基于LLM的软件工程代理的神秘面纱,重塑软件工程自动化新基线

&#x1f4dc; 文献卡 英文题目: Agentless: Demystifying LLM-based Software Engineering Agents;作者: Chunqiu Steven Xia; Yinlin Deng; Soren Dunn; Lingming ZhangDOI: 10.48550/arXiv.2407.01489摘要翻译: 大型语言模型&#xff08;LLM&#xff09;的最新进展显著推进…

进程的控制-ps和kill命令

ps 查看进程信息 部分参数&#xff1a; a : 显示现行终端机下的所有程序&#xff0c;包括其他用户的程序 u: 以用户为主的格式来显示程序状况 x: 显示所有程序&#xff0c;不以 终端机来区分 kill 向指定的进程发送信号 kill 可将指定的信息送至程序。预设的信息为 SIG…

OpenAI突然停止中国API使用,出海SaaS产品如何化挑战为机遇?

2023年是AI爆发的年代&#xff0c;人工智能带来的信息裂变刷新了整个SaaS行业。在这个AI引领的时代&#xff0c;我们不应该单纯依赖工具本身&#xff0c;而是要理解如何将这些AI功能与行业相结合。 然而&#xff0c;上周OpenAI宣布禁止对中国提供API服务&#xff0c;有一些用户…

六、数据可视化—flask框架入门(爬虫及数据可视化)

六、数据可视化—flask框架入门&#xff08;爬虫及数据可视化&#xff09; 1&#xff0c;数据可视化简介2&#xff0c;flask&#xff08;1&#xff09;创建flask项目&#xff08;2&#xff09;开启debug模式&#xff08;3&#xff09;通过访问路径传递参数&#xff08;4&#x…

图的应用之最短路径

引入 应用 算法思想 Dijistra算法 用于解决单个顶点间的最短路径问题 将顶点看成两部分&#xff1a; 最短路径顶点集合A与尚未确定最短路径顶点集合B。 先将顶点按最短路径由小到大依次加入到A中&#xff0c;选择由源点到A中最短的顶点&#xff0c;并记录距离与顶点&#xf…

身体(body)的觉醒:如果你贪婪,给你整个宇宙都不够

佛&#xff0c;是一个梵文的汉语音译词&#xff0c;指觉醒者。 何谓觉醒&#xff1f;什么的觉醒&#xff1f;其实很简单&#xff0c;就是身体的觉醒。 佛的另一个名字&#xff0c;叫菩提&#xff0c;佛就是菩提&#xff0c;菩提老祖&#xff0c;就是佛祖。 一、body&#xff…

Lambda架构

1.Lambda架构对大数据处理系统的理解 Lambda架构由Storm的作者Nathan Marz提出&#xff0c;其设计目的在于提供一个能满足大数据系统关键特性的架构&#xff0c;包括高容错、低延迟、可扩展等。其整合离线计算与实时计算&#xff0c;融合不可变性、读写分离和复杂性隔离等原则&…

3.js - 裁剪平面(clipIntersection:交集、并集)

看图 代码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js// 导入tween import …

深度解析Ubuntu版本升级:LTS版本升级指南

深度解析Ubuntu版本升级&#xff1a;Ubuntu版本生命周期及LTS版本升级指南 Ubuntu是全球最受欢迎的Linux发行版之一&#xff0c;其版本升级与维护策略直接影响了无数用户的开发和生产环境。Canonical公司为Ubuntu制定了明确的生命周期和发布节奏&#xff0c;使得社区、企业和开…

Spring AOP源码篇三之 xml配置

简单代码示例, 了解Spring AOP基于xml的基本用法 xml配置&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-insta…

django之url路径

方式一&#xff1a;path 语法&#xff1a;<<转换器类型:自定义>> 作用&#xff1a;若转换器类型匹配到对应类型的数据&#xff0c;则将数据按照关键字传参的方式传递给视图函数 类型&#xff1a; str: 匹配除了”/“之外的非空字符串。 /test/zvxint: 匹配0或任何…

golang线程池ants-实现架构

1、总体架构 ants协程池&#xff0c;在使用上有多种方式(使用方式参考这篇文章&#xff1a;golang线程池ants-四种使用方法)&#xff0c;但是在实现的核心就一个&#xff0c;如下架构图&#xff1a; 总的来说&#xff0c;就是三个数据结构&#xff1a; Pool、WorkerStack、goW…

【前端实现】在父组件中调用公共子组件:注意事项逻辑示例 + 将后端数组数据格式转换为前端对象数组形式 + 增加和删除行

【前端】在父组件中调用公共子组件的实现方法 写在最前面一、调用公共子组件子组件CommonRow.vue父组件ParentComponent.vue 二、实现功能1. 将后端数组数据格式转换为前端对象数组形式2. 增加和删除row 三、小结 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2…

全景图三维3D模型VR全景上传展示H5开发

全景图三维3D模型VR全景上传展示H5开发 3D互动体验平台的核心功能概览 兼容广泛格式&#xff1a;支持OBJ、FBX、GLTF等主流及前沿3D模型格式的无缝上传与展示&#xff0c;确保创意无界。 动态交互探索&#xff1a;用户可自由旋转、缩放、平移模型&#xff0c;深度挖掘每一处…

STMF4 硬件IIC(天空星开发板)

前言&#xff1a;笔记参考立创开发文档&#xff0c;连接放在最后 #IIC概念介绍 #IIC介绍 IIC通信协议&#xff0c;一种常见的串行通信协议&#xff0c;英文全程是 Inter-Integrated Circuit 使用这种通信方式的模块&#xff0c;通常有SCL&#xff08;Serial Clock Line&…

pytest使用报错(以及解决pytest所谓的“抑制print输出”)

1. 测试类的类名问题 #codingutf-8import pytestclass TestClass1:def setup(self) -> None:print(setup)def test_01(self) -> None:print(test_01111111111111111111111)def test_02(self) -> None:print(test_02)以上述代码为例&#xff0c;如果类名是Test开头&am…

Chair Footrest Protective Cover

Chair Footrest Protective Cover 万能通用型椅子脚垫保护套凳子耐磨硅胶加厚垫桌椅脚垫防滑静音套