aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Gubler <thomasgubler@gmail.com>2015-01-09 08:07:00 +0100
committerThomas Gubler <thomasgubler@gmail.com>2015-01-09 08:07:00 +0100
commitb2366aaa22d8a7f4df1fce43926e42ced84c1853 (patch)
tree29d8e114fcefaa69613724fc2d8277ca5801d498
parent12ae4fe86996fb97f021f50efa1089bd485a2eec (diff)
parentab1d2184542da8f775ac52b44e2103d9cfd1609b (diff)
downloadpx4-firmware-b2366aaa22d8a7f4df1fce43926e42ced84c1853.tar.gz
px4-firmware-b2366aaa22d8a7f4df1fce43926e42ced84c1853.tar.bz2
px4-firmware-b2366aaa22d8a7f4df1fce43926e42ced84c1853.zip
Merge remote-tracking branch 'upstream/master' into ros
m---------NuttX0
-rw-r--r--ROMFS/px4fmu_common/init.d/10019_sk450_deadcat31
-rw-r--r--ROMFS/px4fmu_common/init.d/rc.autostart5
-rw-r--r--ROMFS/px4fmu_common/init.d/rcS4
-rw-r--r--ROMFS/px4fmu_common/mixers/sk450_deadcat.main.mix25
-rwxr-xr-xTools/px_uploader.py75
-rw-r--r--makefiles/config_px4fmu-v2_default.mk6
-rw-r--r--nuttx-configs/px4fmu-v2/nsh/defconfig2
-rw-r--r--src/modules/systemlib/mixer/mixer.h3
-rw-r--r--src/modules/systemlib/mixer/mixer_multirotor.cpp9
-rwxr-xr-xsrc/modules/systemlib/mixer/multi_tables.py21
11 files changed, 149 insertions, 32 deletions
diff --git a/NuttX b/NuttX
-Subproject 255dc96065ce1fdd7f0f56ca5afb6b6112abfc7
+Subproject dbcccb2455d759b789d549d25e1fbf489b2d3c8
diff --git a/ROMFS/px4fmu_common/init.d/10019_sk450_deadcat b/ROMFS/px4fmu_common/init.d/10019_sk450_deadcat
new file mode 100644
index 000000000..e68f57f25
--- /dev/null
+++ b/ROMFS/px4fmu_common/init.d/10019_sk450_deadcat
@@ -0,0 +1,31 @@
+#!nsh
+#
+# HobbyKing SK450 DeadCat modification
+#
+# Anton Matosov <anton.matosov@gmail.com>
+#
+
+sh /etc/init.d/rc.mc_defaults
+
+if [ $AUTOCNF == yes ]
+then
+ param set MC_ROLL_P 6.0
+ param set MC_ROLLRATE_P 0.04
+ param set MC_ROLLRATE_I 0.1
+ param set MC_ROLLRATE_D 0.0015
+
+ param set MC_PITCH_P 6.0
+ param set MC_PITCHRATE_P 0.08
+ param set MC_PITCHRATE_I 0.2
+ param set MC_PITCHRATE_D 0.0015
+
+ param set MC_YAW_P 2.8
+ param set MC_YAWRATE_P 0.1
+ param set MC_YAWRATE_I 0.07
+ param set MC_YAWRATE_D 0.0
+fi
+
+set MIXER sk450_deadcat
+
+set PWM_OUT 1234
+set PWM_MIN 1050
diff --git a/ROMFS/px4fmu_common/init.d/rc.autostart b/ROMFS/px4fmu_common/init.d/rc.autostart
index 20f2be0d9..b83687fbd 100644
--- a/ROMFS/px4fmu_common/init.d/rc.autostart
+++ b/ROMFS/px4fmu_common/init.d/rc.autostart
@@ -226,6 +226,11 @@ then
sh /etc/init.d/10018_tbs_endurance
fi
+if param compare SYS_AUTOSTART 10019
+then
+ sh /etc/init.d/10019_sk450_deadcat
+fi
+
#
# Hexa Coaxial
#
diff --git a/ROMFS/px4fmu_common/init.d/rcS b/ROMFS/px4fmu_common/init.d/rcS
index 84c7e096d..36a512441 100644
--- a/ROMFS/px4fmu_common/init.d/rcS
+++ b/ROMFS/px4fmu_common/init.d/rcS
@@ -164,6 +164,7 @@ then
else
sh /etc/init.d/rc.autostart
fi
+ unset MODE
#
# Override parameters from user configuration file
@@ -185,6 +186,7 @@ then
param set SYS_AUTOCONFIG 0
param save
fi
+ unset AUTOCNF
set IO_PRESENT no
@@ -524,7 +526,7 @@ then
then
set MAV_TYPE 2
fi
- if [ $MIXER == quad_w ]
+ if [ $MIXER == quad_w -o $MIXER == sk450_deadcat ]
then
set MAV_TYPE 2
fi
diff --git a/ROMFS/px4fmu_common/mixers/sk450_deadcat.main.mix b/ROMFS/px4fmu_common/mixers/sk450_deadcat.main.mix
new file mode 100644
index 000000000..a8c5b716d
--- /dev/null
+++ b/ROMFS/px4fmu_common/mixers/sk450_deadcat.main.mix
@@ -0,0 +1,25 @@
+Multirotor mixer for PX4FMU
+===========================
+
+This file defines a single mixer for a quadrotor in SK450 DeadCat configuration. All controls are mixed 100%.
+
+R: 4dc 10000 10000 10000 0
+
+Gimbal / payload mixer for last four channels
+-----------------------------------------------------
+
+M: 1
+O: 10000 10000 0 -10000 10000
+S: 0 4 10000 10000 0 -10000 10000
+
+M: 1
+O: 10000 10000 0 -10000 10000
+S: 0 5 10000 10000 0 -10000 10000
+
+M: 1
+O: 10000 10000 0 -10000 10000
+S: 0 6 10000 10000 0 -10000 10000
+
+M: 1
+O: 10000 10000 0 -10000 10000
+S: 0 7 10000 10000 0 -10000 10000
diff --git a/Tools/px_uploader.py b/Tools/px_uploader.py
index 3a4540ac0..272080619 100755
--- a/Tools/px_uploader.py
+++ b/Tools/px_uploader.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
############################################################################
#
-# Copyright (C) 2012, 2013 PX4 Development Team. All rights reserved.
+# Copyright (C) 2012-2015 PX4 Development Team. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -227,16 +227,21 @@ class uploader(object):
+ uploader.EOC)
self.__getSync()
-# def __trySync(self):
-# c = self.__recv()
-# if (c != self.INSYNC):
-# #print("unexpected 0x%x instead of INSYNC" % ord(c))
-# return False;
-# c = self.__recv()
-# if (c != self.OK):
-# #print("unexpected 0x%x instead of OK" % ord(c))
-# return False
-# return True
+ def __trySync(self):
+ try:
+ self.port.flush()
+ if (self.__recv() != self.INSYNC):
+ #print("unexpected 0x%x instead of INSYNC" % ord(c))
+ return False;
+
+ if (self.__recv() != self.OK):
+ #print("unexpected 0x%x instead of OK" % ord(c))
+ return False
+ return True
+
+ except RuntimeError:
+ #timeout, no response yet
+ return False
# send the GET_DEVICE command and wait for an info parameter
def __getInfo(self, param):
@@ -261,19 +266,37 @@ class uploader(object):
self.__getSync()
return value
+ def __drawProgressBar(self, progress, maxVal):
+ if maxVal < progress:
+ progress = maxVal
+
+ percent = (float(progress) / float(maxVal)) * 100.0
+
+ sys.stdout.write("\rprogress:[%-20s] %.2f%%" % ('='*int(percent/5.0), percent))
+ sys.stdout.flush()
+
+
# send the CHIP_ERASE command and wait for the bootloader to become ready
def __erase(self):
self.__send(uploader.CHIP_ERASE
+ uploader.EOC)
+
# erase is very slow, give it 20s
- deadline = time.time() + 20
+ deadline = time.time() + 20.0
while time.time() < deadline:
- try:
- self.__getSync()
- return
- except RuntimeError:
- # we timed out, that's OK
- continue
+
+ #Draw progress bar (erase usually takes about 9 seconds to complete)
+ estimatedTimeRemaining = deadline-time.time()
+ if estimatedTimeRemaining > 0:
+ self.__drawProgressBar(20.0-estimatedTimeRemaining, 9.0)
+ else:
+ self.__drawProgressBar(10.0, 10.0)
+ sys.stdout.write(" (timeout: %d seconds) " % int(time.time()-deadline) )
+
+ if self.__trySync():
+ self.__drawProgressBar(10.0, 10.0)
+ sys.stdout.write("\nerase complete!\n")
+ return;
raise RuntimeError("timed out waiting for erase")
@@ -329,9 +352,18 @@ class uploader(object):
def __program(self, fw):
code = fw.image
groups = self.__split_len(code, uploader.PROG_MULTI_MAX)
+
+ uploadProgress = 0
for bytes in groups:
self.__program_multi(bytes)
+ #Print upload progress (throttled, so it does not delay upload progress)
+ uploadProgress += 1
+ if uploadProgress % 256 == 0:
+ self.__drawProgressBar(uploadProgress, len(groups))
+ self.__drawProgressBar(100, 100)
+ print("\nprogram complete!")
+
# verify code
def __verify_v2(self, fw):
self.__send(uploader.CHIP_VERIFY
@@ -434,8 +466,7 @@ class uploader(object):
self.__send(uploader.MAVLINK_REBOOT_ID0)
except:
return
-
-
+
# Detect python version
if sys.version_info[0] < 3:
@@ -511,8 +542,10 @@ while True:
print("attempting reboot on %s..." % port)
print("if the board does not respond, unplug and re-plug the USB connector.")
up.send_reboot()
+
# wait for the reboot, without we might run into Serial I/O Error 5
time.sleep(0.5)
+
# always close the port
up.close()
continue
@@ -524,7 +557,7 @@ while True:
except RuntimeError as ex:
# print the error
- print("ERROR: %s" % ex.args)
+ print("\nERROR: %s" % ex.args)
finally:
# always close the port
diff --git a/makefiles/config_px4fmu-v2_default.mk b/makefiles/config_px4fmu-v2_default.mk
index 09106c090..a5f996bb3 100644
--- a/makefiles/config_px4fmu-v2_default.mk
+++ b/makefiles/config_px4fmu-v2_default.mk
@@ -32,9 +32,9 @@ MODULES += drivers/ll40ls
# MODULES += drivers/trone
MODULES += drivers/gps
MODULES += drivers/hil
-MODULES += drivers/hott
-MODULES += drivers/hott/hott_telemetry
-MODULES += drivers/hott/hott_sensors
+# MODULES += drivers/hott
+# MODULES += drivers/hott/hott_telemetry
+# MODULES += drivers/hott/hott_sensors
# MODULES += drivers/blinkm
MODULES += drivers/airspeed
MODULES += drivers/ets_airspeed
diff --git a/nuttx-configs/px4fmu-v2/nsh/defconfig b/nuttx-configs/px4fmu-v2/nsh/defconfig
index f9ab949e1..ac3dbe5da 100644
--- a/nuttx-configs/px4fmu-v2/nsh/defconfig
+++ b/nuttx-configs/px4fmu-v2/nsh/defconfig
@@ -389,7 +389,7 @@ CONFIG_ARCH_BOARD=""
#
CONFIG_NSH_MMCSDMINOR=0
CONFIG_NSH_MMCSDSLOTNO=0
-
+CONFIG_MMCSD_HAVE_SDIOWAIT_WRCOMPLETE=y
#
# Board-Specific Options
#
diff --git a/src/modules/systemlib/mixer/mixer.h b/src/modules/systemlib/mixer/mixer.h
index 864ce21a5..67ef521b4 100644
--- a/src/modules/systemlib/mixer/mixer.h
+++ b/src/modules/systemlib/mixer/mixer.h
@@ -441,7 +441,6 @@ private:
SimpleMixer operator=(const SimpleMixer&);
};
-
/**
* Supported multirotor geometries.
*
@@ -460,12 +459,14 @@ class __EXPORT MultirotorMixer : public Mixer
{
public:
/**
+
* Precalculated rotor mix.
*/
struct Rotor {
float roll_scale; /**< scales roll for this rotor */
float pitch_scale; /**< scales pitch for this rotor */
float yaw_scale; /**< scales yaw for this rotor */
+ float out_scale; /**< scales total out for this rotor */
};
/**
diff --git a/src/modules/systemlib/mixer/mixer_multirotor.cpp b/src/modules/systemlib/mixer/mixer_multirotor.cpp
index 5cfbe47f0..2ab5b5e8e 100644
--- a/src/modules/systemlib/mixer/mixer_multirotor.cpp
+++ b/src/modules/systemlib/mixer/mixer_multirotor.cpp
@@ -75,7 +75,8 @@ float constrain(float val, float min, float max)
{
return (val < min) ? min : ((val > max) ? max : val);
}
-}
+
+} // anonymous namespace
MultirotorMixer::MultirotorMixer(ControlCallback control_cb,
uintptr_t cb_handle,
@@ -89,6 +90,7 @@ MultirotorMixer::MultirotorMixer(ControlCallback control_cb,
_pitch_scale(pitch_scale),
_yaw_scale(yaw_scale),
_idle_speed(-1.0f + idle_speed * 2.0f), /* shift to output range here to avoid runtime calculation */
+ _limits_pub(),
_rotor_count(_config_rotor_count[(MultirotorGeometryUnderlyingType)geometry]),
_rotors(_config_index[(MultirotorGeometryUnderlyingType)geometry])
{
@@ -152,6 +154,9 @@ MultirotorMixer::from_text(Mixer::ControlCallback control_cb, uintptr_t cb_handl
} else if (!strcmp(geomname, "4w")) {
geometry = MultirotorGeometry::QUAD_WIDE;
+ } else if (!strcmp(geomname, "4dc")) {
+ geometry = MultirotorGeometry::QUAD_DEADCAT;
+
} else if (!strcmp(geomname, "6+")) {
geometry = MultirotorGeometry::HEX_PLUS;
@@ -212,6 +217,8 @@ MultirotorMixer::mix(float *outputs, unsigned space)
pitch * _rotors[i].pitch_scale +
thrust;
+ out *= _rotors[i].out_scale;
+
/* limit yaw if it causes outputs clipping */
if (out >= 0.0f && out < -yaw * _rotors[i].yaw_scale) {
yaw = -out / _rotors[i].yaw_scale;
diff --git a/src/modules/systemlib/mixer/multi_tables.py b/src/modules/systemlib/mixer/multi_tables.py
index 21c0affd9..ba59e0536 100755
--- a/src/modules/systemlib/mixer/multi_tables.py
+++ b/src/modules/systemlib/mixer/multi_tables.py
@@ -69,6 +69,13 @@ quad_plus = [
[ 180, CW],
]
+quad_deadcat = [
+ [ 63, CCW, 1.0],
+ [-135, CCW, 0.964],
+ [ -63, CW, 1.0],
+ [ 135, CW, 0.964],
+]
+
quad_v = [
[ 18.8, 0.4242],
[ -18.8, 1.0],
@@ -148,13 +155,18 @@ twin_engine = [
[-90, 0.0],
]
+
+tables = [quad_x, quad_plus, quad_v, quad_wide, quad_deadcat, hex_x, hex_plus, hex_cox, octa_x, octa_plus, octa_cox, twin_engine]
+
def variableName(variable):
for variableName, value in list(globals().items()):
if value is variable:
return variableName
-tables = [quad_x, quad_plus, quad_v, quad_wide, hex_x, hex_plus, hex_cox, octa_x, octa_plus, octa_cox, twin_engine]
-
+def unpackScales(scalesList):
+ if len(scalesList) == 2:
+ scalesList += [1.0] #Add thrust scale
+ return scalesList
def printEnum():
print("enum class MultirotorGeometry : MultirotorGeometryUnderlyingType {")
@@ -167,10 +179,11 @@ def printEnum():
def printScaleTables():
for table in tables:
print("const MultirotorMixer::Rotor _config_{}[] = {{".format(variableName(table)))
- for (angle, yawScale) in table:
+ for row in table:
+ angle, yawScale, thrustScale = unpackScales(row)
rollScale = rcos(angle + 90)
pitchScale = rcos(angle)
- print("\t{{ {:9f}, {:9f}, {:9f} }},".format(rollScale, pitchScale, yawScale))
+ print("\t{{ {:9f}, {:9f}, {:9f}, {:9f} }},".format(rollScale, pitchScale, yawScale, thrustScale))
print("};\n")
def printScaleTablesIndex():