[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XD8RAGAF9TFK6HS2XBD2Z6":3,"skill-same:01M6XD8RAGAF9TFK6HS2XBD2Z6":57},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":36,"commitSha":37,"skillDirectory":38,"forksCount":13,"repositoryHtmlUrl":39,"repositoryHomepageUrl":6,"ownerHtmlUrl":40,"ownerBlogUrl":6,"ownerDescription":41,"updatedAt":42,"install":43,"resources":56},"01M6XD8RAGAF9TFK6HS2XBD2Z6","imc-tuning-rules",null,"Calculate PI\u002FPID controller gains using Internal Model Control (IMC) tuning rules for first-order systems.","Waaaalnut\u002Fskillsbench","Waaaalnut","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F103995656?v=4","01M6XCS9K1V51EY3JMB7DGMX24","01M6XCS9Q4WPW88W62C55G1H44",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks-no-skills\u002Fhvac-control\u002Fenvironment\u002Fskills\u002Fimc-tuning-rules\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30],"tuning","Rules","imc tuning rules","controller","first","model","calculate","pi","control","systems","PID","for","pid controller","2026-11-10 10:12:30",false,"---\nname: imc-tuning-rules\ndescription: Calculate PI\u002FPID controller gains using Internal Model Control (IMC) tuning rules for first-order systems.\n---\n\n# IMC Tuning Rules for PI\u002FPID Controllers\n\n## Overview\n\nInternal Model Control (IMC) is a systematic method for tuning PI\u002FPID controllers based on a process model. Once you've identified system parameters (K and tau), IMC provides controller gains.\n\n## Why IMC?\n\n- **Model-based**: Uses identified process parameters directly\n- **Single tuning parameter**: Just choose the closed-loop speed (lambda)\n- **Guaranteed stability**: For first-order systems, always stable if model is accurate\n- **Predictable response**: Closed-loop time constant equals lambda\n\n## IMC Tuning for First-Order Systems\n\nFor a first-order process with gain K and time constant tau:\n\n```\nProcess: G(s) = K \u002F (tau*s + 1)\n```\n\nThe IMC-tuned PI controller gains are:\n\n```\nKp = tau \u002F (K * lambda)\nKi = Kp \u002F tau = 1 \u002F (K * lambda)\nKd = 0  (derivative not needed for first-order systems)\n```\n\nWhere:\n- `Kp` = Proportional gain\n- `Ki` = Integral gain (units: 1\u002Ftime)\n- `Kd` = Derivative gain (zero for first-order)\n- `lambda` = Desired closed-loop time constant (tuning parameter)\n\n## Choosing Lambda (λ)\n\nLambda controls the trade-off between speed and robustness:\n\n| Lambda | Behavior |\n|--------|----------|\n| `lambda = 0.1 * tau` | Very aggressive, fast but sensitive to model error |\n| `lambda = 0.5 * tau` | Aggressive, good for accurate models |\n| `lambda = 1.0 * tau` | Moderate, balanced speed and robustness |\n| `lambda = 2.0 * tau` | Conservative, robust to model uncertainty |\n\n**Default recommendation**: Start with `lambda = tau`\n\nFor noisy systems or uncertain models, use larger lambda.\nFor precise models and fast response needs, use smaller lambda.\n\n## Implementation\n\n```python\ndef calculate_imc_gains(K, tau, lambda_factor=1.0):\n    \"\"\"\n    Calculate IMC-tuned PI gains for a first-order system.\n\n    Args:\n        K: Process gain\n        tau: Time constant\n        lambda_factor: Multiplier for lambda (default 1.0 = lambda equals tau)\n\n    Returns:\n        dict with Kp, Ki, Kd, lambda\n    \"\"\"\n    lambda_cl = lambda_factor * tau\n\n    Kp = tau \u002F (K * lambda_cl)\n    Ki = Kp \u002F tau\n    Kd = 0.0\n\n    return {\n        \"Kp\": Kp,\n        \"Ki\": Ki,\n        \"Kd\": Kd,\n        \"lambda\": lambda_cl\n    }\n```\n\n## PI Controller Implementation\n\n```python\nclass PIController:\n    def __init__(self, Kp, Ki, setpoint):\n        self.Kp = Kp\n        self.Ki = Ki\n        self.setpoint = setpoint\n        self.integral = 0.0\n\n    def compute(self, measurement, dt):\n        \"\"\"Compute control output.\"\"\"\n        error = self.setpoint - measurement\n\n        # Integral term\n        self.integral += error * dt\n\n        # PI control law\n        output = self.Kp * error + self.Ki * self.integral\n\n        # Clamp to valid range\n        output = max(output_min, min(output_max, output))\n\n        return output\n```\n\n## Expected Closed-Loop Behavior\n\nWith IMC tuning, the closed-loop response is approximately:\n\n```\ny(t) = y_setpoint * (1 - exp(-t \u002F lambda))\n```\n\nKey properties:\n- **Rise time**: ~2.2 * lambda to reach 90% of setpoint\n- **Settling time**: ~4 * lambda to reach 98% of setpoint\n- **Overshoot**: Minimal for first-order systems\n- **Steady-state error**: Zero (integral action eliminates offset)\n\n## Tips\n\n1. **Start conservative**: Use `lambda = tau` initially\n2. **Decrease lambda carefully**: Smaller lambda = larger Kp = faster but riskier\n3. **Watch for oscillation**: If output oscillates, increase lambda\n4. **Anti-windup**: Prevent integral wind-up when output saturates\n","# IMC Tuning Rules for PI\u002FPID Controllers\n\n## Overview\n\nInternal Model Control (IMC) is a systematic method for tuning PI\u002FPID controllers based on a process model. Once you've identified system parameters (K and tau), IMC provides controller gains.\n\n## Why IMC?\n\n- **Model-based**: Uses identified process parameters directly\n- **Single tuning parameter**: Just choose the closed-loop speed (lambda)\n- **Guaranteed stability**: For first-order systems, always stable if model is accurate\n- **Predictable response**: Closed-loop time constant equals lambda\n\n## IMC Tuning for First-Order Systems\n\nFor a first-order process with gain K and time constant tau:\n\n```\nProcess: G(s) = K \u002F (tau*s + 1)\n```\n\nThe IMC-tuned PI controller gains are:\n\n```\nKp = tau \u002F (K * lambda)\nKi = Kp \u002F tau = 1 \u002F (K * lambda)\nKd = 0  (derivative not needed for first-order systems)\n```\n\nWhere:\n- `Kp` = Proportional gain\n- `Ki` = Integral gain (units: 1\u002Ftime)\n- `Kd` = Derivative gain (zero for first-order)\n- `lambda` = Desired closed-loop time constant (tuning parameter)\n\n## Choosing Lambda (λ)\n\nLambda controls the trade-off between speed and robustness:\n\n| Lambda | Behavior |\n|--------|----------|\n| `lambda = 0.1 * tau` | Very aggressive, fast but sensitive to model error |\n| `lambda = 0.5 * tau` | Aggressive, good for accurate models |\n| `lambda = 1.0 * tau` | Moderate, balanced speed and robustness |\n| `lambda = 2.0 * tau` | Conservative, robust to model uncertainty |\n\n**Default recommendation**: Start with `lambda = tau`\n\nFor noisy systems or uncertain models, use larger lambda.\nFor precise models and fast response needs, use smaller lambda.\n\n## Implementation\n\n```python\ndef calculate_imc_gains(K, tau, lambda_factor=1.0):\n    \"\"\"\n    Calculate IMC-tuned PI gains for a first-order system.\n\n    Args:\n        K: Process gain\n        tau: Time constant\n        lambda_factor: Multiplier for lambda (default 1.0 = lambda equals tau)\n\n    Returns:\n        dict with Kp, Ki, Kd, lambda\n    \"\"\"\n    lambda_cl = lambda_factor * tau\n\n    Kp = tau \u002F (K * lambda_cl)\n    Ki = Kp \u002F tau\n    Kd = 0.0\n\n    return {\n        \"Kp\": Kp,\n        \"Ki\": Ki,\n        \"Kd\": Kd,\n        \"lambda\": lambda_cl\n    }\n```\n\n## PI Controller Implementation\n\n```python\nclass PIController:\n    def __init__(self, Kp, Ki, setpoint):\n        self.Kp = Kp\n        self.Ki = Ki\n        self.setpoint = setpoint\n        self.integral = 0.0\n\n    def compute(self, measurement, dt):\n        \"\"\"Compute control output.\"\"\"\n        error = self.setpoint - measurement\n\n        # Integral term\n        self.integral += error * dt\n\n        # PI control law\n        output = self.Kp * error + self.Ki * self.integral\n\n        # Clamp to valid range\n        output = max(output_min, min(output_max, output))\n\n        return output\n```\n\n## Expected Closed-Loop Behavior\n\nWith IMC tuning, the closed-loop response is approximately:\n\n```\ny(t) = y_setpoint * (1 - exp(-t \u002F lambda))\n```\n\nKey properties:\n- **Rise time**: ~2.2 * lambda to reach 90% of setpoint\n- **Settling time**: ~4 * lambda to reach 98% of setpoint\n- **Overshoot**: Minimal for first-order systems\n- **Steady-state error**: Zero (integral action eliminates offset)\n\n## Tips\n\n1. **Start conservative**: Use `lambda = tau` initially\n2. **Decrease lambda carefully**: Smaller lambda = larger Kp = faster but riskier\n3. **Watch for oscillation**: If output oscillates, increase lambda\n4. **Anti-windup**: Prevent integral wind-up when output saturates\n",{"name":5,"description":7},"main","7eeb258ada72b7f58119b0e7a2c00ea89d9beedd","tasks-no-skills\u002Fhvac-control\u002Fenvironment\u002Fskills\u002Fimc-tuning-rules","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench","https:\u002F\u002Fgithub.com\u002FWaaaalnut","student of Zhejiang University","2026-04-21 23:16:23",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add Waaaalnut\u002Fskillsbench --skill imc-tuning-rules",{"tool":49,"command":50},"bunx","bunx skills add Waaaalnut\u002Fskillsbench --skill imc-tuning-rules",{"tool":52,"command":53},"pnpm","pnpm dlx skills add Waaaalnut\u002Fskillsbench --skill imc-tuning-rules","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks-no-skills\u002Fhvac-control\u002Fenvironment\u002Fskills\u002Fimc-tuning-rules\u002FSKILL.md",true,[],[58,72,86,114,136,154],{"skillNo":59,"name":60,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":61,"categories":62,"keywords":68,"publishedAt":31},"01M6XEWMJ6VY3ZC53MPDCPG3GH","data-reconciliation","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fxlsx-recover-data\u002Fenvironment\u002Fskills\u002Fdata-reconciliation\u002FSKILL.md",[63],{"categoryNo":64,"categoryName":65,"taxonomyType":66,"taxonomyTypeDesc":67},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[69,70,71],"data reconciliation","reconciliation","data",{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":31},"01M6XEW8MNPMF1KRXV6ATGFRQF","speech-to-text","Transcribe video to timestamped text using Whisper tiny model (pre-installed).","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-tutorial-indexer\u002Fenvironment\u002Fskills\u002Fspeech-to-text\u002FSKILL.md",[],[79,80,81,82,83,23,84,85],"speech","text","speech to text","transcribe video","whisper","Video","transcribe",{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":97,"publishedAt":31},"01M6XEW3FQZP0T1RKQQJFXVY9T","video-processor","Process videos by removing segments and concatenating remaining parts. Use when you need to remove detected pauses\u002Fopenings from videos, create highlight reels, or batch process segment removals using ffmpeg filter_complex.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fvideo-processor\u002FSKILL.md",[92],{"categoryNo":93,"categoryName":94,"taxonomyType":95,"taxonomyTypeDesc":96},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[84,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113],"processor","video processor","batch","create","reels","when","parts","segments","process","videos","you","segment","filter","ffmpeg","use","remove",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":121,"publishedAt":31},"01M6XEVXJ5KZ0NTY3XZKRY4AS1","silence-detector","Detect initial silence segments in audio\u002Fvideo using energy-based analysis. Use when you need to find low-energy periods at the start of recordings (title slides, setup time, pre-roll silence).","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fsilence-detector\u002FSKILL.md",[120],{"categoryNo":93,"categoryName":94,"taxonomyType":95,"taxonomyTypeDesc":96},[122,123,124,125,103,108,126,127,128,129,130,105,131,132,84,133,134,135,112],"detector","silence detector","title","slides","time","energy","at","recordings","detect","find","Audio","analysis","start","setup",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":31},"01M6XEVT3NGRN1FT7JPMAPXS6M","segment-combiner","Combine multiple segment detection results into a unified list. Use when you need to merge segments from different detectors, prepare removal lists for video processing, or consolidate detection outputs.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fsegment-combiner\u002FSKILL.md",[],[109,143,84,144,145,146,147,29,103,148,149,105,108,150,151,112,152,153],"segment combiner","detection","prepare","merge","video processing","outputs","combine","processing","consolidate","results","list",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":163,"publishedAt":31},"01M6XEVMPVASGS2KX86QK4FMT7","report-generator","Generate compression reports for video processing. Use when you need to create structured JSON reports with duration statistics, compression ratios, and segment details after video processing.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Freport-generator\u002FSKILL.md",[160],{"categoryNo":161,"categoryName":162,"taxonomyType":66,"taxonomyTypeDesc":67},"01JBSEEDCAT000000000000034","行政与办公人员",[164,165,166,109,103,29,108,167,150,168,169,170,112,147,171,84,172,173,101],"generator","report generator","report","with","statistics","structured","reports","json","compression","generate"]