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

1 回复

更多关于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是一个异步方法,我们使用Futureawait关键字来处理异步操作。如果获取进程ID失败,我们将捕获异常并在UI中显示错误信息。

确保在实际项目中替换simple_pid的版本号为最新的可用版本号。你可以通过在命令行中运行flutter pub outdated来查看所有依赖项的最新版本。

回到顶部