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

三角函数实现

在这里插入图片描述
下面是代码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.rhkb.cn/news/308186.html

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

相关文章

开源项目one-api的k8s容器化部署(上)-- 制作镜像及部署准备

一、背景 最近需要对开源项目one-api进行k8s容器化部署&#xff0c;主要分以下几个步骤&#xff1a; 制作docker镜像申请mysql和redis数据库docker-compose部署方式k8s部署方式 整个的篇幅比较长&#xff0c;将会分成上下两篇来阐述。 二、制作docker镜像 开源项目one-api…

[目标检测] OCR: 文字检测、文字识别、text spotter

概述 OCR技术存在两个步骤&#xff1a;文字检测和文字识别&#xff0c;而end-to-end完成这两个步骤的方法就是text spotter。 文字检测数据集摘要 daaset语言体量特色MTWI中英文20k源于网络图像&#xff0c;主要由合成图像&#xff0c;产品描述&#xff0c;网络广告(淘宝)MS…

【C Hash Map from Redis】

将Redis源码中的哈希表底层逻辑提取&#xff0c;并进行最小demo级测试将对应文件抽出&#xff0c;通过宏替换等方式保证源码编译通过main.c编写测试demo &#xff0c;注册哈希函数和值比较函数&#xff08;必选项&#xff09; /* Hash Tables Implementation.** This file imp…

【spring】AOP切面注解学习(二)

文接上篇&#xff1a;【spring】AOP切面注解学习&#xff08;一&#xff09; AOP切面注解测试示例代码 示例代码 一 maven的pom文件导入 <dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></depende…

某次众测的加解密对抗

前言 起源于某次众测中&#xff0c;遇到请求包响应包全密文的情况&#xff0c;最终实现burp中加解密。 用到的工具有 sekiro&#xff08;rpc转发&#xff09;flask&#xff08;autodecoder自定义接口&#xff09;autodecoder&#xff08;burp插件转发&#xff09; debug部分…

说说我理解的数据库中的Schema吧

一、SQL标准对schema如何定义&#xff1f; ISO/IEC 9075-1 SQL标准中将schema定义为描述符的持久命名集合&#xff08;a persistent, named collection of descriptors&#xff09;。 大部分的网上资料定义Schema如下&#xff1a; schema是用来组织和管理数据的一种方式。它…

【LAMMPS学习】八、基础知识(2.7)NEMD 模拟

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

Linux的学习之路:9、冯诺依曼与进程(1)

摘要 本章主要是说一下冯诺依曼体系结构和进程的一部分东西。 目录 摘要 一、冯诺依曼体系结构 二、操作系统的概念 三、设计OS的目的 四、管理 五、进程的基本概念 六、PCB 七、在Linux环境下查看进程 八、使用代码创建进程 九、思维导图 一、冯诺依曼体系结构 如…

【每日一算】冒泡算法

冒泡算法就是给数据排序的意思。比如说升序&#xff0c;17&#xff0c;8&#xff0c;9&#xff0c;28&#xff0c;5.升序之后的结果就是5&#xff0c;8&#xff0c;9&#xff0c;17&#xff0c;28. 从我们的大脑思维来看&#xff0c;结果一眼就有了&#xff0c;可是机器要怎么才…

排序1——C语言

排序 1. 复杂度2. 插入排序2.1 直接插入排序2.2 希尔排序 3. 选择排序3.1 直接选择排序3.2 堆排序 排序在生活中很常见&#xff0c;比如在网购时&#xff0c;按价格排序&#xff0c;按好评数排序&#xff0c;点餐时&#xff0c;按评分排序等等。而排序有快和慢&#xff0c;快的…

【排序 贪心】3107. 使数组中位数等于 K 的最少操作数

算法可以发掘本质&#xff0c;如&#xff1a; 一&#xff0c;若干师傅和徒弟互有好感&#xff0c;有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二&#xff0c;有无限多1X2和2X1的骨牌&#xff0c;某个棋盘若干格子坏了&#xff0c;如何在没有坏…

C语言中抽象的编译和链接原理

今天04.12&#xff0c;身体小有不适&#xff0c;但是睡不着觉&#xff0c;秉着不能浪费时间的原则&#xff0c;现在就简单写一下有关我们C语言中编译和链接的大体过程吧&#xff0c;因为编译和链接是比较抽象的&#xff0c;而且内容是比较底层&#xff0c;我们这里就简单了解它…

Chatgpt掘金之旅—有爱AI商业实战篇|SEO 咨询业务|(十七)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业在SEO 咨询业务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随…

策略模式(知识点)——设计模式学习笔记

文章目录 0 概念1 使用场景2 优缺点2.1 优点2.2 缺点 3 实现方式4 和其他模式的区别5 具体例子实现5.1 实现代码 0 概念 定义&#xff1a;定义一个算法族&#xff0c;并分别封装起来。策略让算法的变化独立于它的客户&#xff08;这样就可在不修改上下文代码或其他策略的情况下…

蓝桥杯 每天2题 day6

碎碎念&#xff1a;哇咔咔 要不是中间缺勤一天就圆满day7了&#xff01;最后一晚上&#xff01;写题复习哇咔咔 唉&#xff0c;睡了一觉就看不下去了&#xff0c;&#xff0c;&#xff0c;看看之前的笔记洗洗睡觉&#xff0c;&#xff0c;&#xff0c; 记得打印准考证带好东西…

Java面试篇9——并发编程

并发编程知识梳理 提示&#xff0c;此仅为面试&#xff0c;若想对线程有跟完整了解&#xff0c;请点击这里 提示&#xff1a;直接翻到最后面看面试真题&#xff0c;上面的为详解 面试考点 文档说明 在文档中对所有的面试题都进行了难易程度和出现频率的等级说明 星数越多代表…

LeetCode34:在排序数组中查找元素的第一个和最后一个位置(Java)

目录 题目&#xff1a; 题解&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 题目&#xff1a; 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&…

3D场景编辑方法——CustomNeRF

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;3D场景编辑方法——CustomNeRF1、研究背景2、提出方法3、CustomNeRF3.1、整体框架步骤3.2、对特定问题的解决 4、实验结果5、总结…

一辆汽车的节拍时间是怎样的?

节拍时间&#xff0c;又称 takt time&#xff0c;是德语中“节奏”的意思。在汽车制造业中&#xff0c;它指的是按照客户需求和生产计划&#xff0c;生产一辆汽车所需的时间。这个时间是固定的&#xff0c;它决定了生产线上每个工序的操作速度和节奏&#xff0c;是生产线上所有…

配置交换机 SSH 管理和端口安全

实验1:配置交换机基本安全和 SSH管理 1、实验目的 通过本实验可以掌握&#xff1a; 交换机基本安全配置。SSH 的工作原理和 SSH服务端和客户端的配置。 2、实验拓扑 交换机基本安全和 SSH管理实验拓扑如图所示。 3、实验步骤 &#xff08;1&#xff09;配置交换机S1 Swit…