Add boost outer tire, Add ratio-threshold, Fix motorctl timeout
Rework joystick command generation
Fix timeout no commands received in motorctl
Successfully tested this state on actual hardware:
turning behavior is significantly improved - does not get slower when turning anymore
joystick:
- add boost of inner tire when turning
- add threshold where ratio snaps to 1
- optimize structure, logging
control:
- rename maxDuty to maxDutyStraight to be more clear
- add methods to change and get new variable RelativeBoostPer for menu item
menu:
- add new item to set maxRelativeBoost config parameter
motorctl:
- fix timeout not working:
previously when not receiving commands for 15s the duty was set to 0 for 1 handle cycle only
This commit is contained in:
@@ -251,7 +251,19 @@ rotary_encoder_t encoder_config = {
|
||||
//-----------------------------------
|
||||
//configure parameters for motor command generation from joystick data
|
||||
joystickGenerateCommands_config_t joystickGenerateCommands_config{
|
||||
.maxDuty = 100,
|
||||
.dutyOffset = 5, // duty at which motors start immediately
|
||||
.altStickMapping = false,
|
||||
//-- maxDuty --
|
||||
// max duty when both motors are at equal ratio e.g. driving straight forward
|
||||
// better to be set less than 100% to have some reserve for boosting the outer tire when turning
|
||||
.maxDutyStraight = 85,
|
||||
//-- maxBoost --
|
||||
// boost is amount of duty added to maxDutyStraight to outer tire while turning
|
||||
// => turning: inner tire gets slower, outer tire gets faster
|
||||
// 0: boost = 0 (disabled)
|
||||
// 100: boost = maxDutyStraight (e.g. when maxDuty is 50, outer motor can still reach 100 (50+50))
|
||||
.maxRelativeBoostPercentOfMaxDuty = 60,
|
||||
// 60: when maxDuty is set above 62% (equals 0.6*62 = 38% boost) the outer tire can still reach 100% - below 62 maxDuty the boosted speed is also reduced.
|
||||
// => setting this value lower prevents desired low max duty configuration from being way to fast in curves.
|
||||
.dutyOffset = 5, // duty at which motors start immediately
|
||||
.ratioSnapToOneThreshold = 0.9, // threshold ratio snaps to 1 to have some area of max turning before entering X-Axis-full-rotate mode
|
||||
.altStickMapping = false // invert reverse direction
|
||||
};
|
||||
@@ -570,11 +570,11 @@ void controlledArmchair::loadMaxDuty(void)
|
||||
switch (err)
|
||||
{
|
||||
case ESP_OK:
|
||||
ESP_LOGW(TAG, "Successfully read value '%s' from nvs. Overriding default value %.2f with %.2f", "c-maxDuty", joystickGenerateCommands_config.maxDuty, valueRead/100.0);
|
||||
joystickGenerateCommands_config.maxDuty = (float)(valueRead/100.0);
|
||||
ESP_LOGW(TAG, "Successfully read value '%s' from nvs. Overriding default value %.2f with %.2f", "c-maxDuty", joystickGenerateCommands_config.maxDutyStraight, valueRead/100.0);
|
||||
joystickGenerateCommands_config.maxDutyStraight = (float)(valueRead/100.0);
|
||||
break;
|
||||
case ESP_ERR_NVS_NOT_FOUND:
|
||||
ESP_LOGW(TAG, "nvs: the value '%s' is not initialized yet, keeping default value %.2f", "c-maxDuty", joystickGenerateCommands_config.maxDuty);
|
||||
ESP_LOGW(TAG, "nvs: the value '%s' is not initialized yet, keeping default value %.2f", "c-maxDuty", joystickGenerateCommands_config.maxDutyStraight);
|
||||
break;
|
||||
default:
|
||||
ESP_LOGE(TAG, "Error (%s) reading nvs!", esp_err_to_name(err));
|
||||
@@ -589,12 +589,12 @@ void controlledArmchair::loadMaxDuty(void)
|
||||
// note: duty percentage gets stored as uint with factor 100 (to get more precision)
|
||||
void controlledArmchair::writeMaxDuty(float newValue){
|
||||
// check if unchanged
|
||||
if(joystickGenerateCommands_config.maxDuty == newValue){
|
||||
if(joystickGenerateCommands_config.maxDutyStraight == newValue){
|
||||
ESP_LOGW(TAG, "value unchanged at %.2f, not writing to nvs", newValue);
|
||||
return;
|
||||
}
|
||||
// update nvs value
|
||||
ESP_LOGW(TAG, "updating nvs value '%s' from %.2f to %.2f", "c-maxDuty", joystickGenerateCommands_config.maxDuty, newValue) ;
|
||||
ESP_LOGW(TAG, "updating nvs value '%s' from %.2f to %.2f", "c-maxDuty", joystickGenerateCommands_config.maxDutyStraight, newValue) ;
|
||||
esp_err_t err = nvs_set_u16(*nvsHandle, "c-maxDuty", (uint16_t)(newValue*100));
|
||||
if (err != ESP_OK)
|
||||
ESP_LOGE(TAG, "nvs: failed writing");
|
||||
@@ -604,5 +604,5 @@ void controlledArmchair::writeMaxDuty(float newValue){
|
||||
else
|
||||
ESP_LOGI(TAG, "nvs: successfully committed updates");
|
||||
// update variable
|
||||
joystickGenerateCommands_config.maxDuty = newValue;
|
||||
joystickGenerateCommands_config.maxDutyStraight = newValue;
|
||||
}
|
||||
@@ -94,7 +94,10 @@ class controlledArmchair {
|
||||
|
||||
// configure max dutycycle (in joystick or http mode)
|
||||
void setMaxDuty(float maxDutyNew) { writeMaxDuty(maxDutyNew); };
|
||||
float getMaxDuty() const {return joystickGenerateCommands_config.maxDuty; };
|
||||
float getMaxDuty() const {return joystickGenerateCommands_config.maxDutyStraight; };
|
||||
// configure max boost (in joystick or http mode)
|
||||
void setMaxRelativeBoostPer(float newValue) { joystickGenerateCommands_config.maxRelativeBoostPercentOfMaxDuty = newValue; };
|
||||
float getMaxRelativeBoostPer() const {return joystickGenerateCommands_config.maxRelativeBoostPercentOfMaxDuty; };
|
||||
|
||||
uint32_t getInactivityDurationMs() {return esp_log_timestamp() - timestamp_lastActivity;};
|
||||
|
||||
|
||||
@@ -276,6 +276,34 @@ menuItem_t item_maxDuty = {
|
||||
};
|
||||
|
||||
|
||||
//##################################
|
||||
//##### set max relative boost #####
|
||||
//##################################
|
||||
void maxRelativeBoost_action(display_task_parameters_t * objects, SSD1306_t * display, int value)
|
||||
{
|
||||
objects->control->setMaxRelativeBoostPer(value);
|
||||
}
|
||||
int maxRelativeBoost_currentValue(display_task_parameters_t * objects)
|
||||
{
|
||||
return (int)objects->control->getMaxRelativeBoostPer();
|
||||
}
|
||||
menuItem_t item_maxRelativeBoost = {
|
||||
maxRelativeBoost_action, // function action
|
||||
maxRelativeBoost_currentValue, // function get initial value or NULL(show in line 2)
|
||||
NULL, // function get default value or NULL(dont set value, show msg)
|
||||
0, // valueMin
|
||||
150, // valueMax
|
||||
1, // valueIncrement
|
||||
"Set max Boost ", // title
|
||||
"Set max Boost % ", // line1 (above value)
|
||||
"for outer tire ", // line2 (above value)
|
||||
"", // line4 * (below value)
|
||||
"", // line5 *
|
||||
" % of max duty ", // line6
|
||||
"added on turning", // line7
|
||||
};
|
||||
|
||||
|
||||
//######################
|
||||
//##### accelLimit #####
|
||||
//######################
|
||||
@@ -550,8 +578,8 @@ menuItem_t item_last = {
|
||||
//####################################################
|
||||
//### store all configured menu items in one array ###
|
||||
//####################################################
|
||||
const menuItem_t menuItems[] = {item_centerJoystick, item_calibrateJoystick, item_debugJoystick, item_statusScreen, item_maxDuty, item_accelLimit, item_decelLimit, item_motorControlMode, item_tractionControlSystem, item_reset, item_example, item_last};
|
||||
const int itemCount = 10;
|
||||
const menuItem_t menuItems[] = {item_centerJoystick, item_calibrateJoystick, item_debugJoystick, item_statusScreen, item_maxDuty, item_maxRelativeBoost, item_accelLimit, item_decelLimit, item_motorControlMode, item_tractionControlSystem, item_reset, item_example, item_last};
|
||||
const int itemCount = 11;
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user