国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++/Python:羅德里格斯旋轉(zhuǎn)矩陣

這篇具有很好參考價(jià)值的文章主要介紹了C++/Python:羅德里格斯旋轉(zhuǎn)矩陣。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

背景:給定兩個(gè)向量V1,V2,怎么求之間的轉(zhuǎn)換矩陣?

[羽量級(jí)公司發(fā)月餅了,比去年強(qiáng),手提式的了\dog]


1、求旋轉(zhuǎn)軸

通過V1和V2的叉積,可以知道旋轉(zhuǎn)軸Vcross(垂直屏幕指向外側(cè)或內(nèi)側(cè)的向量)

C++/Python:羅德里格斯旋轉(zhuǎn)矩陣

vcross = np.cross(v1, v2)

這里還可以將旋轉(zhuǎn)軸向量單位化,方便后面使用

vcross_normalize = 1 / np.linalg.norm(vcross) * vcross

?2、求旋轉(zhuǎn)角度

還可以知道兩向量的夾角(這個(gè)夾角是沿著旋轉(zhuǎn)軸的角度,因?yàn)閮上蛄看_定了一個(gè)平面,而旋轉(zhuǎn)軸是垂直平面的)

C++/Python:羅德里格斯旋轉(zhuǎn)矩陣

theta = math.acos(v1.dot(v2)/(np.linalg.norm(v1)*np.linalg.norm(v2)))

?3、求旋轉(zhuǎn)矩陣

知道了旋轉(zhuǎn)軸以及旋轉(zhuǎn)角度,就可以祭出羅德里格斯(Rodriguez)公式了,可以直接代入得出旋轉(zhuǎn)矩陣

C++/Python:羅德里格斯旋轉(zhuǎn)矩陣

?上式中的分別指單位化后的旋轉(zhuǎn)軸向量vcross_normalize的xyz

Rot = np.zeros((3, 3), dtype=np.float32)
Rot[0][0] = math.cos(theta)+(1-math.cos(theta))*(vcross_normalize[0]**2)
Rot[0][1] = vcross_normalize[0]*vcross_normalize[1]*(1-math.cos(theta))-vcross_normalize[2]*math.sin(theta)
Rot[0][2] = vcross_normalize[1]*math.sin(theta)+vcross_normalize[0]*vcross_normalize[2]*(1-math.cos(theta))
Rot[1][0] = vcross_normalize[2]*math.sin(theta)+vcross_normalize[0]*vcross_normalize[1]*(1-math.cos(theta))
Rot[1][1] = math.cos(theta)+(1-math.cos(theta))*(vcross_normalize[1]**2)
Rot[1][2] = -vcross_normalize[0] * math.sin(theta) + vcross_normalize[1] * vcross_normalize[2] * (
            1 - math.cos(theta))
Rot[2][0] = -vcross_normalize[1] * math.sin(theta) + vcross_normalize[0] * vcross_normalize[2] * (
        1 - math.cos(theta))
Rot[2][1] = vcross_normalize[0] * math.sin(theta) + vcross_normalize[1] * vcross_normalize[2] * (
        1 - math.cos(theta))
Rot[2][2] = math.cos(theta) + (1 - math.cos(theta)) * (vcross_normalize[2] ** 2)

R = np.matrix(Rot)  # 轉(zhuǎn)為矩陣方便后續(xù)運(yùn)算

這樣,就求出了旋轉(zhuǎn)矩陣R。?

4、驗(yàn)證

畢竟這里沒有推導(dǎo),拿過來就用,多少有點(diǎn)犯嘀咕,那就驗(yàn)證一下吧。

旋轉(zhuǎn)后的點(diǎn)=R*旋轉(zhuǎn)前的點(diǎn)

旋轉(zhuǎn)前的點(diǎn) =?*旋轉(zhuǎn)后的點(diǎn)

預(yù)期效果:

C++/Python:羅德里格斯旋轉(zhuǎn)矩陣

?假如在水平方向有一條線,所有點(diǎn)的y坐標(biāo)都相同,順時(shí)針旋轉(zhuǎn)45度后,所有點(diǎn)的y坐標(biāo)應(yīng)該是一個(gè)等差的,斜率為-1。(此時(shí)的兩個(gè)向量v1,v2分別?。?,1,0)和(1,1,0),剛好是45度)

測(cè)試結(jié)果:

C++/Python:羅德里格斯旋轉(zhuǎn)矩陣

import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist
import cv2
import math
import numpy as np

norm_wall = np.array([0, 1, 0],dtype=np.float32)
norm_pro = np.array([1,1,0],dtype=np.float32)

theta = math.acos(norm_wall.dot(norm_pro)/(np.linalg.norm(norm_wall)*np.linalg.norm(norm_pro)))
vcross = np.cross(norm_wall, norm_pro)
print(vcross)
vcross_normalize = 1 / np.linalg.norm(vcross) * vcross
print(vcross_normalize)
Rot = np.zeros((3, 3), dtype=np.float32)
Rot[0][0] = math.cos(theta)+(1-math.cos(theta))*(vcross_normalize[0]**2)
Rot[0][1] = vcross_normalize[0]*vcross_normalize[1]*(1-math.cos(theta))-vcross_normalize[2]*math.sin(theta)
Rot[0][2] = vcross_normalize[1]*math.sin(theta)+vcross_normalize[0]*vcross_normalize[2]*(1-math.cos(theta))
Rot[1][0] = vcross_normalize[2]*math.sin(theta)+vcross_normalize[0]*vcross_normalize[1]*(1-math.cos(theta))
Rot[1][1] = math.cos(theta)+(1-math.cos(theta))*(vcross_normalize[1]**2)
Rot[1][2] = -vcross_normalize[0] * math.sin(theta) + vcross_normalize[1] * vcross_normalize[2] * (
            1 - math.cos(theta))
Rot[2][0] = -vcross_normalize[1] * math.sin(theta) + vcross_normalize[0] * vcross_normalize[2] * (
        1 - math.cos(theta))
Rot[2][1] = vcross_normalize[0] * math.sin(theta) + vcross_normalize[1] * vcross_normalize[2] * (
        1 - math.cos(theta))
Rot[2][2] = math.cos(theta) + (1 - math.cos(theta)) * (vcross_normalize[2] ** 2)

R = np.matrix(Rot)

p_arr = []
for i in range(20):
    x = i-10
    y = 10
    p_arr.append([x,y,0])

p_out = []
for p in p_arr:
    tmp = R*np.matrix(p).T
    p_out.append(tmp)

################
fig = plt.figure(figsize=(80, 80))  # 創(chuàng)建畫布
#使用axisartist.Subplot方法創(chuàng)建一個(gè)繪圖區(qū)對(duì)象ax
ax = axisartist.Subplot(fig, 111)  # 111 代表1行1列的第1個(gè),subplot()可以用于繪制多個(gè)子圖
fig.add_axes(ax)  # 將繪圖區(qū)對(duì)象添加到畫布中
# ----------2. 繪制帶箭頭的x-y坐標(biāo)軸#通過set_visible方法設(shè)置繪圖區(qū)所有坐標(biāo)軸隱藏-------
ax.axis[:].set_visible(False)  # 隱藏了四周的方框
#ax.new_floating_axis代表添加新的坐標(biāo)軸
ax.axis["x"] = ax.new_floating_axis(0,0)
ax.axis["x"].set_axisline_style("->", size = 1.0)  # 給x坐標(biāo)軸加上箭頭
ax.axis["y"] = ax.new_floating_axis(1,0)  # 添加y坐標(biāo)軸,且加上箭頭
ax.axis["y"].set_axisline_style("-|>", size = 1.0)
#設(shè)置x、y軸上刻度顯示方向
ax.axis["x"].set_axis_direction("top")
ax.axis["y"].set_axis_direction("right")
##################

##畫原始點(diǎn)
p_arr = np.array(p_arr)
plt.plot(p_arr[:,0],p_arr[:,1],color='red')
''' 設(shè)置x軸的刻度:plt.xlim() '''
plt.xlim(-20,20)   # 設(shè)置x軸的刻度從-2到12
''' 設(shè)置y軸的刻度:plt.ylim() '''
plt.ylim(-2,20)    # 設(shè)置x軸的刻度從2到10
##畫旋轉(zhuǎn)后的點(diǎn)
p_out = np.array(p_out)
plt.plot(p_out[:,0],p_out[:,1],color='blue')
plt.show()

?5、驗(yàn)證2

上面是正向驗(yàn)證,在反向驗(yàn)證一下,給一些斜線上的點(diǎn)比如y=-0.5x+10,將其旋轉(zhuǎn)到水平(即y軸相等),可以設(shè)置V1=(0,1,0),V2=(0.5,1,0),計(jì)算的R旋轉(zhuǎn)矩陣還是從V1向V2旋轉(zhuǎn),此時(shí)想將旋轉(zhuǎn)后的點(diǎn)變換到旋轉(zhuǎn)前,需要使用R的逆(這里旋轉(zhuǎn)矩陣應(yīng)該是正交矩陣,轉(zhuǎn)置即為逆)

旋轉(zhuǎn)后的點(diǎn)=R*旋轉(zhuǎn)前的點(diǎn)

旋轉(zhuǎn)前的點(diǎn) =?*旋轉(zhuǎn)后的點(diǎn)

?預(yù)期效果:

C++/Python:羅德里格斯旋轉(zhuǎn)矩陣

測(cè)試結(jié)果:

C++/Python:羅德里格斯旋轉(zhuǎn)矩陣

p_out = []
for p in p_arr:
    tmp = R.I*np.matrix(p).T
    p_out.append(tmp)

最后貼一個(gè)根據(jù)兩個(gè)向量計(jì)算它們之間的旋轉(zhuǎn)矩陣 - 朔月の流光 - 博客園

C++/Python:羅德里格斯旋轉(zhuǎn)矩陣


2022年9月1日add

上面貼的鏈接圖有誤,加減號(hào)有問題。如下例子。

Mat get_rot_matrix()
{
    Point3d norm_wall = Point3d(0, 1, 0);
    Point3d norm_pro = Point3d(1, 0, 0);

    Point3d va = norm_wall / norm(norm_wall);
    Point3d vb = norm_pro / norm(norm_pro);

    Point3d vs = va.cross(vb);
    Point3d v = vs / norm(vs);
    double ca = vb.dot(va);
    Point3d vt = v * (1 - ca);
    Mat rot = Mat::zeros(3, 3, CV_64FC1);

    rot.at<double>(0, 0) = vt.x * v.x + ca;
    rot.at<double>(1, 1) = vt.y * v.y + ca;
    rot.at<double>(2, 2) = vt.z * v.z + ca;

    vt.x *= v.y;
    vt.z *= v.x;
    vt.y *= v.z;

    rot.at<double>(0, 1) = vt.x - vs.z;
    rot.at<double>(0, 2) = vt.z + vs.y;

    rot.at<double>(1, 0) = vt.x + vs.z;
    rot.at<double>(1, 2) = vt.y - vs.x;

    rot.at<double>(2, 0) = vt.z - vs.y;
    rot.at<double>(2, 1) = vt.y + vs.x;
    cout << rot << endl;
    return rot;
}

--end--文章來源地址http://www.zghlxwxcb.cn/news/detail-434699.html

到了這里,關(guān)于C++/Python:羅德里格斯旋轉(zhuǎn)矩陣的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 面試金典07(Python)—— 旋轉(zhuǎn)矩陣(中等)

    概述:給你一幅由 N × N 矩陣表示的圖像,其中每個(gè)像素的大小為 4 字節(jié)。請(qǐng)你設(shè)計(jì)一種算法,將圖像旋轉(zhuǎn) 90 度。不占用額外內(nèi)存空間能否做到? 思路:定義一個(gè) nm 的空矩陣,依次循環(huán)替代即可。最后需要注意把原矩陣替換成新矩陣。 思路:和上面思路一致,不同在于這里

    2024年02月16日
    瀏覽(9)
  • python transforms3d,不同旋轉(zhuǎn)方式與對(duì)應(yīng)的旋轉(zhuǎn)矩陣

    網(wǎng)上??吹降挠梅ǎ?這種調(diào)用默認(rèn)的是繞著物體上與基坐標(biāo)系平行的坐標(biāo)系旋轉(zhuǎn)的,順序是“x-y-z”,完整的寫法是: 這里第四個(gè)參數(shù)的可選項(xiàng)為: 個(gè)人理解,這里的“s”表示的是“static”,即繞靜坐標(biāo)系(基坐標(biāo)系)旋轉(zhuǎn);“r”表示“relative”,即相對(duì)坐標(biāo)系(物體的連

    2024年02月13日
    瀏覽(18)
  • 四元數(shù),旋轉(zhuǎn)矩陣,歐拉角互轉(zhuǎn)(python)

    運(yùn)行代碼之前需要安裝pyquaternion和scipy。 pip install?pyquaternion pip install?scipy 代碼之前放下面,main函數(shù)有使用的方式

    2024年02月12日
    瀏覽(24)
  • python 根據(jù)兩個(gè)向量,求的之間的旋轉(zhuǎn)矩陣:

    python 根據(jù)兩個(gè)向量,求的之間的旋轉(zhuǎn)矩陣:

    項(xiàng)目遇到一個(gè)問題,就是需要根據(jù) 原始向量 和 目標(biāo)向量 求他們兩個(gè)之間的 旋轉(zhuǎn)矩陣 ,網(wǎng)上結(jié)果很少,也有很多錯(cuò)誤,因此寫了一個(gè),項(xiàng)目中使用過程沒出現(xiàn)問題。 ? ? ? ? 原理參考的是知乎大佬的對(duì)???Rodrigues\\\' rotation formula??和?知乎?的總結(jié),主要如下:

    2024年02月13日
    瀏覽(18)
  • 將歐拉角轉(zhuǎn)換為旋轉(zhuǎn)矩陣(手眼標(biāo)定)python版本

    將歐拉角轉(zhuǎn)換為旋轉(zhuǎn)矩陣(手眼標(biāo)定)python版本

    1、歐拉角版 2、四元數(shù)版 3、旋轉(zhuǎn)矩陣版本 4、齊次矩陣

    2024年02月16日
    瀏覽(19)
  • 歐拉角,四元數(shù)和旋轉(zhuǎn)矩陣互轉(zhuǎn)代碼【python版】

    歐拉角,四元數(shù)和旋轉(zhuǎn)矩陣互轉(zhuǎn)代碼【python版】

    歐拉角以 Roll、Pitch、Yaw 的順序表示 四元數(shù)以[ q w q_w q w ? , q x q_x q x ? , q y q_y q y ? , q z q_z q z ? ]的順序表示 代碼包括了 歐拉角與四元數(shù)互轉(zhuǎn) , 旋轉(zhuǎn)矩陣與四元數(shù)互轉(zhuǎn) , 歐拉角與旋轉(zhuǎn)矩陣互轉(zhuǎn) ,輸入?yún)?shù)均為 np.array 形式 代碼內(nèi)置了角度制和弧度制???? 當(dāng)時(shí)因?yàn)檫@塊

    2023年04月22日
    瀏覽(24)
  • LeetCode in Python 48. Rotate Image/Matrix (旋轉(zhuǎn)圖像/矩陣)

    LeetCode in Python 48. Rotate Image/Matrix (旋轉(zhuǎn)圖像/矩陣)

    旋轉(zhuǎn)圖像/矩陣的重點(diǎn)是尋找旋轉(zhuǎn)前后對(duì)應(yīng)位置的坐標(biāo)關(guān)系。 示例: 圖1 旋轉(zhuǎn)圖像/矩陣的輸入輸出示意圖? 代碼:? 解釋: 1)外層循環(huán)控制需要轉(zhuǎn)的大圈圈數(shù),內(nèi)層循環(huán)控制每一圈需要轉(zhuǎn)的小圈圈數(shù),大小圈數(shù)的解釋見圖2,例如n=4,需要循環(huán)n // 2 = 2大圈,其中黃色循環(huán)箭頭

    2024年04月27日
    瀏覽(75)
  • Python:numpy.rot90() 三維矩陣?yán)@著某一軸旋轉(zhuǎn)

    ??在NumPy中,可以使用 numpy.rot90() 函數(shù)對(duì)三維矩陣?yán)@著某個(gè)軸旋轉(zhuǎn)。 numpy.rot90(m, k=1, axes=(0, 1)) . m: 輸入的數(shù)組。 k: 旋轉(zhuǎn)的次數(shù),默認(rèn)為1。 axes: 旋轉(zhuǎn)的軸,默認(rèn)為(0, 1)。旋轉(zhuǎn)方向:是從第一軸到第二軸 下面是一個(gè)具體的例子,演示如何在三維矩陣上繞著某個(gè)軸旋轉(zhuǎn): 這里的

    2024年01月22日
    瀏覽(14)
  • 《動(dòng)手學(xué)機(jī)器人學(xué)》7.2.4姿態(tài)之間的互相轉(zhuǎn)換,Python&&C++支持四元數(shù),歐拉角旋轉(zhuǎn)矩陣、軸角

    《動(dòng)手學(xué)機(jī)器人學(xué)》7.2.4姿態(tài)之間的互相轉(zhuǎn)換,Python&&C++支持四元數(shù),歐拉角旋轉(zhuǎn)矩陣、軸角

    本系列教程作者:小魚 公眾號(hào):魚香ROS QQ交流群:139707339 教學(xué)視頻地址:小魚的B站 完整文檔地址:魚香ROS官網(wǎng) 版權(quán)聲明:如非允許禁止轉(zhuǎn)載與商業(yè)用途。 上一節(jié)小魚帶你一起學(xué)習(xí)了四種姿態(tài)表示方式,這節(jié)課我們就利用相關(guān)的開源庫(kù),來完成姿態(tài)的不同表示方式之間的轉(zhuǎn)

    2024年02月02日
    瀏覽(44)
  • ROS系列——使用python的transforms3d、numpy庫(kù)實(shí)現(xiàn)四元數(shù)、旋轉(zhuǎn)矩陣、歐拉角、軸角等的相互轉(zhuǎn)換

    pip3 install transforms3d 四元數(shù)模塊在transforms3d.quaternions里,直接導(dǎo)入即可使用 2.1.1四元數(shù)轉(zhuǎn)旋轉(zhuǎn)矩陣 2.1.2 旋轉(zhuǎn)矩陣轉(zhuǎn)四元數(shù) 2.2.1 四元數(shù)轉(zhuǎn)軸角 2.2.2 軸角轉(zhuǎn)四元數(shù) 四元數(shù)模塊在transforms3d.euler里,直接導(dǎo)入即可使用 3.1.1 固定軸歐拉角轉(zhuǎn)四元數(shù) 3.1.2 四元數(shù)轉(zhuǎn)固定軸歐拉角 3.2.1 固定

    2024年02月07日
    瀏覽(41)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包