通过向量叉乘计算姿态充电桩朝向

                          通过向量叉乘计算姿态充电桩朝向

需求:

通过geometry_msgs::PointStamped intersection_ros_line1; geometry_msgs::PointStamped intersection_ros_line2;geometry_msgs::PointStamped intersection_ros_point;其中 intersection_ros_line1与intersection_ros_point连成线,intersection_ros_line1起始端点,intersection_ros_point末尾端点。 intersection_ros_point与intersection_ros_line2连成线,intersection_ros_point起始端点intersection_ros_line2末尾端点。geometry_msgs::PointStamped mid 是 intersection_ros_line1与intersection_ros_line2的中心点, geometry_msgs::PointStamped mid 与 intersection_ros_point 连成直线作为姿态的x轴,通过这4个点计算图形的姿态,输出旋转矩阵及转成4元素。两线段的交点合方向朝向即为x正方向,geometry_msgs::PointStamped mid 与 intersection_ros_point 连成直线作为姿态的x轴,坐标系遵循右手法则,计算Z轴方向向量用(geometry_msgs::PointStamped mid 与 intersection_ros_point 向量与 intersection_ros_point与intersection_ros_line2向量叉乘得到)。计算Y轴方向向量 用Z轴方向向量与geometry_msgs::PointStamped mid 与 intersection_ros_point 向量叉乘得到。用Eigen库计算,此外还需要发布把结果通过tf1发布x=0.0,y=0.0,z=0.0,姿态用以上算出来的。

需要进行以下步骤:

  1. 定义几何信息的结构。
  2. 计算 mid 点。
  3. 计算旋转矩阵。
  4. 计算四元数。
  5. 使用 Eigen 库来进行矩阵计算。
  6. 发布结果通过 tf1。
#include <ros/ros.h>
#include <geometry_msgs/PointStamped.h>
#include <tf/transform_broadcaster.h>
#include <eigen3/Eigen/Dense>// 计算 mid 点
//mid 点是 intersection_ros_line1 和 intersection_ros_line2 的中点。geometry_msgs::PointStamped calculateMidPoint(const geometry_msgs::PointStamped& p1, const geometry_msgs::PointStamped& p2) {geometry_msgs::PointStamped mid;mid.point.x = (p1.point.x + p2.point.x) / 2.0;mid.point.y = (p1.point.y + p2.point.y) / 2.0;mid.point.z = (p1.point.z + p2.point.z) / 2.0;return mid;
}
//计算旋转矩阵,姿态
//需要计算一个旋转矩阵来表示新的坐标系。首先,我们需要计算 x, y, z 三个轴的向量。Eigen::Matrix3d calculateRotationMatrix(const geometry_msgs::PointStamped& intersection_ros_line1, const geometry_msgs::PointStamped& intersection_ros_point, const geometry_msgs::PointStamped& mid, const geometry_msgs::PointStamped& intersection_ros_line2) {Eigen::Vector3d x_axis(intersection_ros_point.point.x - mid.point.x, intersection_ros_point.point.y - mid.point.y, intersection_ros_point.point.z - mid.point.z);Eigen::Vector3d z_axis = x_axis.cross(Eigen::Vector3d(intersection_ros_point.point.x - intersection_ros_line2.point.x, intersection_ros_point.point.y - intersection_ros_line2.point.y, intersection_ros_point.point.z - intersection_ros_line2.point.z));Eigen::Vector3d y_axis = z_axis.cross(x_axis);x_axis.normalize();y_axis.normalize();z_axis.normalize();Eigen::Matrix3d rotation_matrix;rotation_matrix << x_axis.x(), y_axis.x(), z_axis.x(),x_axis.y(), y_axis.y(), z_axis.y(),x_axis.z(), y_axis.z(), z_axis.z();return rotation_matrix;
}//计算四元数
//从旋转矩阵中计算四元数以便后续使用。
Eigen::Quaterniond calculateQuaternion(const Eigen::Matrix3d& rotation_matrix) {Eigen::Quaterniond quaternion(rotation_matrix);return quaternion;
}void publishTransform(const Eigen::Quaterniond& quaternion) {static tf::TransformBroadcaster br;tf::Transform transform;transform.setOrigin(tf::Vector3(0.0, 0.0, 0.0));tf::Quaternion q(quaternion.x(), quaternion.y(), quaternion.z(), quaternion.w());transform.setRotation(q);br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", "robot_frame"));
}
//在主函数中,我们初始化 ROS 节点,计算 mid 点、旋转矩阵和四元数,并定期发布这些数据。
int main(int argc, char** argv) {ros::init(argc, argv, "pose_calculator");ros::NodeHandle nh;geometry_msgs::PointStamped intersection_ros_line1;geometry_msgs::PointStamped intersection_ros_line2;geometry_msgs::PointStamped intersection_ros_point;// Initialize your points here// Example:// intersection_ros_line1.point.x = ...// intersection_ros_line1.point.y = ...// intersection_ros_line1.point.z = ...geometry_msgs::PointStamped mid = calculateMidPoint(intersection_ros_line1, intersection_ros_line2);Eigen::Matrix3d rotation_matrix = calculateRotationMatrix(intersection_ros_line1, intersection_ros_point, mid, intersection_ros_line2);Eigen::Quaterniond quaternion = calculateQuaternion(rotation_matrix);ros::Rate rate(10.0);while (nh.ok()) {publishTransform(quaternion);rate.sleep();}return 0;
}

详细解释

  1. 计算中点 (calculateMidPoint): 通过求两个点的坐标平均值计算中点。
  2. 计算旋转矩阵 (calculateRotationMatrix): 使用交叉乘积计算出坐标系的 z 轴,然后计算 y 轴,最后标准化这些向量并构建旋转矩阵。
  3. 计算四元数 (calculateQuaternion): 使用 Eigen 库从旋转矩阵生成四元数。
  4. 发布变换 (publishTransform): 使用 tf 库发布计算的四元数变换。
  5. 主函数: 初始化 ROS 节点,计算中点、旋转矩阵和四元数,并定期发布这些数据。

建议的改进步骤:

a. 增加单元测试以验证旋转矩阵和四元数的计算结果是否正确:

  • 创建测试用例,确保每个函数在不同输入下都能返回正确的结果。

b. 增加异常处理,以防止由于输入数据错误导致的程序崩溃:

  • 检查输入点是否有效,确保计算过程不会遇到除零或无效操作。

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

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

相关文章

【编程语言】Python平台化为何比Java差?

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

C语言学习系列:初识C语言

前言&#xff0c;C语言是什么 语言&#xff0c;比如中文、英语、法语、德语等&#xff0c;是人与人交流的工具。 C语言也是语言&#xff0c;不过是一种特殊的语言&#xff0c;是人与计算机交流的工具。 为什么叫C语言呢&#xff1f; 这就要从C语言的历史说起了。 一&#…

【电脑小白】装机从认识电脑部件开始

前言 在 B 站上刷到了一个很牛逼的电脑装机视频&#xff0c;很适合电脑小白学习&#xff0c;故用文本记录下。 推荐对组装台式电脑有兴趣的小伙伴都去看看这个视频&#xff1a; 原视频链接&#xff1a;【装机教程】全网最好的装机教程&#xff0c;没有之一_哔哩哔哩_bilibil…

Transformer模型:未来的改进方向与潜在影响

Transformer模型&#xff1a;未来的改进方向与潜在影响 自从2017年Google的研究者们首次提出Transformer模型以来&#xff0c;它已经彻底改变了自然语言处理&#xff08;NLP&#xff09;领域的面貌。Transformer的核心优势在于其“自注意力&#xff08;Self-Attention&#xf…

做好程序前设计

不要小看任何一道编程题目&#xff01;一定一定一定要想好之后再动手&#xff01;&#xff01;&#xff01; 带上你的草稿本&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xf…

Vite使用unplugin-auto-import实现vue3中的自动导入

unplugin-auto-import 是基于 unplugin 写的&#xff0c;支持 Vite、Webpack、Rollup、esbuild 多个打包工具。我们可以使用unplugin-auto-import实现依赖的自动导入&#xff0c;不用再频繁导入依赖包&#xff0c;从而提交我们的开发效率。如下&#xff0c;以vue3vite中使用改插…

Linux系统之Ward服务器监控工具

Linux系统之Ward服务器监控工具 文章目录 Linux系统之Ward服务器监控工具介绍资源列表基础环境一、安装Java环境二、下载ward的jar包2.2、下载软件包 三、安装ward工具3.1、启动ward服务3.2、查看你后台启动任务3.3、监听ward服务端口 四、访问ward服务4.1、进入ward初始界面4.…

Ubuntu20.04.6操作系统安装教程

一、VMware Workstation16安装 选择安装VMware Workstation&#xff0c;登录其官网下载安装包&#xff0c;链接如下&#xff1a; 下载 VMware Workstation Pro 下载后运行安装向导&#xff0c;一直Next即可。 二、Ubuntu镜像下载 ubuntu20.04 选择需要下载的镜像类型下载即…

采集罗克韦尔AB、西门子等PLC数据发布成HTTP接口

智能网关IGT-DSER集成了多种PLC的原厂协议&#xff0c;方便实现各种PLC的原厂协议转换为HTTP协议的服务端&#xff0c;通过网关的参数配置软件绑定JSON文件的字段与PLC寄存器地址&#xff0c;即可接收来自客户端的GET、PUT和POST命令&#xff0c;解析和打包JSON文件(JSON文件格…

代码随想录算法训练营第二十七天

题目&#xff1a;122. 买卖股票的最佳时机 II 本题首先要清楚两点&#xff1a; 只有一只股票&#xff01;当前只有买股票或者卖股票的操作 想获得利润至少要两天为一个交易单元。 局部最优&#xff1a;收集每天的正利润&#xff0c;全局最优&#xff1a;求得最大利润。 我…

PHP安装配置

文章目录 1.下载PHP2.配置环境变量3.Apache安装配置 1.下载PHP PHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言&#xff0c;与C语言类似&#xff0c;是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法…

北京职场社交app开发,“职”在必行

工作一直是人们日常生活中占比较大的一部分&#xff0c;在做好本职工作的同时&#xff0c;职场社交也同样重要。目前&#xff0c;北京职场社交app不仅帮助求职者寻求工作&#xff0c;而且为工作者提供了获取信息与机遇的平台。 一&#xff0e; 北京职场社交app面向的用户群体 …

怎么管理网站的数据

每一个网站都会有很多的数据&#xff0c;这些数据的来源&#xff0c;有一些是直接把数据存放在运行文件里面&#xff0c;有一些则是存放在数据库里面&#xff0c;如MySQL、SQL Server等等&#xff0c;这些数据库都是需要安装指定的数据库环境才能运行起来&#xff0c;数据库的存…

Mybatis --- 动态SQL 和数据库连接池

文章目录 一、什么是动态SQL 重要性二、动态SQL的编写 ---注解三、动态SQL的编写 ---xml3.1 增加场景 if标签3.2 处理代码块内容 --- trim 标签3.3 查询场景 where标签3.4 更新场景 set标签3.5 删除场景 <foreach> 循环标签3.6 include、sql标签 代码重复度问题 四、数据…

软考高级论文真题“论大数据lambda架构”

论文真题 大数据处理架构是专门用于处理和分析巨量复杂数据集的软件架构。它通常包括数据收集、存储、处理、分析和可视化等多个层面&#xff0c;旨在从海量、多样化的数据中提取有价值的信息。Lambda架构是大数据平台里最成熟、最稳定的架构&#xff0c;它是一种将批处理和流…

5G消息 x 金融 | 数字金融新形态

5G消息 x 金融 | 数字金融新形态 5G 消息基于终端原生入口&#xff0c;可为金融消费者提供轻便安全的服务入口&#xff0c;为金融机构开拓了低成本的客户触达渠道。 5G 消息 X 金融 —— 优势亮点 5G 消息凭借“RCS&#xfe62;Platform&#xfe62;Chatbot”方式构建了银行与客…

通过iDrac8.0安装Windows Server 2022

1:登录iDrac。 2&#xff1a;启动虚拟控制台。 3&#xff1a;点击虚拟机介质。 4&#xff1a;连接虚拟介质。 5&#xff1a;映射CD/DVD 6: 找到本地的安装镜像。映射设备。 7&#xff1a;在下次引导中选择虚拟CD/DVD/ISO引导。 8&#xff1a;可以在电源中选择重置设备启动&…

docker镜像拉取K8s的calico,Pod报错Init:ImagePullBackOff及kubekey生成离线包报错error: Pipeline[ArtifactExportpipe的解决

配置k8s集群出现问题 起初以为是版本问题&#xff0c;最后比对了一下发现没有问题。使用 kubectl describe calico-node-mg9xh -n kube-system命令查看发现docker pull 镜像失败&#xff0c;但是docker国内镜像源早就配置过了。 猜测Docker的缓存可能会导致拉取镜像失败。尝试…

个人云服务器已经被安全合规等卡脖子 建议不要买 买了必定后悔 安全是个大问题 没有能力维护

我的想法 自己买一个云服务器&#xff0c;先自己边做边学习&#xff0c;向往硅谷精神&#xff0c;财富与自由。如果能赚钱&#xff0c;就开个公司。这次到期就放弃了。 我前前后后6年花6000多元买云服务器。业余花了无数的精力&#xff0c;从2018到现在 &#xff0c;也没有折…

基于R-Tree的地理空间数据分析加速

几年前&#xff0c;我正在做一个业余项目。我想创建一个 Web 应用程序&#xff0c;推荐当地的特色景点&#xff0c;例如咖啡馆、书店或隐藏的酒吧。我的想法是在地图上显示用户触手可及的所有兴趣点。我的数据集中有数十万个点&#xff0c;我必须巧妙地过滤用户给定范围内的数据…