Skip to content

Commit 08494be

Browse files
committed
allow for velocity control for servos
1 parent 108bc94 commit 08494be

File tree

6 files changed

+36
-4
lines changed

6 files changed

+36
-4
lines changed

ROMFS/px4fmu_common/init.d-posix/airframes/4011_gz_lawnmower

+2
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ param set-default SIM_GZ_SV_MIN3 0
6666
param set-default SIM_GZ_SV_MAX3 1000
6767
param set-default SIM_GZ_SV_DIS3 500
6868
param set-default SIM_GZ_SV_FAIL3 500
69+
param set-default SIM_GZ_SV_PCTRL3 0
6970

7071
# Gas engine throttle, PCA9685 servo channel 4, "RC AUX1" (407) - left knob, or "Servo 4" (204):
7172
# - on minimum when disarmed or failed:
@@ -74,6 +75,7 @@ param set-default SIM_GZ_SV_MIN4 0
7475
param set-default SIM_GZ_SV_MAX4 1000
7576
param set-default SIM_GZ_SV_DIS4 500
7677
param set-default SIM_GZ_SV_FAIL4 500
78+
param set-default SIM_GZ_SV_PCTRL4 0
7779

7880
# Controlling PCA9685 servos 5,6,7,8 directly via "Servo 5..8" setting, by publishing actuator_servos.control[]:
7981

Tools/module_config/generate_params.py

+13-2
Original file line numberDiff line numberDiff line change
@@ -293,13 +293,24 @@ def add_local_param(param_name, param_def):
293293
294294
When set to -1 (default), the value depends on the function (see {:}).
295295
'''.format(param_prefix+'_FUNC${i}')
296+
297+
min_angle_description = \
298+
'''Minimum angle at minimum output value (when not disarmed).
299+
'''
300+
max_angle_description = \
301+
'''Maxmimum angle at maximum output value (when not disarmed).
302+
'''
303+
position_controller_description = \
304+
'''1 if servo is used for position control, otherwise 0.
305+
'''
296306
standard_params_array = [
297307
( 'disarmed', 'Disarmed', 'DIS', disarmed_description ),
298308
( 'min', 'Minimum', 'MIN', minimum_description ),
299309
( 'max', 'Maximum', 'MAX', maximum_description ),
300310
( 'failsafe', 'Failsafe', 'FAIL', failsafe_description ),
301-
( 'anglemin', 'Anglemin', 'MINA', failsafe_description ),
302-
( 'anglemax', 'Anglemax', 'MAXA', failsafe_description ),
311+
( 'anglemin', 'Anglemin', 'MINA', min_angle_description ),
312+
( 'anglemax', 'Anglemax', 'MAXA', max_angle_description ),
313+
( 'positionctrl', 'Positionctrl', 'PCTRL', position_controller_description ),
303314
]
304315
for key, label, param_suffix, description in standard_params_array:
305316
if key in standard_params:

src/lib/mixer_module/mixer_module.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ void MixingOutput::initParamHandles(const uint8_t instance_start)
127127
_param_handles[i].angle_min = param_find(param_name);
128128
snprintf(param_name, sizeof(param_name), "%s_%s%d", _param_prefix, "MAXA", i + instance_start);
129129
_param_handles[i].angle_max = param_find(param_name);
130+
snprintf(param_name, sizeof(param_name), "%s_%s%d", _param_prefix, "PCTRL", i + instance_start);
131+
_param_handles[i].position_ctrl = param_find(param_name);
130132
}
131133

132134
snprintf(param_name, sizeof(param_name), "%s_%s", _param_prefix, "REV");
@@ -200,6 +202,10 @@ void MixingOutput::updateParams()
200202
_angle_max[i] = tmp;
201203
}
202204

205+
if (_param_handles[i].position_ctrl != PARAM_INVALID && param_get(_param_handles[i].position_ctrl, &val) == 0) {
206+
_position_ctrl[i] = val;
207+
}
208+
203209
if (_param_handles[i].failsafe != PARAM_INVALID && param_get(_param_handles[i].failsafe, &val) == 0) {
204210
_failsafe_value[i] = val;
205211
}

src/lib/mixer_module/mixer_module.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ class MixingOutput : public ModuleParams
176176
uint16_t &maxValue(int index) { return _max_value[index]; }
177177
int &minAngle(int index) { return _angle_min[index]; }
178178
int &maxAngle(int index) { return _angle_max[index]; }
179+
uint16_t &usePositionCtrl(int index) { return _position_ctrl[index]; }
179180

180181
param_t functionParamHandle(int index) const { return _param_handles[index].function; }
181182
param_t disarmedParamHandle(int index) const { return _param_handles[index].disarmed; }
@@ -235,6 +236,7 @@ class MixingOutput : public ModuleParams
235236
param_t failsafe{PARAM_INVALID};
236237
param_t angle_min{PARAM_INVALID};
237238
param_t angle_max{PARAM_INVALID};
239+
param_t position_ctrl{PARAM_INVALID};
238240
};
239241

240242
void lock() { do {} while (px4_sem_wait(&_lock) != 0); }
@@ -249,6 +251,7 @@ class MixingOutput : public ModuleParams
249251
uint16_t _current_output_value[MAX_ACTUATORS] {}; ///< current output values (reordered)
250252
int _angle_min[MAX_ACTUATORS] {};
251253
int _angle_max[MAX_ACTUATORS] {};
254+
uint16_t _position_ctrl[MAX_ACTUATORS] {};
252255
uint16_t _reverse_output_mask{0}; ///< reverses the interval [min, max] -> [max, min], NOT motor direction
253256

254257
enum class OutputLimitState {

src/modules/simulation/gz_bridge/GZMixingInterfaceServo.cpp

+11-2
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,17 @@ bool GZMixingInterfaceServo::updateOutputs(bool stop_motors, uint16_t outputs[MA
6666
gz::msgs::Double servo_output;
6767

6868
double output_range = _mixing_output.maxValue(i) - _mixing_output.minValue(i);
69-
double angular_range = _mixing_output.maxAngle(i) - _mixing_output.minAngle(i);
70-
double output = math::radians((double)_mixing_output.minAngle(i) + (double)outputs[i] / output_range * angular_range);
69+
double output;
70+
71+
if (_mixing_output.usePositionCtrl(i)) {
72+
double angular_range = _mixing_output.maxAngle(i) - _mixing_output.minAngle(i);
73+
output = math::radians((double)_mixing_output.minAngle(i) + (double)outputs[i] / output_range * angular_range);
74+
75+
} else {
76+
// This is currently only used by the landmower
77+
double half_range = output_range / 2.;
78+
output = ((double)outputs[i] - half_range) / half_range;
79+
}
7180

7281
// std::cout << "outputs[" << i << "]: " << outputs[i] << std::endl;
7382
// std::cout << " output: " << output << std::endl;

src/modules/simulation/gz_bridge/module.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ actuator_output:
2626
failsafe: { min: 0, max: 1000 }
2727
anglemin: { min: -180, max: 180, default: -30}
2828
anglemax: { min: -180, max: 180, default: 30}
29+
positionctrl: { min: 0, max: 1, default: 1}
2930
num_channels: 8
3031
- param_prefix: SIM_GZ_WH
3132
group_label: 'Wheels'

0 commit comments

Comments
 (0)