Skip to content

Commit d223a8a

Browse files
committed
Send angles in actual range instead of hardcoded angles
1 parent a7cc87b commit d223a8a

File tree

5 files changed

+34
-3
lines changed

5 files changed

+34
-3
lines changed

Tools/module_config/generate_params.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -298,12 +298,14 @@ def add_local_param(param_name, param_def):
298298
( 'min', 'Minimum', 'MIN', minimum_description ),
299299
( 'max', 'Maximum', 'MAX', maximum_description ),
300300
( 'failsafe', 'Failsafe', 'FAIL', failsafe_description ),
301+
( 'anglemin', 'Anglemin', 'MINA', failsafe_description ),
302+
( 'anglemax', 'Anglemax', 'MAXA', failsafe_description ),
301303
]
302304
for key, label, param_suffix, description in standard_params_array:
303305
if key in standard_params:
304306

305307
# values must be in range of an uint16_t
306-
if standard_params[key]['min'] < 0:
308+
if standard_params[key]['min'] < 0 and key != "anglemin" and key != "anglemax":
307309
raise Exception('minimum value for {:} expected >= 0 (got {:})'.format(key, standard_params[key]['min']))
308310
if standard_params[key]['max'] >= 1<<16:
309311
raise Exception('maximum value for {:} expected <= {:} (got {:})'.format(key, 1<<16, standard_params[key]['max']))

src/lib/mixer_module/mixer_module.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ void MixingOutput::initParamHandles(const uint8_t instance_start)
123123
_param_handles[i].max = param_find(param_name);
124124
snprintf(param_name, sizeof(param_name), "%s_%s%d", _param_prefix, "FAIL", i + instance_start);
125125
_param_handles[i].failsafe = param_find(param_name);
126+
snprintf(param_name, sizeof(param_name), "%s_%s%d", _param_prefix, "MINA", i + instance_start);
127+
_param_handles[i].angle_min = param_find(param_name);
128+
snprintf(param_name, sizeof(param_name), "%s_%s%d", _param_prefix, "MAXA", i + instance_start);
129+
_param_handles[i].angle_max = param_find(param_name);
126130
}
127131

128132
snprintf(param_name, sizeof(param_name), "%s_%s", _param_prefix, "REV");
@@ -182,6 +186,20 @@ void MixingOutput::updateParams()
182186
_max_value[i] = tmp;
183187
}
184188

189+
if (_param_handles[i].angle_max != PARAM_INVALID && param_get(_param_handles[i].angle_max, &val) == 0) {
190+
_angle_max[i] = val;
191+
}
192+
193+
if (_param_handles[i].angle_min != PARAM_INVALID && param_get(_param_handles[i].angle_min, &val) == 0) {
194+
_angle_min[i] = val;
195+
}
196+
197+
if (_angle_min[i] > _angle_max[i]) {
198+
int tmp = _angle_min[i];
199+
_angle_min[i] = _angle_max[i];
200+
_angle_max[i] = tmp;
201+
}
202+
185203
if (_param_handles[i].failsafe != PARAM_INVALID && param_get(_param_handles[i].failsafe, &val) == 0) {
186204
_failsafe_value[i] = val;
187205
}

src/lib/mixer_module/mixer_module.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@ class MixingOutput : public ModuleParams
174174
uint16_t &disarmedValue(int index) { return _disarmed_value[index]; }
175175
uint16_t &minValue(int index) { return _min_value[index]; }
176176
uint16_t &maxValue(int index) { return _max_value[index]; }
177+
int &minAngle(int index) { return _angle_min[index]; }
178+
int &maxAngle(int index) { return _angle_max[index]; }
177179

178180
param_t functionParamHandle(int index) const { return _param_handles[index].function; }
179181
param_t disarmedParamHandle(int index) const { return _param_handles[index].disarmed; }
@@ -231,6 +233,8 @@ class MixingOutput : public ModuleParams
231233
param_t min{PARAM_INVALID};
232234
param_t max{PARAM_INVALID};
233235
param_t failsafe{PARAM_INVALID};
236+
param_t angle_min{PARAM_INVALID};
237+
param_t angle_max{PARAM_INVALID};
234238
};
235239

236240
void lock() { do {} while (px4_sem_wait(&_lock) != 0); }
@@ -243,6 +247,8 @@ class MixingOutput : public ModuleParams
243247
uint16_t _min_value[MAX_ACTUATORS] {};
244248
uint16_t _max_value[MAX_ACTUATORS] {};
245249
uint16_t _current_output_value[MAX_ACTUATORS] {}; ///< current output values (reordered)
250+
int _angle_min[MAX_ACTUATORS] {};
251+
int _angle_max[MAX_ACTUATORS] {};
246252
uint16_t _reverse_output_mask{0}; ///< reverses the interval [min, max] -> [max, min], NOT motor direction
247253

248254
enum class OutputLimitState {

src/modules/simulation/gz_bridge/GZMixingInterfaceServo.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,11 @@ bool GZMixingInterfaceServo::updateOutputs(bool stop_motors, uint16_t outputs[MA
6464
for (auto &servo_pub : _servos_pub) {
6565
if (_mixing_output.isFunctionSet(i)) {
6666
gz::msgs::Double servo_output;
67-
///TODO: Normalize output data
68-
double output = (outputs[i] - 500) / 500.0;
67+
68+
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);
71+
6972
// std::cout << "outputs[" << i << "]: " << outputs[i] << std::endl;
7073
// std::cout << " output: " << output << std::endl;
7174
servo_output.set_data(output);

src/modules/simulation/gz_bridge/module.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ actuator_output:
2424
min: { min: 0, max: 1000, default: 0 }
2525
max: { min: 0, max: 1000, default: 1000 }
2626
failsafe: { min: 0, max: 1000 }
27+
anglemin: { min: -180, max: 180, default: -45}
28+
anglemax: { min: -180, max: 180, default: 45}
2729
num_channels: 8
2830
- param_prefix: SIM_GZ_WH
2931
group_label: 'Wheels'

0 commit comments

Comments
 (0)