AIGC笔记--关节点6D位姿按比例融合

1--核心代码

        6D位姿一般指平移向量和旋转向量,Maya软件中关节点的6D位姿指的是相对平移向量欧拉旋转向量

        为了按比例融合两个Pose,首先需要将欧拉旋转向量转换为旋转矩阵,在将旋转矩阵转换为四元数,利用球面线性插值实现Pose的融合,融合后的四元数需要重新转换为欧拉旋转向量,整个流程如下:欧拉旋转向量→旋转矩阵→四元数→球面线性插值→旋转矩阵→欧拉旋转向量

'''
@File    :   fusion6DPose.py
@Time    :   2024/03/14 17:08:00
@Author  :   Jinfu Liu
@Version :   1.0 
@Desc    :   fusion 6DPose between two motion
'''
import numpy as np
from scipy.spatial.transform import Rotation
from pyquaternion import Quaternion

def fusion6DPose(pose1:np.ndarray, pose2:np.ndarray, rate:float) -> np.ndarray:
    '''
    按比例融合平移向量和欧拉旋转向量
    '''
    assert pose1.shape[0] == pose2.shape[0]
    return_pose = np.zeros_like(pose1) # [num_joint, 6]
    for joint_idx in range(pose1.shape[0]): # 遍历处理所有关节点
        T1 = pose1[joint_idx][:3] # 平移向量
        R1 = pose1[joint_idx][3:] # 欧拉旋转
        T2 = pose2[joint_idx][:3] # 平移向量
        R2 = pose2[joint_idx][3:] # 欧拉旋转
        
        R1 = Rotation.from_euler('xyz', list(R1), degrees=True).as_matrix() # 欧拉角->旋转矩阵
        R2 = Rotation.from_euler('xyz', list(R2), degrees=True).as_matrix()
        
        T3 = rate * T1 + (1 - rate) * T2
        Q1 = Rotation.from_matrix(R1).as_quat() # 旋转矩阵->四元数
        Q2 = Rotation.from_matrix(R2).as_quat()
        Q3 = Quaternion.slerp(Quaternion(Q1), Quaternion(Q2), 1-rate) # 球面线性插值
        R3 = Rotation.from_quat(Q3.elements).as_matrix() # 四元数->旋转矩阵
        R3 = Rotation.from_matrix(R3).as_euler('xyz', degrees = True) # 旋转矩阵->欧拉角
        return_pose[joint_idx][:3] = T3
        return_pose[joint_idx][3:] = R3
    
    return return_pose

if __name__ == "__main__":
    # 关节点的6D位姿
    pose1 = np.array([[1.208, -1.038, 95.552, 142.537, -84.184, -136.806]]) # Tx, Ty, Tz, Rx, Ry, Rz
    
    # 关节点的6D位姿
    pose2 = np.array([[0, -0.764, 95.771, -71.97, -97.655, 42.773]]) # Tx, Ty, Tz, Rx, Ry, Rz

    # 融合比例
    alpha = 0.5

    # 计算融合后的刚体C的6D位姿
    # Pose3 = rate * pose1 + (1 - rate) * Pose2
    Pose3 = fusion6DPose(pose1, pose2, alpha) # 这里只用一个关节点进行测试

    # 融合后
    print("PoseC: ", Pose3) # [[0.604, -0.901, 95.6615, 124.11717241, -83.2593501, -135.84186147]]
    print("All done!")

2--Maya验证

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

指针 六 ---总结

文章目录 前言1.指针和指针变量2.const修饰2.1.const int* p 修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本⾝的内容可变。2.2 int const *p2.3 int *const p2.4 const int* const p 3. 指针数组(array of pointers&…

彻底学会系列:一、机器学习之梯度下降(1)

1 梯度下降概念 1.1 概念 梯度下降是一种优化算法,用于最小化一个函数的值,特别是用于训练机器学习模型中的参数,其基本思想是通过不断迭代调整参数的值,使得函数值沿着梯度的反方向逐渐减小,直至达到局部或全局最小…

如何在webapp中手动部署

前言:这个有不知道怎么下载Tomcat的可以看我这篇博客的前面,有相关链接,下载好后我那边也有如何运行成功的 在idea中配置tomcat服务器,部署一个项目-CSDN博客 接下来进入这篇博客的正题!怎么手动部署 先找到我们下载…

java.lang.NoSuchMethodException异常解决

标题 java.lang.NoSuchMethodException异常的正确解决方法摘要🚀 异常介绍🧐 异常原因分析🛠 解决方法核对方法名称和参数使用正确的方法签名调整方法访问权限 📝 解决步骤详解🖥 代码案例演示❓ QA部分Q: 如何区分jav…

Linux环境开发工具之yum

前言 前面我们已经对基本的指令和权限进行了介绍,本期开始我们将介绍常用的开发工具。例如:软件包管理器yum。 本期内容介绍 Linux上安装软件的方式 什么是yum yum的相关操作 yum的本地配置和yum源 一、Linux上安装软件的方式 在介绍Linux上如何安装一…

uboot的移植——移植uboot官方的uboot到x210开发板(2)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 参考内容 1、uboot的移植——移植uboot官方的uboot到x210开发板(1) 2、uboot启动流程——C阶段的start_armboot函数-CSDN博客 3、以官方uboot移植uboot(SD卡驱动移植)-CSDN博…

Linux 块设备驱动

Linux 三大驱动分别是:字符设备驱动、块设备驱动、网络设备驱动。 块设备是针对存储设备的,比如 SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机械硬盘、固态硬盘等。因此块设备驱动其实就是这些存储设备驱动,块设备驱动相比字符设备驱…

【洞察】区块链、web3、元宇宙等技术共同催生出了什么样的商业未来?

下文为中国信息通信研究院云计算与大数据研究所所长何宝宏为思二勋所著的《分布式商业生态战略:数字商业新逻辑与企业数字化转型新策略》一书所作的推荐序。 近两年来,区块链已从鲜为人知发展到尽人皆知且众说纷纭,从产业初期的静默发展到产…

若你有才能,最好能遇上识才之人,高俅发迹的故事很好诠释了千里马与伯乐的关系

若你有才能,最好能遇上识才之人,高俅发迹的故事很好诠释了千里马与伯乐的关系 其实,“千里马”和“伯乐”都是中国古代传说里的角色。伯乐是古代一个善于相马(识别马的好坏)的人,而“千里马”则是指一匹能跑…

2、FreeRTOS之队列管理

xQueueReceive() 用于从队列中接收 ( 读取)数据单元。接收到的单元同时会从队列 中删除。 xQueuePeek() 也是从从队列中接收数据单元,不同的是并不从队列中删出接收到 的单元。 uxQueueMessagesWaiting()用于查询队列中当前有效数据单元个数。 写队列任…

简介:项目管理九大知识五大过程

前言 项目管理(Project Management,PM/Management by Projects,MBP) 在有限的资源约束下,运用系统的观点、方法和理论,对项目涉及的全部工作进行有效地管理。即从项目的投资决策开始到项目结束的全过程进行计划、组织、指挥、协调…

【首次抽奖】16G、32G免费送!云服务器选购推荐 京东云 阿里云 腾讯云对比 幻兽帕鲁 雾锁王国 省钱学生党

好消息:抽奖活动开启!时间:3月17日——3月24日 最高奖品:16G 6个月;32G 3个月 抽奖规则:B站点赞评论关注即可参与抽奖,3.24日公布获奖名单。 抽奖地址: 【首次抽奖】16G、32G免费…

TTS 擂台: 文本转语音模型的自由搏击场

对文本转语音 (text-to-speech, TTS) 模型的质量进行自动度量非常困难。虽然评估声音的自然度和语调变化对人类来说是一项微不足道的任务,但对人工智能来说要困难得多。为了推进这一领域的发展,我们很高兴推出 TTS 擂台。其灵感来自于LMSys为 LLM 提供的…

检索增强生成(RAG)应用的构建:LangChain与LlamaIndex的比较与选择

对于我要做RAG应用,我应该使用两者中的哪一个。或者说还是都使用? 在人工智能领域,检索增强生成(RAG)应用正变得越来越受欢迎,因为它们能够结合大型语言模型(LLMs)的自然语言处理能力…

不允许你不知道的Python私有属性和私有方法

​ 1.为什么要使用私有属性和私有方法 嘿,各位Python爱好者们,你们有没有遇到过这样的情况:你正在编写一个类,里面有一些属性或方法,你并不想让它们被外部直接访问或修改,但又需要某种方式来控制它们的访问…

【C/C++】C语言开发者必读:迈向C++的高效编程之旅

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方…

VUE3项目学习系列--Axios二次封装(五)

Axios中文文档 | Axios中文网 (axios-http.cn) Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequ…

【回归预测】基于SSA-BP(麻雀搜索算法优化BP神经网络)的回归预测 多输入单输出【Matlab代码#69】

文章目录 【可更换其他算法,获取资源请见文章第6节:资源获取】1. BP神经网络2. 麻雀搜索算法3. SSA-BP神经网络模型的构建4. 部分代码展示5. 仿真结果展示 【可更换其他算法,获取资源请见文章第6节:资源获取】 1. BP神经网络 BP&…

新手向-从VNCTF2024的一道题学习QEMU Escape

[F] 说在前面 本文的草稿是边打边学边写出来的,文章思路会与一个“刚打完用户态 pwn 题就去打 QEMU Escape ”的人的思路相似,在分析结束以后我又在部分比较模糊的地方加入了一些补充,因此阅读起来可能会相对轻松(当然也不排除这是…

python之前端css样式(一)

css ID选择器 #c1{color:red;#边框为红色border:1px solid red; } <div id"c2">中国移动</div> 类选择器 .xx{color:blue; } <div class"xx">中国联通</div> 标签选择器 li{color: pink; } <ul><li>北京</li…