Package PID Controller:

- add package to calculate range of value for Progressive Integrate Derivative

Package Duration:
- add function to parse float64 to Duration
- add function to return a PID Duration range from another given duration
- add function to return a PID Duration range to another given duration
This commit is contained in:
Nicolas JUHEL
2024-10-04 15:47:31 +02:00
parent 6213eeb560
commit 3c6318b33a
9 changed files with 287 additions and 105 deletions

View File

@@ -1,5 +1,4 @@
/*********************************************************************************************************************** /*
*
* MIT License * MIT License
* *
* Copyright (c) 2022 Nicolas JUHEL * Copyright (c) 2022 Nicolas JUHEL
@@ -22,8 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
* *
* */
**********************************************************************************************************************/
package duration package duration

View File

@@ -1,5 +1,4 @@
/*********************************************************************************************************************** /*
*
* MIT License * MIT License
* *
* Copyright (c) 2022 Nicolas JUHEL * Copyright (c) 2022 Nicolas JUHEL
@@ -22,8 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
* *
* */
**********************************************************************************************************************/
package duration package duration
@@ -65,3 +63,7 @@ func (d Duration) Days() int64 {
return int64(t) return int64(t)
} }
func (d Duration) Float64() float64 {
return float64(d)
}

View File

@@ -28,6 +28,7 @@
package duration package duration
import ( import (
"math"
"time" "time"
) )
@@ -60,3 +61,13 @@ func Days(i int64) Duration {
func ParseDuration(d time.Duration) Duration { func ParseDuration(d time.Duration) Duration {
return Duration(d) return Duration(d)
} }
func ParseFloat64(f float64) Duration {
const mx float64 = math.MaxInt64
if f > mx {
return Duration(math.MaxInt64)
} else {
return Duration(math.Round(f))
}
}

View File

@@ -1,5 +1,4 @@
/*********************************************************************************************************************** /*
*
* MIT License * MIT License
* *
* Copyright (c) 2022 Nicolas JUHEL * Copyright (c) 2022 Nicolas JUHEL
@@ -22,8 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
* *
* */
**********************************************************************************************************************/
package duration package duration

78
duration/operation.go Normal file
View File

@@ -0,0 +1,78 @@
/*
* MIT License
*
* Copyright (c) 2022 Nicolas JUHEL
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
package duration
import (
libpid "github.com/nabbar/golib/pidcontroller"
)
var (
DefaultRateProportional float64 = 0.1
DefaultRateIntegral float64 = 0.01
DefaultRateDerivative float64 = 0.05
)
func (d Duration) RangeTo(dur Duration, rateP, rateI, rateD float64) []Duration {
var (
p = libpid.New(rateP, rateI, rateD)
r = make([]Duration, 0)
)
for _, v := range p.Range(d.Float64(), dur.Float64()) {
r = append(r, ParseFloat64(v))
}
if len(r) < 3 {
r = append(make([]Duration, 0), d, dur)
}
return r
}
func (d Duration) RangeDefTo(dur Duration) []Duration {
return d.RangeTo(dur, DefaultRateProportional, DefaultRateIntegral, DefaultRateDerivative)
}
func (d Duration) RangeFrom(dur Duration, rateP, rateI, rateD float64) []Duration {
var (
p = libpid.New(rateP, rateI, rateD)
r = make([]Duration, 0)
)
for _, v := range p.Range(dur.Float64(), d.Float64()) {
r = append(r, ParseFloat64(v))
}
if len(r) < 3 {
r = append(make([]Duration, 0), d, dur)
}
return r
}
func (d Duration) RangeDefFrom(dur Duration) []Duration {
return d.RangeFrom(dur, DefaultRateProportional, DefaultRateIntegral, DefaultRateDerivative)
}

View File

@@ -1,5 +1,4 @@
/*********************************************************************************************************************** /*
*
* MIT License * MIT License
* *
* Copyright (c) 2022 Nicolas JUHEL * Copyright (c) 2022 Nicolas JUHEL
@@ -22,8 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
* *
* */
**********************************************************************************************************************/
package duration package duration

View File

@@ -1,5 +1,4 @@
/*********************************************************************************************************************** /*
*
* MIT License * MIT License
* *
* Copyright (c) 2022 Nicolas JUHEL * Copyright (c) 2022 Nicolas JUHEL
@@ -22,8 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
* *
* */
**********************************************************************************************************************/
package duration package duration

View File

@@ -0,0 +1,38 @@
/*
* MIT License
*
* Copyright (c) 2024 Nicolas JUHEL
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
package pidcontroller
type PID interface {
Range(min, max float64) []float64
}
func New(rateProportional, rateIntegral, rateDerivative float64) PID {
return &pid{
kp: rateProportional,
ki: rateIntegral,
kd: rateDerivative,
}
}

61
pidcontroller/model.go Normal file
View File

@@ -0,0 +1,61 @@
/*
* MIT License
*
* Copyright (c) 2024 Nicolas JUHEL
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
package pidcontroller
// PID (Proportional Integral Derivative controller)
type pid struct {
kp float64 // rate proportional
ki float64 // rate integral
kd float64 // rate derivative
prevError float64
integral float64
}
func (p *pid) calc(end, actual float64) float64 {
pidError := end - actual
p.integral += pidError
derive := pidError - p.prevError
output := p.kp*pidError + p.ki*p.integral + p.kd*derive
p.prevError = pidError
return output
}
func (p *pid) Range(min, max float64) []float64 {
var res = make([]float64, 0)
for {
min += p.calc(max, min)
if min > max {
return append(res, max)
} else {
res = append(res, min)
}
}
}