I'm looking to be able to access the motor parameter values in a program that I am writing. In summary, I want to grab the x, y and z values of the gyroscope, and the 4 motor speeds and send them in real time to a web server for analysis. I've got the send to webserver part down and I am able to access the gryo values, but am having trouble with getting motor information.
Here's where I add the variables to my code...
Code: Select all
self._lg_stab = LogConfig(name="Stabilizer", period_in_ms=10)
self._lg_stab.add_variable("gyro.x", "float")
self._lg_stab.add_variable("gyro.y", "float")
self._lg_stab.add_variable("gyro.z", "float")
self._lg_stab.add_variable("motor.m1", "int32_t")
self._lg_stab.add_variable("motor.m2", "int32_t")
self._lg_stab.add_variable("motor.m3", "int32_t")
self._lg_stab.add_variable("motor.m4", "int32_t")
Code: Select all
{
"logconfig": {
"logblock":
{"name": "Stabilizer", "period":20,
"variables": [
{"name":"gyro.x", "type":"TOC", "stored_as":"float", "fetch_as":"float"},
{"name":"gyro.y", "type":"TOC", "stored_as":"float", "fetch_as":"float"},
{"name":"gyro.z", "type":"TOC", "stored_as":"float", "fetch_as":"float"},
{"name":"motor.m1", "type":"TOC", "stored_as":"float", "fetch_as":"int32_t"},
{"name":"motor.m2", "type":"TOC", "stored_as":"float", "fetch_as":"int32_t"},
{"name":"motor.m3", "type":"TOC", "stored_as":"float", "fetch_as":"int32_t"},
{"name":"motor.m4", "type":"TOC", "stored_as":"float", "fetch_as":"int32_t"},
]}
}
}
Any help would be greatly appreciated!
Full code for reference...
Code: Select all
# -*- coding: utf-8 -*-
#
# || ____ _ __
# +------+ / __ )(_) /_______________ _____ ___
# | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \
# +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/
# || || /_____/_/\__/\___/_/ \__,_/ /___/\___/
#
# Copyright (C) 2014 Bitcraze AB
#
# Crazyflie Nano Quadcopter Client
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
"""
Simple example that connects to the first Crazyflie found, logs the Stabilizer
and prints it to the console. After 10s the application disconnects and exits.
"""
import sys
sys.path.append("../lib")
import cflib.crtp
import logging
import time
from threading import Timer
import cflib.crtp
from cfclient.utils.logconfigreader import LogConfig
from cflib.crazyflie import Crazyflie
import requests
# Only output errors from the logging framework
logging.basicConfig(level=logging.ERROR)
class LoggingExample:
"""
Simple logging example class that logs the Stabilizer from a supplied
link uri and disconnects after 5s.
"""
def __init__(self, link_uri):
""" Initialize and run the example with the specified link_uri """
# Create a Crazyflie object without specifying any cache dirs
self._cf = Crazyflie()
# Connect some callbacks from the Crazyflie API
self._cf.connected.add_callback(self._connected)
self._cf.disconnected.add_callback(self._disconnected)
self._cf.connection_failed.add_callback(self._connection_failed)
self._cf.connection_lost.add_callback(self._connection_lost)
print "Connecting to %s" % link_uri
# Try to connect to the Crazyflie
self._cf.open_link(link_uri)
# Variable used to keep main loop occupied until disconnect
self.is_connected = True
def _connected(self, link_uri):
""" This callback is called form the Crazyflie API when a Crazyflie
has been connected and the TOCs have been downloaded."""
print "Connected to %s" % link_uri
# The definition of the logconfig can be made before connecting
self._lg_stab = LogConfig(name="Stabilizer", period_in_ms=10)
self._lg_stab.add_variable("gyro.x", "float")
self._lg_stab.add_variable("gyro.y", "float")
self._lg_stab.add_variable("gyro.z", "float")
self._lg_stab.add_variable("motor.m1", "int32_t")
self._lg_stab.add_variable("motor.m2", "int32_t")
self._lg_stab.add_variable("motor.m3", "int32_t")
self._lg_stab.add_variable("motor.m4", "int32_t")
# Adding the configuration cannot be done until a Crazyflie is
# connected, since we need to check that the variables we
# would like to log are in the TOC.
self._cf.log.add_config(self._lg_stab)
if self._lg_stab.valid:
# This callback will receive the data
self._lg_stab.data_received_cb.add_callback(self._stab_log_data)
# This callback will be called on errors
self._lg_stab.error_cb.add_callback(self._stab_log_error)
# Start the logging
self._lg_stab.start()
else:
print("Could not add logconfig since some variables are not in TOC")
# Start a timer to disconnect in 10s
t = Timer(5, self._cf.close_link)
t.start()
def _stab_log_error(self, logconf, msg):
"""Callback from the log API when an error occurs"""
print "Error when logging %s: %s" % (logconf.name, msg)
def _stab_log_data(self, timestamp, data, logconf):
"""Callback froma the log API when data arrives"""
#ThingWorx connection information
server = 'http://acadev1.cloud.thingworx.com/Thingworx/Things/'
thing = 'MicroQuad_Thing'
servicecall = '/Services/GetString?method=put&'
appKey = 'appKey=4456a419-5b4d-4c8c-98a7-d88a1804f7ee'
session = '&x-thingworx-session=true&'
parameters = 'Data=' + str(data)
print parameters
r = requests.get(server + thing + servicecall + appKey + session + parameters)
print r
def _connection_failed(self, link_uri, msg):
"""Callback when connection initial connection fails (i.e no Crazyflie
at the speficied address)"""
print "Connection to %s failed: %s" % (link_uri, msg)
self.is_connected = False
def _connection_lost(self, link_uri, msg):
"""Callback when disconnected after a connection has been made (i.e
Crazyflie moves out of range)"""
print "Connection to %s lost: %s" % (link_uri, msg)
def _disconnected(self, link_uri):
"""Callback when the Crazyflie is disconnected (called in all cases)"""
print "Disconnected from %s" % link_uri
self.is_connected = False
if __name__ == '__main__':
# Initialize the low-level drivers (don't list the debug drivers)
cflib.crtp.init_drivers(enable_debug_driver=False)
# Scan for Crazyflies and use the first one found
print "Scanning interfaces for Crazyflies..."
available = cflib.crtp.scan_interfaces()
print "Crazyflies found:"
for i in available:
print i[0]
if len(available) > 0:
le = LoggingExample(available[0][0])
else:
print "No Crazyflies found, cannot run example"
# The Crazyflie lib doesn't contain anything to keep the application alive,
# so this is where your application should do something. In our case we
# are just waiting until we are disconnected.
while le.is_connected:
time.sleep(1)