Hello,
In the questions I have asked in the previous post I made I received help in trying to log and fly at the same time. This works great!
I was able to make many drones fly at the same time and log their data.
But the next thing I was trying to do is to set up the code from:
https://www.bitcraze.io/documentation/r ... commander/
in a class.
But when I put everything in:
if __name__ == '__main__':
in a class __init__() part of a class
and all the function declarations as part of the class
I kept running into the issue that since those function are passed and not directly declared I could not get it to work.
I would have to add self. in front of the param_deck_flow for example
scf.cf.param.add_update_callback(group='deck', name='bcFlow2',
cb=self.param_deck_flow)
but that leads me to get the issue that the program says I need to pass the argument of the function
Would anyone know how to work around this?
Does my question make sense?
log and fly class
-
- Beginner
- Posts: 18
- Joined: Fri Jul 31, 2020 1:45 am
Re: log and fly class
or even more simply:
the only way I was able to get the class to work was with this:
import logging
import time
import threading
from threading import Thread
from threading import Timer
import cflib.crtp # noqa
from cflib.crazyflie import Crazyflie
from cflib.crazyflie.log import LogConfig
import matplotlib.pyplot as plt
import numpy as np
from cflib.crazyflie.syncCrazyflie import SyncCrazyflie
from cflib.positioning.motion_commander import MotionCommander
# Only output errors from the logging framework
#is_deck_attached = False
def param_deck_flow(name, value):
global is_deck_attached
print(value)
if value:
is_deck_attached = True
print('Deck is attached!')
else:
is_deck_attached = False
print('Deck is NOT attached!')
def log_pos_callback(timestamp, data, logconf):
print(data)
def take_off_simple(scf):
with MotionCommander(scf) as mc:
mc.start_linear_motion(0, 0, .1)
#time.sleep(2)
time.sleep(3)
def move_linear_simple(scf):
with MotionCommander(scf, default_height=DEFAULT_HEIGHT) as mc:
time.sleep(1)
mc.forward(0.5)
time.sleep(1)
mc.back(0.5)
time.sleep(1)
class flight():
def __init__(self,log_pos_callback,take_off_simple,move_linear_simple):
self.is_deck_attached = False
URI = 'radio://0/75/2M/E7E7E7E702'
logging.basicConfig(level=logging.ERROR)
cflib.crtp.init_drivers(enable_debug_driver=False)
with SyncCrazyflie(URI, cf=Crazyflie(rw_cache='./cache')) as scf:
scf.cf.param.add_update_callback(group='deck', name='bcFlow2',
cb=param_deck_flow)
time.sleep(1)
logconf = LogConfig(name='Position', period_in_ms=10)
logconf.add_variable('stateEstimate.x', 'float')
logconf.add_variable('stateEstimate.y', 'float')
cf = scf.cf
cf.log.add_config(logconf)
logconf.data_received_cb.add_callback(log_pos_callback)
if self.is_deck_attached:
logconf.start()
take_off_simple(scf)
logconf.stop()
'''def param_deck_flow(name, value):
self.is_deck_attached
print(value)
if value:
self.is_deck_attached = True
print('Deck is attached!')
else:
self.is_deck_attached = False
print('Deck is NOT attached!')'''
#def takeoff():
x = flight(log_pos_callback,take_off_simple,move_linear_simple)
##########################
but the issue is the functions I don't know how to write them inside the class because if I just straight put them in they don't work
but if I pass them through like above (which works) I cannot access the class variables like is_deck_attached from the functions
the only way I was able to get the class to work was with this:
import logging
import time
import threading
from threading import Thread
from threading import Timer
import cflib.crtp # noqa
from cflib.crazyflie import Crazyflie
from cflib.crazyflie.log import LogConfig
import matplotlib.pyplot as plt
import numpy as np
from cflib.crazyflie.syncCrazyflie import SyncCrazyflie
from cflib.positioning.motion_commander import MotionCommander
# Only output errors from the logging framework
#is_deck_attached = False
def param_deck_flow(name, value):
global is_deck_attached
print(value)
if value:
is_deck_attached = True
print('Deck is attached!')
else:
is_deck_attached = False
print('Deck is NOT attached!')
def log_pos_callback(timestamp, data, logconf):
print(data)
def take_off_simple(scf):
with MotionCommander(scf) as mc:
mc.start_linear_motion(0, 0, .1)
#time.sleep(2)
time.sleep(3)
def move_linear_simple(scf):
with MotionCommander(scf, default_height=DEFAULT_HEIGHT) as mc:
time.sleep(1)
mc.forward(0.5)
time.sleep(1)
mc.back(0.5)
time.sleep(1)
class flight():
def __init__(self,log_pos_callback,take_off_simple,move_linear_simple):
self.is_deck_attached = False
URI = 'radio://0/75/2M/E7E7E7E702'
logging.basicConfig(level=logging.ERROR)
cflib.crtp.init_drivers(enable_debug_driver=False)
with SyncCrazyflie(URI, cf=Crazyflie(rw_cache='./cache')) as scf:
scf.cf.param.add_update_callback(group='deck', name='bcFlow2',
cb=param_deck_flow)
time.sleep(1)
logconf = LogConfig(name='Position', period_in_ms=10)
logconf.add_variable('stateEstimate.x', 'float')
logconf.add_variable('stateEstimate.y', 'float')
cf = scf.cf
cf.log.add_config(logconf)
logconf.data_received_cb.add_callback(log_pos_callback)
if self.is_deck_attached:
logconf.start()
take_off_simple(scf)
logconf.stop()
'''def param_deck_flow(name, value):
self.is_deck_attached
print(value)
if value:
self.is_deck_attached = True
print('Deck is attached!')
else:
self.is_deck_attached = False
print('Deck is NOT attached!')'''
#def takeoff():
x = flight(log_pos_callback,take_off_simple,move_linear_simple)
##########################
but the issue is the functions I don't know how to write them inside the class because if I just straight put them in they don't work
but if I pass them through like above (which works) I cannot access the class variables like is_deck_attached from the functions
-
- Beginner
- Posts: 18
- Joined: Fri Jul 31, 2020 1:45 am
Re: log and fly class
Hey,
I just figured it out.
please disregard those messages.
I just figured it out.
please disregard those messages.
Re: log and fly class
Great! Could you specify a bit what solved it to make this forum thread more whole ?