Why error: "must be real number, not RestMode"? How can fix it?

Why error: "must be real number, not RestMode"? How can fix it?

我正在使用 ROS,并编写了一些代码来完成一些任务,现在我遇到了一个错误:TypeError: must be real number, not RestMode,有关更多详细信息,我在这里有代码:

#!/usr/bin/env python
#encoding: utf-8

import rospy
from geometry_msgs.msg import Vector3
from sensor_msgs.msg import Imu
from std_msgs.msg import Float64
import numpy as np
import geometry as geo
import transformation as tf
from IK_solver import IK

class RestMode:
    def __init__(self, bodyDimensions, legDimensions):
#        rospy.Subscriber('spot_keyboard/body_pose',Vector3,self.callback)
        self.bodyLength = bodyDimensions[0]
        self.bodyWidth  = bodyDimensions[1]
        self.bodyHeight = bodyDimensions[2]

        self.l1 = legDimensions[0]
        self.l2 = legDimensions[1]
        self.l3 = legDimensions[2]

#        rospy.Subscriber('spot_imu/base_link_orientation',Imu, self.get_body_pose)
        self.rate = rospy.Rate(10.0) #10Hz
        self.rb = IK(bodyDimensions, legDimensions)

        angles_cmd = [ 'spot_controller/FL1_joint/command',
                       'spot_controller/FL2_joint/command',
                       'spot_controller/FL3_joint/command',
                       'spot_controller/RL1_joint/command',
                       'spot_controller/RL2_joint/command',
                       'spot_controller/RL3_joint/command',
                       'spot_controller/RR1_joint/command',
                       'spot_controller/RR2_joint/command',
                       'spot_controller/RR3_joint/command',
                       'spot_controller/FL1_joint/command',
                       'spot_controller/FL2_joint/command',
                       'spot_controller/FL3_joint/command' ]
        self.joint = []
        for i in range(12):
            self.joint.append(rospy.Publisher(angles_cmd[i], Float64, queue_size=10))

#        self.initial_pose()

    def initial_pose(self,roll=0,pitch=0,yaw=0,dx=0,dy=0,dz=None):
        if dz == None:
            dz = self.bodyHeight

        order = ['FL','RL','RR','FR']
        angles = []

        rospy.loginfo("Start Calculate Angles!")
        for leg in order:
            (q1,q2,q3,ht) = self.rb.calculateAngles(self,roll,pitch,yaw,dx,dy,dz,leg)
            angles.append(q1)
            angles.append(q2)
            angles.append(q3)

        rospy.loginfo("Done! Start publish!")
        for i in range(12):
            self.joint[i].publish(angles[i])

        self.rate.sleep()

if __name__ == '__main__':
    rospy.init_node('rest_mode', anonymous=True)
    body = [0.1908, 0.080, 0.15]
    legs = [0.04, 0.1, 0.094333]
    rest = RestMode(body, legs)
    try:
        while not rospy.is_shutdown():
            rest.initial_pose()

    except rospy.ROSInterruptException:
        pass

当方法 calculateAngles(self,roll,pitch,yaw,dx,dy,dz,leg) 最后带有参数 leg 时,它抛出:TypeError: must be real number, not RestMode.

但是当我首先将其更改为:calculateAngles(self,leg,roll,pitch,yaw,dx,dy,dz),然后错误提示:TypeError: must be real number, not str 在另一个模块中输入,但我测试了所有其他相关模块,它们都很好,所以我认为这一定是上面代码中的问题!

那个错误太奇怪了:

  1. 我不推送任何 str 作为输入
  2. 当改变参数 leg 的位置时,会抛出不同的错误。

调用实例方法时,self 是一个隐含参数,永远不应显式传递。当您使用 self.rb.calculateAngles(self, ... 时,第二个 selfRestMode class 的实例,您的 IK class 不接受它。 .

因此,你想要

(q1,q2,q3,ht) = self.rb.calculateAngles(roll,pitch,yaw,dx,dy,dz,leg)

并更改 IK class 中的其他用法