Вызов функции с помощью np.ndarray говорит: «TypeError: отсутствует 1 обязательный позиционный аргумент:» - PullRequest
1 голос
/ 07 июля 2019

Я пишу код для поворота матрицы (1x3) на Python 3.5.2.

Чтобы повернуть матрицу, я сделал функцию. (Не класс)

def rotate_rpy(posvec: Vector, rotvec: Vector) -> Vector :
  return np.dot(np.dot(np.dot (posvec, rotate_rpy(rotvec[0]) ), rotate_pitch(rotvec[1]) ), rotate_yaw(rotvec[2]))

newpose = rotate_rpy(mypose, rotateang)#enbug

появляется ошибка, подобная этой

Traceback (most recent call last): 
  File "rotation_matrix.py", line 50, in <module>
    newpose = rotate_rpy(mypose, rotateang)#enbug
  File "rotation_matrix.py", line 35, in rotate_rpy
    return np.dot(np.dot(np.dot (posvec, rotate_rpy(rotvec[0]) ), rotate_pitch(rotvec[1]) ), rotate_yaw(rotvec[2]))
TypeError: rotate_rpy() missing 1 required positional argument: 'rotvec'

возможно глупый вопрос, но я не понимаю, в чем проблема.

Большинство вопросов в Интернете что-то говорит об экземпляре, но это просто функция. не класс. В любом случае я просто попытался изменить аргумент:

newpose = rotate_rpy(mypose, mypose, rotateang)#enbug

тогда

TypeError: rotate_rpy() takes 2 positional arguments but 3 were given

и

newpose = rotate_rpy(mypose)#enbug

тогда

TypeError: rotate_rpy() missing 1 required positional argument: 'rotvec'

Я верю, что это глупо, но

newpose = rotate_rpy()#enbug

тогда

TypeError: rotate_rpy() missing 2 required positional arguments: 'posvec' and 'rotvec'

Я в замешательстве

3 аргумента - слишком много аргумента

2 аргумента - 1 аргумент пропущено

1 аргумент - 1 аргумент отсутствует

0 аргументов - 2 аргумента отсутствуют

Это не соответствует. Я понятия не имею. Пожалуйста, помогите мне ...

Полный код ниже:

#coding:utf-8

import numpy as np

def rotate_roll (th):
  _rot_vec_roll = {
    { 1.,          0. ,         0.},
    { 0.,   np.cos(th), np.sin(th)},
    { 0., - np.sin(th), np.cos(th)}
  }
  return _rot_vec_roll

def rotate_pitch (th):
  _rot_vec_pitch = {
    {  np.cos(th),0. , np.sin(th)},
    {  0.,        1.,          0.},
    {- np.sin(th),1.,  np.cos(th)}
  }
  return _rot_vec_pitch

def rotate_yaw (th):
  _rot_vec_yaw = {
    {   np.cos(th), np.sin(th), 0.},
    { - np.sin(th), np.cos(th), 0.},
    {           0.,         0., 1.}
  }
  return _rot_vec_yaw

# R2 = A * R1 
# A = roll_vec * pitch_vec * yaw_vec

Vector = np.ndarray(shape=(1,3), dtype=np.float)

def rotate_rpy(posvec: Vector, rotvec: Vector) -> Vector :
  return np.dot(np.dot(np.dot (posvec, rotate_rpy(rotvec[0]) ), rotate_pitch(rotvec[1]) ), rotate_yaw(rotvec[2]))

mypose = np.ndarray(shape=(1,3), dtype=np.float)
mypose = np.array([3.0,1.0,1.0], dtype=float)

print(mypose)

base = np.pi / 6.0

rotateang = np.ndarray(shape=(1,3), dtype=np.float)
rotateang = np.array([base, base/2.0, base], dtype=float)

print(rotateang)

newpose = np.ndarray(shape=(1,3), dtype=np.float)
newpose = rotate_rpy(mypose, rotateang)#enbug
print(newpose);

и полная ошибка ниже:

[ 3.  1.  1.]
[ 0.52359878  0.26179939  0.52359878]
Traceback (most recent call last):
  File "rotation_matrix.py", line 50, in <module>
    newpose = rotate_rpy(mypose, rotateang)#enbug
  File "rotation_matrix.py", line 35, in rotate_rpy
    return np.dot(np.dot(np.dot (posvec, rotate_rpy(rotvec[0]) ), rotate_pitch(rotvec[1]) ), rotate_yaw(rotvec[2]))
TypeError: rotate_rpy() missing 1 required positional argument: 'rotvec'

1 Ответ

1 голос
/ 07 июля 2019

Функция rotate_rpy определена для бесконечного рекурсивного вызова (что само по себе является проблемой):

def rotate_rpy(posvec, rotvec):
    return np.dot(np.dot(np.dot (posvec, rotate_rpy(rotvec[0]), ....)

Он также вызывает себя непоследовательно, только с одним параметром. Интерпретатор Python не может поймать первую ошибку, к счастью, сообщает о второй ошибке.

...