在side simulator.py中,我从控件中导入了PID.py,该控件根据PyCharm IDE是有效的
课程结构:
src
├── quantum_drone
│ ├── CMakeLists.txt
│ ├── Control
│ │ ├── __init__.py
│ │ ├── Keys.py
│ │ ├── MonotonicTime.py
│ │ └── PID.py
│ ├── package.xml
│ └── scripts
│ ├── __init__.py
│ └── simulator.py
我意识到我的根目录(quantum_-drone)中没有setup.py安装程序,因此我需要在何时设置它:
#!/usr/bin/env python
# noinspection PyUnresolvedReferences
from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup
# fetch values from package.xml
setup_args = generate_distutils_setup(
packages=['quantum_drone'],
scripts=['Control', 'scripts'],
package_dir={'': 'src'},
)
setup(**setup_args)
在我的CMakeLists.txt中,我取消了catkin_python_setup()的注释,在catkin_install_python中我写道:
catkin_install_python(PROGRAMS
scripts/simulator.py
Control/PID.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
最后,我跑了:
catkin_make
source devel/setup.bash
我试着跑:
rosrun quantum_drone simulator.py
但我一直得到这样的信息:
Traceback (most recent call last):
Traceback (most recent call last):
File "/home/kannachan/drone/src/quantum_drone/scripts/simulator.py", line 3, in <module>
from Control import PID
ImportError: No module named Control
我可以发誓我做了所有我需要做的事情,所以我不确定我错在哪里,以至于我无法导入我的文件/目录
PID.py的内容(我可以很好地导入MonotonicTime.py):
#!/usr/bin/env python
from pymavlink import mavutil
from MonotonicTime import monotonic_time
import numpy as np
current_time = monotonic_time
class PID:
def __init__(self, vehicle, kp=0, ki=0, kd=0, velocity=(0, 0, 0)):
self.kp = kp # Constants (kp, ki, kd)
self.ki = ki
self.kd = kd
self.drone = vehicle
self.p_terms = np.array([0, 0, 0], dtype=float) # 3-axis
self.i_terms = np.array([0, 0, 0], dtype=float)
self.d_terms = np.array([0, 0, 0], dtype=float)
self.velocity = np.asarray(velocity) # Desired Velocity
self.current_velocity = np.array(self.drone.velocity) # Current Velocity
self.errors = np.array([0, 0, 0], dtype=float) # Previous Error
self.time = current_time() # Current Time
self.__max__ = 40 # Max Speed
self.__min__ = 0 # Min Speed
def reset(self):
# Resetting terms
self.p_terms = np.array([0, 0, 0], dtype=float)
self.i_terms = np.array([0, 0, 0], dtype=float)
self.d_terms = np.array([0, 0, 0], dtype=float)
self.errors = np.array([0, 0, 0], dtype=float)
def calculate_change(self):
now = current_time()
delta_error = self.velocity - self.current_velocity # Change in error
delta_time = now - self.time if now - self.time else 1e-16 # Change in time
self.time = now
return delta_error, delta_time
def pid_calculation(self):
delta_error, delta_time = self.calculate_change()
# PID controller formula
self.p_terms = delta_error * self.kp
self.i_terms += self.errors * delta_time
self.d_terms = (delta_error - self.errors) / delta_time
self.errors = delta_error
outputs = self.kp * self.p_terms + self.ki * self.i_terms + self.kd * self.d_terms
outputs = np.where(outputs > self.__max__, self.__max__, outputs) # Replacing terms too big
outputs = np.where(outputs < self.__min__, self.__min__, outputs) # Replacing terms too small
return outputs
def send_command(self):
vx, vy, vz = self.pid_calculation()
msg = self.drone.message_factory.set_position_target_location_ned_encode(
0,
0, 0,
mavutil.mavlink.MAV_FRAME_BODY_NED,
0b0000111111000111,
0, 0, 0,
vx, vy, vz,
0, 0
)
self.drone.send_mavlink(msg)
self.drone.flush()
你的进口错了。它应该是从PID导入,而不是从控制导入。同样,在ROS1中,Python包不需要setup.py文件
相关问题 更多 >
编程相关推荐