Quadcopter_simulator icon indicating copy to clipboard operation
Quadcopter_simulator copied to clipboard

poor z control?

Open jrjbertram opened this issue 3 years ago • 0 comments

Hi there,

Just a quick note that if you give the controller a fixed goal and let it run for a while you get pretty good x-y control, but very poor z control. (See attached image.) I'm not sure why this doesn't show up in the GUI... maybe because the setpoint is updated periodically? I know the controller isn't the focus of the project, but just a heads up to anyone poking at it.

image

In case there's something about my usage of it that is generating this behavior, sample code I'm using (I removed the threads for this test and am playing with it in a notebook). Maybe my dt of 0.1 seconds is bad, for example.

Cell that sets up simulation:

# Set goals to go to
GOALS = [(1,1,2),(1,-1,4),(-1,-1,2),(-1,1,4)]
YAWS = [0,3.14,-1.54,1.54]
# Define the quadcopters
QUADCOPTER={'q1':{'position':[1,0,4],'orientation':[0,0,0],'L':0.3,'r':0.1,'prop_size':[10,4.5],'weight':1.2}}
# Controller parameters
CONTROLLER_PARAMETERS = {'Motor_limits':[4000,9000],
                    'Tilt_limits':[-10,10],
                    'Yaw_Control_Limits':[-900,900],
                    'Z_XY_offset':500,
                    'Linear_PID':{'P':[300,300,7000],'I':[0.04,0.04,4.5],'D':[450,450,5000]},
                    'Linear_To_Angular_Scaler':[1,1,0],
                    'Yaw_Rate_Scaler':0.18,
                    'Angular_PID':{'P':[22000,22000,1500],'I':[0,0,1.2],'D':[12000,12000,0]},
                    }

# Make objects for quadcopter, gui and controller
quad = Quadcopter(QUADCOPTER)
ctrl = Controller_PID_Point2Point(quad.get_state,quad.get_time,quad.set_motor_speeds,params=CONTROLLER_PARAMETERS,quad_identifier='q1')


goal,y = list( zip(GOALS,YAWS) )[0]

hist = [ quad.get_position('q1' ) ];

if True:
    ctrl.update_target(goal)
    ctrl.update_yaw_target(y)


    for i in range(10):
        ctrl.update()
        quad.update( dt=.1 )

        hist.append( quad.get_position('q1') )

Cell I run repeatedly that advances the sim 10 seconds at a time and generates the attached plot:

for tick in range(10):
    for i in range(10):
        ctrl.update()
        quad.update( dt=.1 )

        hist.append( quad.get_position('q1') )
        
import matplotlib.pyplot as plt

plt.figure( figsize=[10,10] )
ax = plt.axes(projection='3d')


ax.plot( *np.array( hist ).T )   

Cheers! J.

jrjbertram avatar Dec 09 '21 17:12 jrjbertram