机器人坐标系转换之从世界坐标系到局部坐标系

三角函数实现

在这里插入图片描述
下面是代码c++和python实现:

#include <iostream>
#include <cmath>struct Point {double x;double y;
};class RobotCoordinateTransform {
private:Point origin; // 局部坐标系的原点在世界坐标系中的坐标public:RobotCoordinateTransform(double originX, double originY) : origin({originX, originY}) {}// 将世界坐标转换到局部坐标Point worldToLocal(double x_w, double y_w, double theta_w) {Point local;// 平移坐标系local.x = x_w - origin.x;local.y = y_w - origin.y;// 旋转坐标系double x_local = local.x * cos(theta_w) - local.y * sin(theta_w);double y_local = local.x * sin(theta_w) + local.y * cos(theta_w);local.x = x_local;local.y = y_local;return local;}
};int main() {RobotCoordinateTransform transform(0, 0); // 假设局部坐标系原点在世界坐标系的(0, 0)点double x_w, y_w, theta_w;std::cout << "Enter world coordinates (x_w, y_w) and orientation theta_w (in radians): ";std::cin >> x_w >> y_w >> theta_w;Point local = transform.worldToLocal(x_w, y_w, theta_w);std::cout << "Local coordinates (x_local, y_local): (" << local.x << ", " << local.y << ")" << std::endl;return 0;
}
import mathclass RobotCoordinateTransform:def __init__(self, origin_x, origin_y):self.origin = (origin_x, origin_y)  # 局部坐标系的原点在世界坐标系中的坐标# 将世界坐标转换到局部坐标def world_to_local(self, x_w, y_w, theta_w):# 平移坐标系x_local = x_w - self.origin[0]y_local = y_w - self.origin[1]# 旋转坐标系x_local_rotated = x_local * math.cos(theta_w) - y_local * math.sin(theta_w)y_local_rotated = x_local * math.sin(theta_w) + y_local * math.cos(theta_w)return x_local_rotated, y_local_rotatedif __name__ == "__main__":origin_x = float(input("Enter the x-coordinate of the origin of the local coordinate system: "))origin_y = float(input("Enter the y-coordinate of the origin of the local coordinate system: "))transform = RobotCoordinateTransform(origin_x, origin_y)x_w = float(input("Enter the x-coordinate in the world coordinate system: "))y_w = float(input("Enter the y-coordinate in the world coordinate system: "))theta_w = float(input("Enter the orientation (in radians) in the world coordinate system: "))x_local, y_local = transform.world_to_local(x_w, y_w, theta_w)print(f"Local coordinates (x_local, y_local): ({x_local}, {y_local})")

矩阵实现:

在这里插入图片描述
下面是代码c++和python实现:

#include <iostream>
#include <cmath>
#include <Eigen/Dense>  // Eigen库用于矩阵运算class RobotCoordinateTransform {
private:Eigen::Vector2d origin;  // 局部坐标系的原点在世界坐标系中的坐标public:RobotCoordinateTransform(double originX, double originY) : origin(originX, originY) {}// 将世界坐标转换到局部坐标std::pair<double, double> worldToLocal(double x_w, double y_w, double theta_w) {// 平移坐标系的矩阵Eigen::Matrix3d translationMatrix;translationMatrix << 1, 0, -origin[0],0, 1, -origin[1],0, 0, 1;// 旋转坐标系的矩阵Eigen::Matrix3d rotationMatrix;rotationMatrix << cos(theta_w), -sin(theta_w), 0,sin(theta_w),  cos(theta_w), 0,0,             0,            1;// 世界坐标的齐次坐标Eigen::Vector3d worldCoords(x_w, y_w, 1);// 应用平移和旋转变换Eigen::Vector3d localCoords = rotationMatrix * translationMatrix * worldCoords;return std::make_pair(localCoords[0], localCoords[1]);}
};int main() {double originX, originY;std::cout << "Enter the x-coordinate of the origin of the local coordinate system: ";std::cin >> originX;std::cout << "Enter the y-coordinate of the origin of the local coordinate system: ";std::cin >> originY;RobotCoordinateTransform transform(originX, originY);double x_w, y_w, theta_w;std::cout << "Enter the x-coordinate in the world coordinate system: ";std::cin >> x_w;std::cout << "Enter the y-coordinate in the world coordinate system: ";std::cin >> y_w;std::cout << "Enter the orientation (in radians) in the world coordinate system: ";std::cin >> theta_w;auto [x_local, y_local] = transform.worldToLocal(x_w, y_w, theta_w);std::cout << "Local coordinates (x_local, y_local): (" << x_local << ", " << y_local << ")" << std::endl;return 0;
}
Eigen::Vector2d 用于存储坐标点和原点。
Eigen::Matrix3d 用于表示3x3矩阵,进行平移和旋转操作。
worldToLocal 方法使用上述的数学公式和矩阵进行坐标变换。
import numpy as np
import mathclass RobotCoordinateTransform:def __init__(self, origin_x, origin_y):self.origin = np.array([[origin_x], [origin_y]])  # 局部坐标系的原点在世界坐标系中的坐标def world_to_local(self, x_w, y_w, theta_w):# 平移坐标系的矩阵translation_matrix = np.array([[1, 0, -self.origin[0][0]],[0, 1, -self.origin[1][0]],[0, 0, 1]])# 旋转坐标系的矩阵rotation_matrix = np.array([[math.cos(theta_w), -math.sin(theta_w), 0],[math.sin(theta_w), math.cos(theta_w), 0],[0, 0, 1]])# 世界坐标的齐次坐标world_coords = np.array([[x_w], [y_w], [1]])# 应用平移和旋转变换local_coords = np.dot(rotation_matrix, np.dot(translation_matrix, world_coords))return local_coords[0][0], local_coords[1][0]if __name__ == "__main__":origin_x = float(input("Enter the x-coordinate of the origin of the local coordinate system: "))origin_y = float(input("Enter the y-coordinate of the origin of the local coordinate system: "))transform = RobotCoordinateTransform(origin_x, origin_y)x_w = float(input("Enter the x-coordinate in the world coordinate system: "))y_w = float(input("Enter the y-coordinate in the world coordinate system: "))theta_w = float(input("Enter the orientation (in radians) in the world coordinate system: "))x_local, y_local = transform.world_to_local(x_w, y_w, theta_w)print(f"Local coordinates (x_local, y_local): ({x_local}, {y_local})")

Tips:
在这里插入图片描述

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

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

相关文章

【深度学习】图像风格混合——StyleGAN2原理解析

1、前言 上一篇文章&#xff0c;我们详细讲解了StyleGAN的原理。这篇文章&#xff0c;我们就来讲解一下StyleGAN2&#xff0c;也就是StyleGAN的改进版。 原论文&#xff1a;Analyzing and Improving the Image Quality of StyleGAN 参考代码&#xff1a;①Pytorch版本&#…

【Godot4.2】CanvasItem绘图函数全解析 - 7.自定义节点TextBoard

概述 之前发布的几篇文章几乎阐述了CanvasItem绘图函数最基础的内容。 本篇结合draw_style_box()和TextParagraph类&#xff0c;自定义了一个可以自适应宽高显示多行文本&#xff0c;且带有一个样式盒作为背景的文字板节点TextBoard。 系列目录 0.概述1.绘制简单图形2.设定绘…

SPP论文笔记

这篇论文讨论了在深度卷积网络中引入空间金字塔池化&#xff08;SPP&#xff09;层的方法&#xff0c;以解决传统深度卷积网络需要固定图像尺寸的限制。以下是论文各部分的总结&#xff1a; 1. 引言 论文指出现有的深度卷积神经网络&#xff08;CNN&#xff09;需要固定大小的…

全景剖析SSD SLC Cache缓存设计原理-2

四、SLC缓存对SSD的寿命是否有优化&#xff1f; 当使用QLC或TLC NAND闪存并将其切换到SLC模式进行写入时&#xff0c;会对闪存的寿命产生以下影响&#xff1a; 短期寿命提升&#xff1a; SLC模式下&#xff0c;每个存储单元仅存储一个比特数据&#xff0c;相对于QLC或TLC来说…

前端vue: 使用ElementUI适配国际化

i18n介绍 i18n&#xff08;其来源是英文单词 internationalization的首末字符i和n&#xff0c;18为中间的字符数&#xff09;是“国际化”的简称。 前端国际化步骤 1、安装i18n插件 安装插件时候&#xff0c;注意必须指定版本号&#xff0c;不然安装会报错。 npm i vue-i1…

linux 部署安装mongodb教程

现在去官网下载mongodb的tar包,在本地创建文件夹 cd /home wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.17.tgz tar -zxvf mongodb-linux-x86_64-rhel70-4.2.17.tgz mv mongodb-linux-x86_64-rhel70-4.2.17 mongodb cd /home/mongodb mkdir log t…

GAN:对抗式生成网络之图片生成

对抗式生成网络(Adversarial Generative Network, AGN)这一术语在您提供的信息中并未直接出现。通常,在深度学习文献和实践中,与“对抗”和“生成”概念相结合的网络架构指的是生成式对抗网络(Generative Adversarial Networks, GANs)。GANs由Ian Goodfellow等人于2014年…

数据结构之单链表相关刷题

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构 数据结构之单链表的相关知识点及应用-CSDN博客 下面题目基于上面这篇文章&#xff1a; 下面有任何不懂的地方欢迎在评论区留言或…

wangeditor与deaftjs的停止维护,2024编辑器该如何做技术选型(一)

wangeditor暂停维护的声明&#xff1a; wangeditor是国内开发者开发的编辑器&#xff0c;用户也挺多&#xff0c;但是由于作者时间关系&#xff0c;暂停维护。 deaft的弃坑的声明&#xff1a; draft是Facebook开源的&#xff0c;但是也弃坑了&#xff0c;说明设计的时候存在很大…

LeetCode最长有效括号问题解

给定一个仅包含字符的字符串(’ 和 ‘)’&#xff0c;返回最长有效的长度(出色地-形成) 括号子弦。 示例1&#xff1a; 输入&#xff1a;s “(()” 输出&#xff1a;2 说明&#xff1a;最长的有效括号子字符串是 “()” 。 示例2&#xff1a; 输入&#xff1a;s “)()())…

在Linux上利用mingw-w64生成exe文件

一、概要 1、elf与exe 在Linux上用gcc直接编译出来的可执行文件是elf格式的&#xff0c;在Windows上是不能运行的 Windows上可执行文件的格式是exe 利用mingw-w64可以在Linux上生成exe格式的可执行文件&#xff0c;将该exe文件拷贝到Windows上就可以运行 2、程序要留给用户…

体验Humane AI:我与可穿戴AI别针的生活

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

如何使用 ArcGIS Pro 制作热力图

热力图是一种用颜色表示数据密度的地图&#xff0c;通常用来显示空间分布数据的热度或密度&#xff0c;我们可以通过 ArcGIS Pro 来制作热力图&#xff0c;这里为大家介绍一下制作的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数…

JVM复习

冯诺依曼模型与计算机处理数据过程相关联&#xff1a; 冯诺依曼模型&#xff1a; 输入/输出设备存储器输出设备运算器控制器处理过程&#xff1a; 提取阶段&#xff1a;输入设备传入原始数据&#xff0c;存储到存储器解码阶段&#xff1a;由CPU的指令集架构ISA将数值解…

分布式技术--------------ELK大规模日志实时收集分析系统

目录 一、ELK日志分析系统 1.1ELK介绍 1.2ELK各组件介绍 1.2.1ElasticSearch 1.2.2Kiabana 1.2.3Logstash 1.2.4可以添加的其它组件 1.2.4.1Filebeat filebeat 结合logstash 带来好处 1.2.4.2缓存/消息队列&#xff08;redis、kafka、RabbitMQ等&#xff09; 1.2.4.…

搭建基于Hexo的个人博客,以及git相关命令

全文写完之后的总结 测试命令 hexo clean hexo g hexo s 上传到服务器命令 hexo clean hexo g hexo d 上传到服务器&#xff08;如果上一个命令用不了&#xff09;&#xff0c;也要先hexo clean,hexo g git init git add . git commit -m "first commit" git p…

部署HDFS集群(完全分布式模式、hadoop用户控制集群、hadoop-3.3.4+安装包)

目录 前置 一、上传&解压 &#xff08;一 &#xff09;上传 &#xff08;二&#xff09;解压 二、修改配置文件 &#xff08;一&#xff09;配置workers文件 &#xff08;二&#xff09;配置hadoop-env.sh文件 &#xff08;三&#xff09;配置core-site.xml文件 &…

Fuel tank position

Fuel tank position 汽车油箱位置在哪里&#xff0c;加油的时候就不会听错方向

uni-app的页面中使用uni-map-common的地址解析(地址转坐标)功能,一直报请求云函数出错

想在uni-app的页面中使用uni-map-common的地址解析&#xff08;地址转坐标&#xff09;功能&#xff0c;怎么一直报请求云函数出错。 不看控制台啊,弄错了控制台&#xff0c;就说怎么一直没有打印出消息。 所以开始换高德地图的&#xff0c;昨天申请了两个 一开始用的第二个web…

OpenAI CEO山姆·奥特曼推广新AI企业服务,直面微软竞争|TodayAI

近期&#xff0c;OpenAI的首席执行官山姆奥特曼在全球多地接待了来自《财富》500强公司的数百名高管&#xff0c;展示了公司最新的人工智能服务。在旧金山、纽约和伦敦的会议上&#xff0c;奥特曼及其团队向企业界领袖展示了OpenAI的企业级产品&#xff0c;并进行了与微软产品的…