Flutter进程ID获取插件simple_pid的使用
Flutter进程ID获取插件simple_pid的使用
简介
simple_pid_dart
是一个简单的PID控制器。如果你想要一个不依赖外部库的简单易用的PID控制器,那么这个插件非常适合你!
信用
此PID代码是从 https://github.com/m-lundberg/simple-pid 移植过来的。感谢原作者!
示例
使用非常简单:
var pid = PID(Kp: 1, Ki: 0.1, Kd: 0.05, setPoint: 1);
// 假设我们有一个系统要控制在controlled_system中
var v = controlledSystem.update(0);
while (true) {
// 根据系统的当前值计算新的输出
var control = pid(v);
// 将PID输出反馈给系统并获取其当前值
v = controlledSystem.update(control);
}
完整的API文档可以在 这里 找到。
安装
要安装该插件,只需添加到 pubspec.yaml
文件中。这个库是空安全的。
使用
PID
类实现了 call()
方法,这意味着为了计算一个新的输出值,你只需要像这样调用对象:
var output = pid(currentValue);
基础知识
PID 最佳工作状态是在固定的时间间隔内更新。为了实现这一点,设置 sample_time
为每次更新之间应该有的时间,并在程序循环中每次都调用PID。只有当 sample_time
秒过去后才会计算新的输出:
var pid = PID(sampleTime: 0.01); // 每0.01秒更新一次(默认)
while (true) {
var output = pid(currentValue);
}
要设置目标值(即PID试图达到的值),可以像这样设置:
pid.setPoint = 10;
可以在运行时随时更改调谐参数。它们可以单独设置或一次性设置:
pid.Ki = 1.0;
pid.tunings = [1.0, 0.2, 0.4];
如果需要反向模式(即输入增加导致输出减少,例如冷却的情况),可以将调谐参数设置为负值:
pid.tunings = [-1.0, -0.1, 0];
注意所有调谐参数应具有相同的符号。
为了使输出值保持在某个范围内,并避免积分饱和(因为积分项永远不会超出这些限制),可以将输出限制在一个范围内:
var pid = PID(minOutput: 0, maxOutput: 10);
其他功能
自动模式
为了禁用PID,使其不再计算新值,可以将自动模式设置为 False
:
pid.autoMode = false; // 当调用PID时不计算新值
pid.autoMode = true; // 再次启用PID
观察单独的组件
在调整PID时,可以看到每个组件对输出的贡献。它们可以通过以下方式查看:
List<double> c = pid.components; // 单独的项现在在 [P, I, D] 中
比例在测量上
为了消除某些类型系统的超调,可以直接在测量值上计算比例项,而不是误差。这可以通过以下方式启用:
proportionalOnMeasurement: true
测试
使用以下命令运行测试:
flutter pub run test
更多关于Flutter进程ID获取插件simple_pid的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter进程ID获取插件simple_pid的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用simple_pid
插件来获取进程ID的示例代码。这个插件允许你轻松获取当前Flutter应用的进程ID。
首先,确保你已经在pubspec.yaml
文件中添加了simple_pid
依赖项:
dependencies:
flutter:
sdk: flutter
simple_pid: ^x.y.z # 请将x.y.z替换为最新版本号
然后运行flutter pub get
来安装依赖项。
接下来,你可以在你的Flutter应用中使用simple_pid
插件来获取进程ID。下面是一个简单的示例代码,展示如何在Flutter应用中实现这一点:
import 'package:flutter/material.dart';
import 'package:simple_pid/simple_pid.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Process ID Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String _processId = 'Loading...';
@override
void initState() {
super.initState();
_getProcessId();
}
Future<void> _getProcessId() async {
try {
int pid = await SimplePid.pid;
setState(() {
_processId = 'Process ID: $pid';
});
} catch (e) {
setState(() {
_processId = 'Error: ${e.message}';
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Process ID Example'),
),
body: Center(
child: Text(
_processId,
style: TextStyle(fontSize: 24),
),
),
);
}
}
在这个示例中,我们创建了一个简单的Flutter应用,它包含一个主屏幕,显示当前进程的ID。在_MyHomePageState
类中,我们在initState
方法中调用_getProcessId
函数来获取进程ID。SimplePid.pid
是一个异步方法,返回当前进程的ID。我们将其结果存储在_processId
字符串中,并在UI中显示。
请注意,由于SimplePid.pid
是一个异步方法,我们使用Future
和await
关键字来处理异步操作。如果获取进程ID失败,我们将捕获异常并在UI中显示错误信息。
确保在实际项目中替换simple_pid
的版本号为最新的可用版本号。你可以通过在命令行中运行flutter pub outdated
来查看所有依赖项的最新版本。