Я работаю над функцией обратной кинематики с поддержкой pytorch для трехкомпонентной системы, чтобы воспользоваться преимуществами встроенного метода Якобиана pytorch, и ниже я построил функцию с правильными матрицами вращения.
def forward_kinematics_torch(self, joint_parameters):
theta1, theta2, theta3 = joint_parameters
def dh_matrix_tensor(theta, d, a, alpha) -> torch.Tensor:
theta = torch.tensor(theta, requires_grad=True, dtype=torch.float32) if not isinstance(theta, torch.Tensor) else theta
d = torch.tensor(d, requires_grad=True, dtype=torch.float32) if not isinstance(d, torch.Tensor) else d # Cast d to float32
a = torch.tensor(a, requires_grad=True, dtype=torch.float32) if not isinstance(a, torch.Tensor) else a # Cast a to float32
alpha = torch.tensor(alpha, requires_grad=True, dtype=torch.float32) if not isinstance(alpha, torch.Tensor) else alpha # Cast alpha to float32
return torch.tensor([
[torch.cos(theta), -torch.sin(theta) * torch.cos(alpha), torch.sin(theta) * torch.sin(alpha), a * torch.cos(theta)],
[torch.sin(theta), torch.cos(theta) * torch.cos(alpha), -torch.cos(theta) * torch.sin(alpha), a * torch.sin(theta)],
[0, torch.sin(alpha), torch.cos(alpha), d],
[0, 0, 0, 1]], dtype=torch.float32, requires_grad=True) # Specify dtype for the tensor
T1 = dh_matrix_tensor(theta1, 0, self.a1, -1*np.pi/2)
T2 = dh_matrix_tensor(theta2, 0, self.a2, 0)
T3 = dh_matrix_tensor(theta3, 0, self.a3, 0)
T = T1.matmul(T2.matmul(T3))
end_effector_pos = T[:3, 3]
return end_effector_pos
Однако, когда я беру якобиан этой матрицы, используя J = torch.autograd.functional.jacobian(self.forward_kinematics_torch, torch.tensor([theta1,theta2,theta3], require_grad= True), create_graph=True), когда тета равна всем нулям, я получаю тензорную матрицу 3x3, состоящую из всех нулей.
Я знаю, что мои матрицы вращения верны, потому что моя версия функции, не использующая pytorch, работает правильно, поэтому готов поспорить, что это какие-то технические особенности с pytorch, о которых я не знаю, поэтому надеялся, что кто-нибудь сможет помочь мне с ошибка. Спасибо!
Я работаю над функцией обратной кинематики с поддержкой pytorch для трехкомпонентной системы, чтобы воспользоваться преимуществами встроенного метода Якобиана pytorch, и ниже я построил функцию с правильными матрицами вращения. [code]def forward_kinematics_torch(self, joint_parameters): theta1, theta2, theta3 = joint_parameters
def dh_matrix_tensor(theta, d, a, alpha) -> torch.Tensor: theta = torch.tensor(theta, requires_grad=True, dtype=torch.float32) if not isinstance(theta, torch.Tensor) else theta d = torch.tensor(d, requires_grad=True, dtype=torch.float32) if not isinstance(d, torch.Tensor) else d # Cast d to float32 a = torch.tensor(a, requires_grad=True, dtype=torch.float32) if not isinstance(a, torch.Tensor) else a # Cast a to float32 alpha = torch.tensor(alpha, requires_grad=True, dtype=torch.float32) if not isinstance(alpha, torch.Tensor) else alpha # Cast alpha to float32
return torch.tensor([ [torch.cos(theta), -torch.sin(theta) * torch.cos(alpha), torch.sin(theta) * torch.sin(alpha), a * torch.cos(theta)], [torch.sin(theta), torch.cos(theta) * torch.cos(alpha), -torch.cos(theta) * torch.sin(alpha), a * torch.sin(theta)], [0, torch.sin(alpha), torch.cos(alpha), d], [0, 0, 0, 1]], dtype=torch.float32, requires_grad=True) # Specify dtype for the tensor
T = T1.matmul(T2.matmul(T3)) end_effector_pos = T[:3, 3] return end_effector_pos [/code] Однако, когда я беру якобиан этой матрицы, используя J = torch.autograd.functional.jacobian(self.forward_kinematics_torch, torch.tensor([theta1,theta2,theta3], require_grad= True), create_graph=True), когда тета равна всем нулям, я получаю тензорную матрицу 3x3, состоящую из всех нулей. Я знаю, что мои матрицы вращения верны, потому что моя версия функции, не использующая pytorch, работает правильно, поэтому готов поспорить, что это какие-то технические особенности с pytorch, о которых я не знаю, поэтому надеялся, что кто-нибудь сможет помочь мне с ошибка. Спасибо!
В настоящее время я использую TORCH.Autograd.function.function.function.jacobian для вычисления для каждого образца, elementwise градиенты скалярного выхода модели W.R.T. его входные данные. Мне нужно сохранить create_graph = true , потому что я...
В настоящее время я использую TORCH.Autograd.function.function.function.jacobian для вычисления для каждого образца, elementwise градиенты скалярного выхода модели W.R.T. его входные данные. Мне нужно сохранить create_graph = true , потому что я...
Я работаю над задачей потока в полости, управляемой крышкой, используя дискретные версии уравнений Навье-Стокса для завихренности:
Уравнения Навье-Стокса в дискретной форме завихренности
По какой-то причине моя функция потока работает (по крайней...
Я работаю над задачей потока в полости, управляемой крышкой, используя дискретные версии уравнений Навье-Стокса для завихренности:
Уравнения Навье-Стокса в дискретной форме завихренности
По какой-то причине моя функция потока работает (по крайней...
Я работаю над задачей потока в полости, управляемой крышкой, используя дискретные версии уравнений Навье-Стокса для завихренности:
Уравнения Навье-Стокса в дискретной форме завихренности
По какой-то причине моя функция потока работает (по крайней...