<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing with OASIS Tables v3.0 20080202//EN" "https://jats.nlm.nih.gov/nlm-dtd/publishing/3.0/journalpub-oasis3.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:oasis="http://docs.oasis-open.org/ns/oasis-exchange/table" xml:lang="en" dtd-version="3.0" article-type="research-article">
  <front>
    <journal-meta><journal-id journal-id-type="publisher">MS</journal-id><journal-title-group>
    <journal-title>Mechanical Sciences</journal-title>
    <abbrev-journal-title abbrev-type="publisher">MS</abbrev-journal-title><abbrev-journal-title abbrev-type="nlm-ta">Mech. Sci.</abbrev-journal-title>
  </journal-title-group><issn pub-type="epub">2191-916X</issn><publisher>
    <publisher-name>Copernicus Publications</publisher-name>
    <publisher-loc>Göttingen, Germany</publisher-loc>
  </publisher></journal-meta>
    <article-meta>
      <article-id pub-id-type="doi">10.5194/ms-17-713-2026</article-id><title-group><article-title>Hybrid nonlinear model predictive and linear quadratic balance control for a two-wheeled self-balancing wheelchair</article-title><alt-title>Hybrid NMPC–LQR balance control for a self-balancing wheelchair</alt-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author" corresp="no" rid="aff1 aff2 aff3">
          <name><surname>Sun</surname><given-names>Haomin</given-names></name>
          
        </contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1 aff2 aff3">
          <name><surname>Zhang</surname><given-names>Xinying</given-names></name>
          
        </contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1 aff2 aff3">
          <name><surname>Gu</surname><given-names>Yaozhi</given-names></name>
          
        </contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1 aff2 aff3">
          <name><surname>Wang</surname><given-names>Shuai</given-names></name>
          
        </contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1 aff2 aff3">
          <name><surname>Chen</surname><given-names>Weiyue</given-names></name>
          
        </contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1 aff2 aff3">
          <name><surname>Zhang</surname><given-names>Shuyue</given-names></name>
          
        </contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1 aff2 aff3">
          <name><surname>Xu</surname><given-names>Tianyu</given-names></name>
          
        </contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1 aff2 aff3">
          <name><surname>Yu</surname><given-names>Hongliu</given-names></name>
          
        </contrib>
        <contrib contrib-type="author" corresp="yes" rid="aff1 aff2 aff3">
          <name><surname>Meng</surname><given-names>Qiaoling</given-names></name>
          <email>qiaoling_meng@126.com</email>
        <ext-link>https://orcid.org/0000-0002-0240-4004</ext-link></contrib>
        <aff id="aff1"><label>1</label><institution>Institute of Intelligent Rehabilitation Engineering, University of Shanghai for Science and Technology, Shanghai, China</institution>
        </aff>
        <aff id="aff2"><label>2</label><institution>Shanghai Engineering Research Center of Assistive Devices, Shanghai, 200093, China</institution>
        </aff>
        <aff id="aff3"><label>3</label><institution>Key Laboratory of Neural-functional Information and Rehabilitation Engineering of the Ministry  of Civil Affairs, Shanghai, 200093, China</institution>
        </aff>
      </contrib-group>
      <author-notes><corresp id="corr1">Qiaoling Meng (qiaoling_meng@126.com)</corresp></author-notes><pub-date><day>6</day><month>July</month><year>2026</year></pub-date>
      
      <volume>17</volume>
      <issue>2</issue>
      <fpage>713</fpage><lpage>729</lpage>
      <history>
        <date date-type="received"><day>3</day><month>May</month><year>2026</year></date>
           <date date-type="rev-recd"><day>3</day><month>June</month><year>2026</year></date>
           <date date-type="accepted"><day>14</day><month>June</month><year>2026</year></date>
      </history>
      <permissions>
        <copyright-statement>Copyright: © 2026 Haomin Sun et al.</copyright-statement>
        <copyright-year>2026</copyright-year>
      <license license-type="open-access"><license-p>This work is licensed under the Creative Commons Attribution 4.0 International License. To view a copy of this licence, visit <ext-link ext-link-type="uri" xlink:href="https://creativecommons.org/licenses/by/4.0/">https://creativecommons.org/licenses/by/4.0/</ext-link></license-p></license></permissions><self-uri xlink:href="https://ms.copernicus.org/articles/17/713/2026/ms-17-713-2026.html">This article is available from https://ms.copernicus.org/articles/17/713/2026/ms-17-713-2026.html</self-uri><self-uri xlink:href="https://ms.copernicus.org/articles/17/713/2026/ms-17-713-2026.pdf">The full text article is available as a PDF file from https://ms.copernicus.org/articles/17/713/2026/ms-17-713-2026.pdf</self-uri>
      <abstract><title>Abstract</title>

      <p id="d2e167">A two-wheeled self-balancing wheelchair is a highly nonlinear and underactuated wheeled inverted-pendulum system, which faces severe balance control challenges under large tilt angles, load variations, and external disturbances. A hybrid nonlinear model predictive control–linear quadratic regulator (NMPC–LQR) balance control scheme is presented that combines nonlinear optimal recovery and efficient local stabilization while reducing the computational burden. A reduced-order nonlinear dynamic model of the wheelchair–occupant system is derived via the Lagrange method. The proposed controller confines LQR to a locally valid region verified by linearization-error analysis, whereas NMPC is employed for large-deviation recovery. A linearization-error analysis is first used to determine the switching-threshold search range, and a normalized five-index criterion identifies 0.100 rad as the optimal nominal threshold. Mass-sensitivity tests further provide an empirical relation for estimating the optimal threshold within the tested mass range. Comparative simulations under initial tilt angles of 35, 40, and 45° show faster convergence than standalone LQR and standalone NMPC controllers. Benchmark comparisons with SMC demonstrate a larger recoverable initial-angle range. Robustness tests under parameter variations, pulse and step disturbances, and flat-ground friction changes, together with prototype experiments, validate the stability, disturbance rejection, and engineering applicability of the proposed control strategy.</p>
  </abstract>
    
<funding-group>
<award-group id="gs1">
<funding-source>Natural Science Foundation of Shanghai Municipality</funding-source>
<award-id>25YL1900900</award-id>
</award-group>
</funding-group>
</article-meta>
  </front>
<body>
      

<sec id="Ch1.S1" sec-type="intro">
  <label>1</label><title>Introduction</title>
      <p id="d2e179">Two-wheeled self-balancing wheelchairs are becoming increasingly popular due to their compact structure, greater maneuverability in narrow spaces, and better adaptability to complex indoor and outdoor environments (Zhang et al., 2024). They represent a promising solution for improving the mobility of individuals with lower-limb impairment during daily living. However, such wheelchairs must not only provide mobility but also ensure stability and safety under various operating conditions to be truly useful and acceptable (Onozuka et al., 2020). Consequently, stability and safety have become the two key concerns for both researchers and users. The inherent static instability of self-balancing wheelchairs necessitates high gain feedback of fast state estimation, which inevitably amplifies sensor noise and model errors. Kalman filtering has been widely adopted to mitigate this sensitivity, as demonstrated by Huynh et al. (2017) in an optimal control framework, by Zhang et al. (2019) within a PID structure, and by Ma et al. (2024) using a fuzzy Kalman approach. However, these methods share three critical weaknesses: (i) reliance on known model and noise statistics, which do not hold under load variations; (ii) heuristic parameter tuning without online adaptation; and (iii) a decoupled design of estimation and control, leading to degraded performance under large-angle deviations or external disturbances. Thus, developing an adaptive or robust co-design of state estimation and feedback control remains an open challenge.</p>
      <p id="d2e182">Model-based controllers have been explored to overcome the poor adaptability existing in conventional methods. Among them, the LQR controller has been widely used in self-balancing systems due to its simple structure and satisfactory local stabilization performance. For instance, Feng et al. (2023) applied LQR to a two-wheel-legged robot and verified its efficient and stable regulation capability near the equilibrium point. Owing to its linear nature, LQR performs well near the equilibrium point but deteriorates rapidly under large-angle deviations. Recent studies have attempted to improve the robustness of LQR by introducing online self-tuning or hierarchical reconfiguration mechanisms. For example, Saleem et al. (2021) proposed several hierarchical self-tuning LQR procedures in which the weighting factors of the quadratic performance index are adjusted online to improve disturbance rejection in under-actuated mechatronic systems. Even with friction feedforward compensation (Zhang et al., 2025), its effective operating region remains fundamentally constrained. Compared with regular self-balancing vehicles, self-balancing wheelchairs are characterized by larger-scale and higher inertia, making safety an overriding concern in control design. Under sudden external disturbances, the system must be stabilized rapidly to avoid overturning while maintaining acceptable recovery performance even at relatively large inclination angles. This inevitably leads to strongly nonlinear dynamic behavior. Analogous control difficulties have been observed in two-wheeled inverted-pendulum systems subject to uncertain rolling resistance and angle limits (Liang et al., 2021). Consequently, the sole use of LQR control is insufficient to achieve satisfactory performance for self-balancing wheelchairs. Hence, the design of advanced control schemes capable of dealing with severe system nonlinearity still poses a considerable challenge.</p>
      <p id="d2e185">Predictive, adaptive, and intelligent control approaches have attracted increasing attention to cope with nonlinear behavior during large-angle recovery (Zhang and Mohamad Nor, 2025). For instance, Cui et al. (2015) and Li and Zhang (2010) employed adaptive backstepping and motion/force control strategies, respectively, for wheeled inverted-pendulum systems. Shen and Hong (2022) proposed an MPC strategy for  a two-wheeled inverted-pendulum system and demonstrated its capability to handle nonlinear effects through online control. However, its effectiveness under strongly nonlinear large-angle recovery conditions remains insufficiently validated. Liu et al. (2024) introduced NMPC into the control of a self-balancing wheelchair to further improve control performance under highly nonlinear conditions, while Li et al. (2021) demonstrated the applicability of predictive control to nonholonomic wheel-legged robots. These results indicate that predictive control methods are effective in handling nonlinear system dynamics. Nevertheless, it is important to emphasize that model predictive controllers still rely on online optimization at each sampling instant, thereby imposing a substantial computational burden. In addition, the control effectiveness in the near-equilibrium region is not always superior to that of traditional control approaches. An NMPC–LQR hybrid controller is proposed to improve large-angle recovery while reducing the computational burden. When the self-balancing system experiences a relatively large tilt angle, the NMPC controller is activated to provide the control input. As the tilt angle decreases and enters a predefined threshold region, the control law is switched to the LQR controller. The proposed strategy therefore combines the nonlinear recovery capability of NMPC under large-tilt-angle conditions with the computational efficiency and regulation performance of LQR in the near-equilibrium region. Furthermore, a switching-threshold evaluation method is also designed to resolve the problem of switching-angle selection. Subsequent simulations and experiments verify the effectiveness and practical applicability of the proposed hybrid controller for engineering implementation.</p>
      <p id="d2e188">The main contributions are summarized as follows: <list list-type="order"><list-item>
      <p id="d2e193">A reduced-order wheelchair–occupant dynamic model is established for longitudinal balance recovery, and the validity range of the modeling assumptions is explicitly discussed.</p></list-item><list-item>
      <p id="d2e197">A hybrid NMPC–LQR balance controller is constructed, where NMPC is used for large-deviation nonlinear recovery and LQR is restricted to the local region supported by linearization-validity analysis.</p></list-item><list-item>
      <p id="d2e201">A switching-threshold selection procedure is developed by combining linearization-error analysis and a normalized five-index evaluation criterion. In addition, a mass-sensitivity study is conducted to obtain an empirical threshold-estimation relation within the tested equivalent-mass range.</p></list-item><list-item>
      <p id="d2e205">Comparative simulations, SMC benchmark tests, disturbance tests, friction-coefficient tests, computational-efficiency tests, and prototype experiments are conducted to evaluate the proposed method.</p></list-item></list> However, three gaps remain: <list list-type="order"><list-item>
      <p id="d2e211">switching thresholds in existing hybrid schemes are often selected empirically, and their searchable range or parameter-dependent estimation is rarely quantified;</p></list-item><list-item>
      <p id="d2e215">the validity range of LQR linearization is rarely quantified when large initial tilt angles are considered;</p></list-item><list-item>
      <p id="d2e219">limited studies validate wheelchair-oriented hybrid control under load variations, friction mismatch, external disturbances, and prototype experiments.</p></list-item></list> The remainder of this paper is organized as follows. Section 2 presents the reduced-order dynamic model of the wheelchair–occupant system and discusses the validity range of the modeling assumptions. Section 3 introduces the hybrid NMPC–LQR controller, the linearization-error-based threshold search range, the five-index threshold evaluation method, the mass-dependent threshold estimation, and the stability considerations. Section 4 reports comparative simulations, SMC benchmark tests, pulse- and step-disturbance tests, friction-coefficient tests, computational-efficiency evaluations, and prototype experiments. Section 5 concludes the paper and discusses the limitations and future research directions.</p>
</sec>
<sec id="Ch1.S2">
  <label>2</label><title>Modeling</title>
      <p id="d2e231">Since both LQR and NMPC are model-based control methods, the accuracy of the dynamic model is of great importance. The wheelchair system is simplified as an inverted-pendulum system, following the classical modeling framework commonly adopted for nonholonomic two-wheeled inverted-pendulum robots (Kim et al., 2005). The main symbols and physical parameters used in the dynamic model are summarized in Table <xref ref-type="table" rid="T1"/>. The three-dimensional wheelchair–occupant configuration and the planar reduced model used in the subsequent derivation are shown in Fig. <xref ref-type="fig" rid="F1"/>.</p>

<table-wrap id="T1" specific-use="star"><label>Table 1</label><caption><p id="d2e241">Main symbols and physical parameters of the wheelchair–occupant system.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="4">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="left"/>
     <oasis:thead>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Symbol</oasis:entry>
         <oasis:entry colname="col2">Description</oasis:entry>
         <oasis:entry colname="col3">Value</oasis:entry>
         <oasis:entry colname="col4">Unit</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M1" display="inline"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Wheelchair body mass, excluding driving wheels</oasis:entry>
         <oasis:entry colname="col3">7</oasis:entry>
         <oasis:entry colname="col4">kg</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M2" display="inline"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">h</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Occupant mass</oasis:entry>
         <oasis:entry colname="col3">46</oasis:entry>
         <oasis:entry colname="col4">kg</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M3" display="inline"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="italic">ω</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Mass of a single driving wheel</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">kg</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M4" display="inline"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Equivalent upper-pendulum body mass</oasis:entry>
         <oasis:entry colname="col3">53</oasis:entry>
         <oasis:entry colname="col4">kg</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M5" display="inline"><mml:mrow><mml:msub><mml:mi>J</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Rotational inertia of the equivalent upper-pendulum body about its centroid</oasis:entry>
         <oasis:entry colname="col3">6.64</oasis:entry>
         <oasis:entry colname="col4"><inline-formula><mml:math id="M6" display="inline"><mml:mi mathvariant="normal">kg</mml:mi></mml:math></inline-formula> <inline-formula><mml:math id="M7" display="inline"><mml:mrow><mml:msup><mml:mi mathvariant="normal">m</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M8" display="inline"><mml:mrow><mml:msub><mml:mi>J</mml:mi><mml:mi mathvariant="italic">ω</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Rotational inertia of a single driving wheel about the wheel axis</oasis:entry>
         <oasis:entry colname="col3">0.0262</oasis:entry>
         <oasis:entry colname="col4"><inline-formula><mml:math id="M9" display="inline"><mml:mi mathvariant="normal">kg</mml:mi></mml:math></inline-formula> <inline-formula><mml:math id="M10" display="inline"><mml:mrow><mml:msup><mml:mi mathvariant="normal">m</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M11" display="inline"><mml:mi>r</mml:mi></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Driving wheel radius</oasis:entry>
         <oasis:entry colname="col3">0.162</oasis:entry>
         <oasis:entry colname="col4">m</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M12" display="inline"><mml:mi>L</mml:mi></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Equivalent pendulum length, namely the distance from the wheel-axis center to the overall center of mass</oasis:entry>
         <oasis:entry colname="col3">0.38</oasis:entry>
         <oasis:entry colname="col4">m</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M13" display="inline"><mml:mi>g</mml:mi></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Gravitational acceleration</oasis:entry>
         <oasis:entry colname="col3">9.81</oasis:entry>
         <oasis:entry colname="col4"><inline-formula><mml:math id="M14" display="inline"><mml:mi mathvariant="normal">m</mml:mi></mml:math></inline-formula> <inline-formula><mml:math id="M15" display="inline"><mml:mrow><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M16" display="inline"><mml:mi>y</mml:mi></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Longitudinal displacement of the wheel-axis center</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">m</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M17" display="inline"><mml:mi mathvariant="italic">θ</mml:mi></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Pitch angle of the wheelchair–occupant upper structure relative to the vertical direction</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">rad</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M18" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Angular position of the right driving wheel</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">rad</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M19" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi mathvariant="normal">l</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Angular position of the left driving wheel</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">rad</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M20" display="inline"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M21" display="inline"><mml:mrow><mml:msub><mml:mi>z</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Coordinates of the wheelchair-body center of mass</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">m</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M22" display="inline"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">h</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M23" display="inline"><mml:mrow><mml:msub><mml:mi>z</mml:mi><mml:mi mathvariant="normal">h</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Coordinates of the occupant center of mass</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">m</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M24" display="inline"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M25" display="inline"><mml:mrow><mml:msub><mml:mi>z</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Coordinates of the overall center of mass of the wheelchair–occupant system</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">m</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M26" display="inline"><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Translational velocity of the equivalent upper-pendulum body</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4"><inline-formula><mml:math id="M27" display="inline"><mml:mi mathvariant="normal">m</mml:mi></mml:math></inline-formula> <inline-formula><mml:math id="M28" display="inline"><mml:mrow><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M29" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">τ</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M30" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">τ</mml:mi><mml:mi mathvariant="normal">l</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">Driving torques of the right and left wheels</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4"><inline-formula><mml:math id="M31" display="inline"><mml:mi mathvariant="normal">N</mml:mi></mml:math></inline-formula> <inline-formula><mml:math id="M32" display="inline"><mml:mi mathvariant="normal">m</mml:mi></mml:math></inline-formula></oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

      <fig id="F1" specific-use="star"><label>Figure 1</label><caption><p id="d2e822">Dynamic modeling configuration (left) and equivalent mass distribution (right).</p></caption>
        <graphic xlink:href="https://ms.copernicus.org/articles/17/713/2026/ms-17-713-2026-f01.png"/>

      </fig>

      <p id="d2e832">The following assumptions are adopted: <list list-type="bullet"><list-item>
      <p id="d2e837"><bold>Item 1.</bold> Only the motion of the wheelchair system in the longitudinal plane is considered, while yaw, roll, and left–right asymmetry are neglected.</p></list-item><list-item>
      <p id="d2e843"><bold>Item 2.</bold> The two driving wheels are assumed to have identical structural and inertial parameters.</p></list-item><list-item>
      <p id="d2e849"><bold>Item 3.</bold> Pure rolling without slipping is assumed between the driving wheels and the ground.</p></list-item><list-item>
      <p id="d2e855"><bold>Item 4.</bold> The relative posture between the wheelchair body and the occupant is assumed unchanged and is treated as a rigidly connected whole.</p></list-item><list-item>
      <p id="d2e861"><bold>Item 5.</bold> The effects of tire elastic deformation and local ground unevenness are neglected.</p></list-item></list> The above assumptions are adopted to obtain a tractable reduced-order model for real-time controller design. Therefore, the proposed model mainly describes longitudinal balance recovery and pitch stabilization during straight-line motion. Yaw, roll, lateral motion, tire deformation, wheel slip, and active occupant motion are not explicitly considered. The rigid-body assumption between the wheelchair and the occupant is reasonable when the occupant maintains a relatively fixed seated posture, but it may introduce modeling errors when the occupant posture or mass distribution changes. In addition, friction and external forces are not included in the nominal prediction model but are treated as unmodeled dynamics and external disturbances. Their influence is further evaluated through parameter-variation and disturbance-rejection simulations.</p>
      <p id="d2e867">The two driving wheels are connected by a light linkage, and the total mass of the system is represented by an equivalent concentrated mass. This equivalent mass is connected to the midpoint of the two wheels. These uncertainties are further investigated in the robustness tests (Dai et al., 2015).</p>
<sec id="Ch1.S2.SS1">
  <label>2.1</label><title>Determination of the overall center of mass</title>
      <p id="d2e877">The equivalent pendulum-body mass of the upper structure is defined as

            <disp-formula id="Ch1.E1" content-type="numbered"><label>1</label><mml:math id="M33" display="block"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">h</mml:mi></mml:msub><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          The total mass of the system consists of the wheelchair body, excluding the two driving wheels, and the occupant mass. The overall center of mass of the wheelchair–occupant system is determined by mass-weighted averaging:

            <disp-formula id="Ch1.E2" content-type="numbered"><label>2</label><mml:math id="M34" display="block"><mml:mrow><mml:mfenced open="{" close=""><mml:mtable class="aligned" rowspacing="5.690551pt" columnspacing="1em" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">h</mml:mi></mml:msub><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">h</mml:mi></mml:msub></mml:mrow><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">h</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi>z</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub><mml:msub><mml:mi>z</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">h</mml:mi></mml:msub><mml:msub><mml:mi>z</mml:mi><mml:mi mathvariant="normal">h</mml:mi></mml:msub></mml:mrow><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">h</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mrow></mml:math></disp-formula>

          where <inline-formula><mml:math id="M35" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>z</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M36" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">h</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>z</mml:mi><mml:mi mathvariant="normal">h</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> denote the center-of-mass coordinates of the wheelchair body and the occupant, respectively, and <inline-formula><mml:math id="M37" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>z</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> denotes the overall center-of-mass coordinates of the wheelchair–occupant system.</p>
</sec>
<sec id="Ch1.S2.SS2">
  <label>2.2</label><title>Unconstrained dynamic modeling</title>
      <p id="d2e1097">The total kinetic energy of the system consists of the translational and rotational kinetic energy of the equivalent upper body <inline-formula><mml:math id="M38" display="inline"><mml:mrow><mml:msub><mml:mi>T</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and the two driving wheels <inline-formula><mml:math id="M39" display="inline"><mml:mrow><mml:msub><mml:mi>T</mml:mi><mml:mi mathvariant="italic">ω</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>:

                <disp-formula specific-use="align" content-type="numbered"><mml:math id="M40" display="block"><mml:mtable rowspacing="5.690551pt" displaystyle="true"><mml:mlabeledtr id="Ch1.E3"><mml:mtd><mml:mtext>3</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi>T</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:msubsup><mml:mi>v</mml:mi><mml:mi mathvariant="normal">p</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle><mml:msub><mml:mi>J</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:msup><mml:mover accent="true"><mml:mi mathvariant="italic">θ</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E4"><mml:mtd><mml:mtext>4</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi>T</mml:mi><mml:mi mathvariant="italic">ω</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mfenced open="(" close=")"><mml:mrow><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="italic">ω</mml:mi></mml:msub><mml:msup><mml:mover accent="true"><mml:mi>y</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mrow><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msup><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle><mml:msub><mml:mi>J</mml:mi><mml:mi mathvariant="italic">ω</mml:mi></mml:msub><mml:msup><mml:mover accent="true"><mml:mi mathvariant="italic">α</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mrow><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:mfenced><mml:mo>.</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula>

          where <inline-formula><mml:math id="M41" display="inline"><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the translational velocity of the equivalent upper-pendulum body, and <inline-formula><mml:math id="M42" display="inline"><mml:mover accent="true"><mml:mi mathvariant="italic">α</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover></mml:math></inline-formula> denotes the common angular velocity of the two driving wheels under straight-line motion, namely <inline-formula><mml:math id="M43" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">α</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mi>r</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">α</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mi>l</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mover accent="true"><mml:mi mathvariant="italic">α</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover></mml:mrow></mml:math></inline-formula>. The potential energy is determined mainly by the gravitational position of the equivalent upper body:

            <disp-formula id="Ch1.E5" content-type="numbered"><label>5</label><mml:math id="M44" display="block"><mml:mrow><mml:mi>V</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mi>g</mml:mi><mml:mi>L</mml:mi><mml:mi>cos⁡</mml:mi><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          and the Lagrangian is

            <disp-formula id="Ch1.E6" content-type="numbered"><label>6</label><mml:math id="M45" display="block"><mml:mrow><mml:mi mathvariant="script">L</mml:mi><mml:mo>=</mml:mo><mml:mi>T</mml:mi><mml:mo>-</mml:mo><mml:mi>V</mml:mi><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          Substituting the above expressions into the Lagrange equations yields

            <disp-formula id="Ch1.E7" content-type="numbered"><label>7</label><mml:math id="M46" display="block"><mml:mrow><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi mathvariant="normal">d</mml:mi><mml:mrow><mml:mi mathvariant="normal">d</mml:mi><mml:mi>t</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:mfenced open="(" close=")"><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mo>∂</mml:mo><mml:mi mathvariant="script">L</mml:mi></mml:mrow><mml:mrow><mml:mo>∂</mml:mo><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover></mml:mrow></mml:mfrac></mml:mstyle></mml:mfenced><mml:mo>-</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mo>∂</mml:mo><mml:mi mathvariant="script">L</mml:mi></mml:mrow><mml:mrow><mml:mo>∂</mml:mo><mml:mi>q</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>=</mml:mo><mml:mi mathvariant="script">Q</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where <inline-formula><mml:math id="M47" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>=</mml:mo><mml:mo>[</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi mathvariant="normal">l</mml:mi></mml:msub><mml:msup><mml:mo>]</mml:mo><mml:mi mathvariant="normal">T</mml:mi></mml:msup></mml:mrow></mml:math></inline-formula> is the generalized coordinate vector, and <inline-formula><mml:math id="M48" display="inline"><mml:mi mathvariant="script">Q</mml:mi></mml:math></inline-formula> denotes the generalized force vector. For convenience in subsequent analysis, the unconstrained nonlinear dynamics can be written in the compact form

            <disp-formula id="Ch1.E8" content-type="numbered"><label>8</label><mml:math id="M49" display="block"><mml:mrow><mml:mi>M</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">¨</mml:mo></mml:mover><mml:mo>+</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>)</mml:mo><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>+</mml:mo><mml:mi>G</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="bold">B</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi>u</mml:mi><mml:mo>+</mml:mo><mml:msubsup><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="normal">c</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msubsup><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi mathvariant="italic">λ</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where <inline-formula><mml:math id="M50" display="inline"><mml:mi>u</mml:mi></mml:math></inline-formula> denotes the single-wheel driving torque under symmetric actuation, with <inline-formula><mml:math id="M51" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">τ</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">τ</mml:mi><mml:mi mathvariant="normal">l</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi>u</mml:mi></mml:mrow></mml:math></inline-formula>. Therefore, the total longitudinal driving force generated by the two wheels is <inline-formula><mml:math id="M52" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mi mathvariant="italic">τ</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="italic">τ</mml:mi><mml:mi mathvariant="normal">l</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:mo>/</mml:mo><mml:mi>r</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mi>u</mml:mi><mml:mo>/</mml:mo><mml:mi>r</mml:mi></mml:mrow></mml:math></inline-formula>. <inline-formula><mml:math id="M53" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is the nonholonomic constraint matrix, <inline-formula><mml:math id="M54" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">B</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is the dynamic input matrix, and <inline-formula><mml:math id="M55" display="inline"><mml:mi mathvariant="italic">λ</mml:mi></mml:math></inline-formula> denotes the Lagrange multipliers associated with the wheel–ground motion constraints.</p>
</sec>
<sec id="Ch1.S2.SS3">
  <label>2.3</label><title>Nonholonomic constraint equations and model reduction</title>
      <p id="d2e1654">Due to the pure rolling assumption of the two driving wheels, the wheel–ground motion constraints can be written as

            <disp-formula id="Ch1.E9" content-type="numbered"><label>9</label><mml:math id="M56" display="block"><mml:mrow><mml:mfenced close="" open="{"><mml:mtable class="aligned" rowspacing="-2.845276pt" columnspacing="1em" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mi>y</mml:mi><mml:mo>-</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi>r</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle><mml:mo>(</mml:mo><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi mathvariant="normal">l</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi mathvariant="normal">l</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mrow></mml:math></disp-formula>

          where <inline-formula><mml:math id="M57" display="inline"><mml:mi>y</mml:mi></mml:math></inline-formula> denotes the longitudinal displacement of the wheelchair body; <inline-formula><mml:math id="M58" display="inline"><mml:mi>r</mml:mi></mml:math></inline-formula> is the wheel radius; and <inline-formula><mml:math id="M59" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M60" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi mathvariant="normal">l</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> are the angular displacements of the right and left wheels, respectively.</p>
      <p id="d2e1765">Taking the time derivative of Eq. (<xref ref-type="disp-formula" rid="Ch1.E9"/>), the velocity-level nonholonomic constraints are obtained as

            <disp-formula id="Ch1.E10" content-type="numbered"><label>10</label><mml:math id="M61" display="block"><mml:mrow><mml:mfenced close="" open="{"><mml:mtable columnspacing="1em" class="aligned" rowspacing="-2.845276pt" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mover accent="true"><mml:mi>y</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>-</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi>r</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle><mml:mo>(</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">α</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mi>r</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">α</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mi>l</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">α</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mi>r</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">α</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mi>l</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mrow></mml:math></disp-formula>

          Let the full generalized coordinate vector be defined as

            <disp-formula id="Ch1.E11" content-type="numbered"><label>11</label><mml:math id="M62" display="block"><mml:mrow><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mfenced open="[" close="]"><mml:mtable class="matrix" columnalign="center center center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mi>y</mml:mi></mml:mtd><mml:mtd><mml:mi mathvariant="italic">θ</mml:mi></mml:mtd><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi mathvariant="normal">l</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          Then Eq. (<xref ref-type="disp-formula" rid="Ch1.E10"/>) can be expressed in matrix form as

            <disp-formula id="Ch1.E12" content-type="numbered"><label>12</label><mml:math id="M63" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where the constraint Jacobian is

            <disp-formula id="Ch1.E13" content-type="numbered"><label>13</label><mml:math id="M64" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mfenced close="]" open="["><mml:mtable class="matrix" rowspacing="5.690551pt" columnalign="center center center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mn mathvariant="normal">1</mml:mn></mml:mtd><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd><mml:mtd><mml:mrow><mml:mo>-</mml:mo><mml:mstyle displaystyle="false"><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mi>r</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle></mml:mstyle></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>-</mml:mo><mml:mstyle displaystyle="false"><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mi>r</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle></mml:mstyle></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd><mml:mtd><mml:mn mathvariant="normal">1</mml:mn></mml:mtd><mml:mtd><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
      <p id="d2e1993">Before eliminating the constraint forces, the constrained Lagrange equations can generally be written as

            <disp-formula id="Ch1.E14" content-type="numbered"><label>14</label><mml:math id="M65" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="bold">M</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">¨</mml:mo></mml:mover><mml:mo>+</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>)</mml:mo><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>+</mml:mo><mml:msub><mml:mi>G</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="bold">B</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi>u</mml:mi><mml:mo>+</mml:mo><mml:msubsup><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="normal">c</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msubsup><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi mathvariant="bold-italic">λ</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where <inline-formula><mml:math id="M66" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">M</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is the full mass matrix, <inline-formula><mml:math id="M67" display="inline"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>)</mml:mo><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover></mml:mrow></mml:math></inline-formula> denotes the Coriolis and centrifugal terms, <inline-formula><mml:math id="M68" display="inline"><mml:mrow><mml:msub><mml:mi>G</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is the gravitational term, and <inline-formula><mml:math id="M69" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">B</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is the full input distribution matrix. The input <inline-formula><mml:math id="M70" display="inline"><mml:mi>u</mml:mi></mml:math></inline-formula> denotes the single-wheel driving torque under symmetric actuation, namely <inline-formula><mml:math id="M71" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">τ</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">τ</mml:mi><mml:mi mathvariant="normal">l</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi>u</mml:mi></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M72" display="inline"><mml:mi mathvariant="bold-italic">λ</mml:mi></mml:math></inline-formula> is the vector of Lagrange multipliers associated with the rolling constraints.</p>
      <p id="d2e2209">To avoid explicitly solving the constraint reaction forces in the control model, a null-space projection method is employed. The following derivation gives the projection procedure used to eliminate the Lagrange multipliers and obtain the reduced-order dynamics. Let <inline-formula><mml:math id="M73" display="inline"><mml:mrow><mml:mi mathvariant="bold">S</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> be a basis matrix of the null space of <inline-formula><mml:math id="M74" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>, satisfying

            <disp-formula id="Ch1.E15" content-type="numbered"><label>15</label><mml:math id="M75" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi mathvariant="bold">S</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          For straight-line symmetric motion, the independent velocity vector is selected as

            <disp-formula id="Ch1.E16" content-type="numbered"><label>16</label><mml:math id="M76" display="block"><mml:mrow><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mfenced close="]" open="["><mml:mtable class="matrix" columnalign="center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mi>y</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover></mml:mtd><mml:mtd><mml:mover accent="true"><mml:mi mathvariant="italic">θ</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          The full generalized velocity can then be parameterized as

            <disp-formula id="Ch1.E17" content-type="numbered"><label>17</label><mml:math id="M77" display="block"><mml:mrow><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mi mathvariant="bold">S</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi>v</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where

            <disp-formula id="Ch1.E18" content-type="numbered"><label>18</label><mml:math id="M78" display="block"><mml:mrow><mml:mi mathvariant="bold">S</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mfenced open="[" close="]"><mml:mtable rowspacing="0.2ex 0.2ex 2.845276pt" class="matrix" columnalign="center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mn mathvariant="normal">1</mml:mn></mml:mtd><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd><mml:mtd><mml:mn mathvariant="normal">1</mml:mn></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mstyle displaystyle="false"><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mn mathvariant="normal">1</mml:mn><mml:mi>r</mml:mi></mml:mfrac></mml:mstyle></mml:mstyle></mml:mtd><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mstyle displaystyle="false"><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mn mathvariant="normal">1</mml:mn><mml:mi>r</mml:mi></mml:mfrac></mml:mstyle></mml:mstyle></mml:mtd><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          It can be verified from Eqs. (<xref ref-type="disp-formula" rid="Ch1.E13"/>) and (<xref ref-type="disp-formula" rid="Ch1.E18"/>) that

            <disp-formula id="Ch1.E19" content-type="numbered"><label>19</label><mml:math id="M79" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="bold">A</mml:mi><mml:mi>c</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi mathvariant="bold">S</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          which indicates that all generalized velocities generated by <inline-formula><mml:math id="M80" display="inline"><mml:mrow><mml:mi mathvariant="bold">S</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi>v</mml:mi></mml:mrow></mml:math></inline-formula> automatically satisfy the nonholonomic rolling constraints.</p>
      <p id="d2e2440">Taking the time derivative of Eq. (<xref ref-type="disp-formula" rid="Ch1.E17"/>) gives

            <disp-formula id="Ch1.E20" content-type="numbered"><label>20</label><mml:math id="M81" display="block"><mml:mrow><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">¨</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mi mathvariant="bold">S</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mover accent="true"><mml:mi>v</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>+</mml:mo><mml:mover accent="true"><mml:mi>S</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi>v</mml:mi><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          Substituting Eqs. (<xref ref-type="disp-formula" rid="Ch1.E17"/>) and (<xref ref-type="disp-formula" rid="Ch1.E20"/>) into Eq. (<xref ref-type="disp-formula" rid="Ch1.E14"/>) yields

            <disp-formula id="Ch1.E21" content-type="numbered"><label>21</label><mml:math id="M82" display="block"><mml:mtable rowspacing="0.2ex" class="split" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="bold">M</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mfenced open="[" close="]"><mml:mrow><mml:mi mathvariant="bold">S</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mover accent="true"><mml:mi>v</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>+</mml:mo><mml:mover accent="true"><mml:mi>S</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi>v</mml:mi></mml:mrow></mml:mfenced></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>+</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>)</mml:mo><mml:mi mathvariant="bold">S</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi>v</mml:mi><mml:mo>+</mml:mo><mml:msub><mml:mi>G</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="bold">B</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi>u</mml:mi><mml:mo>+</mml:mo><mml:msubsup><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="normal">c</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msubsup><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi mathvariant="italic">λ</mml:mi><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>

          Premultiplying both sides of Eq. (<xref ref-type="disp-formula" rid="Ch1.E21"/>) by <inline-formula><mml:math id="M83" display="inline"><mml:mrow><mml:msup><mml:mi>S</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> gives

            <disp-formula id="Ch1.E22" content-type="numbered"><label>22</label><mml:math id="M84" display="block"><mml:mtable rowspacing="0.2ex" class="split" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:msup><mml:mi>S</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:msub><mml:mi mathvariant="bold">M</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mi>S</mml:mi><mml:mover accent="true"><mml:mi>v</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>+</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi mathvariant="bold">M</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mover accent="true"><mml:mi>S</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>+</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mi>S</mml:mi></mml:mrow></mml:mfenced><mml:mi>v</mml:mi><mml:mo>+</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:msub><mml:mi>G</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mo>=</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:msub><mml:mi mathvariant="bold">B</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mi>u</mml:mi><mml:mo>+</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:msubsup><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="normal">c</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msubsup><mml:mi mathvariant="italic">λ</mml:mi><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>

          According to Eq. (<xref ref-type="disp-formula" rid="Ch1.E15"/>),

            <disp-formula id="Ch1.E23" content-type="numbered"><label>23</label><mml:math id="M85" display="block"><mml:mrow><mml:msup><mml:mi>S</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:msubsup><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="normal">c</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msubsup><mml:mo>=</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub><mml:mi mathvariant="bold">S</mml:mi><mml:msup><mml:mo>)</mml:mo><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          Therefore, the term containing the Lagrange multipliers is eliminated by the null-space projection, and the reduced-order dynamic model can be written as

            <disp-formula id="Ch1.E24" content-type="numbered"><label>24</label><mml:math id="M86" display="block"><mml:mrow><mml:msub><mml:mi>M</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mover accent="true"><mml:mi>v</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>+</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mi>v</mml:mi><mml:mo>)</mml:mo><mml:mi>v</mml:mi><mml:mo>+</mml:mo><mml:msub><mml:mi>G</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msub><mml:mi>B</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi>u</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where

            <disp-formula id="Ch1.E25" content-type="numbered"><label>25</label><mml:math id="M87" display="block"><mml:mrow><mml:mfenced open="{" close=""><mml:mtable columnspacing="1em" rowspacing="0.2ex" class="aligned" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi>M</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>=</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:msub><mml:mi mathvariant="bold">M</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi>S</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mi>v</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>=</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mfenced open="[" close="]"><mml:mrow><mml:msub><mml:mi mathvariant="bold">M</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mover accent="true"><mml:mi>S</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mo>+</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi>f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>)</mml:mo><mml:mi>S</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msub><mml:mi>G</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:msub><mml:mi>G</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msub><mml:mi>B</mml:mi><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>=</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:msub><mml:mi mathvariant="bold">B</mml:mi><mml:mi mathvariant="normal">f</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mrow></mml:math></disp-formula>

          Since <inline-formula><mml:math id="M88" display="inline"><mml:mrow><mml:mi mathvariant="bold">S</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> in Eq. (<xref ref-type="disp-formula" rid="Ch1.E18"/>) is constant for the present longitudinal rolling model, <inline-formula><mml:math id="M89" display="inline"><mml:mrow><mml:mover accent="true"><mml:mi>S</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:math></inline-formula>.</p>
      <p id="d2e3148">For the reduced longitudinal balance model, Eq. (<xref ref-type="disp-formula" rid="Ch1.E24"/>) can be further expressed as

            <disp-formula id="Ch1.E26" content-type="numbered"><label>26</label><mml:math id="M90" display="block"><mml:mrow><mml:mi>M</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mover accent="true"><mml:mi>v</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>+</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mi>v</mml:mi><mml:mo>)</mml:mo><mml:mi>v</mml:mi><mml:mo>+</mml:mo><mml:mi>G</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msub><mml:mi>B</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi>u</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where

            <disp-formula id="Ch1.E27" content-type="numbered"><label>27</label><mml:math id="M91" display="block"><mml:mrow><mml:mi>v</mml:mi><mml:mo>=</mml:mo><mml:mfenced close="]" open="["><mml:mtable class="matrix" columnalign="center" framespacing="0em"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mi>y</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mi mathvariant="italic">θ</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          The reduced matrices are given by

            <disp-formula id="Ch1.E28" content-type="numbered"><label>28</label><mml:math id="M92" display="block"><mml:mrow><mml:mfenced open="{" close=""><mml:mtable class="aligned" rowspacing="8.535827pt 8.535827pt 8.535827pt" columnspacing="1em" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mi>M</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mfenced close="]" open="["><mml:mtable class="matrix" rowspacing="5.690551pt" columnalign="center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="italic">ω</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mfrac><mml:mrow><mml:mn mathvariant="normal">2</mml:mn><mml:msub><mml:mi>J</mml:mi><mml:mi mathvariant="italic">ω</mml:mi></mml:msub></mml:mrow><mml:mrow><mml:msup><mml:mi>r</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:mfrac></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mi>L</mml:mi><mml:mi>cos⁡</mml:mi><mml:mi mathvariant="italic">θ</mml:mi></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mi>L</mml:mi><mml:mi>cos⁡</mml:mi><mml:mi mathvariant="italic">θ</mml:mi></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:msub><mml:mi>J</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mi>v</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mfenced open="[" close="]"><mml:mtable class="matrix" columnalign="center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd><mml:mtd><mml:mrow><mml:mo>-</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mi>L</mml:mi><mml:mi>sin⁡</mml:mi><mml:mi mathvariant="italic">θ</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mover accent="true"><mml:mi mathvariant="italic">θ</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mi>G</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mfenced close="]" open="["><mml:mtable class="matrix" columnalign="center" framespacing="0em"><mml:mtr><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mo>-</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mi>g</mml:mi><mml:mi>L</mml:mi><mml:mi>sin⁡</mml:mi><mml:mi mathvariant="italic">θ</mml:mi></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msub><mml:mi>B</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>=</mml:mo><mml:mfenced open="[" close="]"><mml:mtable class="matrix" columnalign="center" framespacing="0em"><mml:mtr><mml:mtd><mml:mfrac><mml:mn mathvariant="normal">2</mml:mn><mml:mi>r</mml:mi></mml:mfrac></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow/></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mrow></mml:math></disp-formula>

          Here, <inline-formula><mml:math id="M93" display="inline"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> denotes the equivalent mass of the wheelchair–occupant body, <inline-formula><mml:math id="M94" display="inline"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="italic">ω</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> denotes the mass of a single wheel, <inline-formula><mml:math id="M95" display="inline"><mml:mrow><mml:msub><mml:mi>J</mml:mi><mml:mi mathvariant="italic">ω</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the wheel moment of inertia, <inline-formula><mml:math id="M96" display="inline"><mml:mrow><mml:msub><mml:mi>J</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the pitch moment of inertia of the wheelchair–occupant body, <inline-formula><mml:math id="M97" display="inline"><mml:mi>L</mml:mi></mml:math></inline-formula> is the distance from the wheel axle to the equivalent center of mass, and <inline-formula><mml:math id="M98" display="inline"><mml:mi>g</mml:mi></mml:math></inline-formula> is the gravitational acceleration.</p>
      <p id="d2e3553">For numerical implementation in the NMPC prediction model and Simulink simulation, Eq. (<xref ref-type="disp-formula" rid="Ch1.E26"/>) is solved explicitly as

            <disp-formula id="Ch1.E29" content-type="numbered"><label>29</label><mml:math id="M99" display="block"><mml:mrow><mml:mover accent="true"><mml:mi>v</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:msup><mml:mi>M</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mfenced close="]" open="["><mml:mrow><mml:msub><mml:mi mathvariant="bold">B</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo><mml:mi>u</mml:mi><mml:mo>-</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mi>v</mml:mi><mml:mo>)</mml:mo><mml:mi>v</mml:mi><mml:mo>-</mml:mo><mml:mi>G</mml:mi><mml:mo>(</mml:mo><mml:mi>q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          Let

            <disp-formula id="Ch1.E30" content-type="numbered"><label>30</label><mml:math id="M100" display="block"><mml:mrow><mml:mfenced close="" open="{"><mml:mtable columnspacing="1em" rowspacing="0.2ex" class="aligned" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi>M</mml:mi><mml:mn mathvariant="normal">11</mml:mn></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="italic">ω</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mn mathvariant="normal">2</mml:mn><mml:msub><mml:mi>J</mml:mi><mml:mi mathvariant="italic">ω</mml:mi></mml:msub></mml:mrow><mml:mrow><mml:msup><mml:mi>r</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi>M</mml:mi><mml:mn mathvariant="normal">12</mml:mn></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>=</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mi>L</mml:mi><mml:mi>cos⁡</mml:mi><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msub><mml:mi>M</mml:mi><mml:mn mathvariant="normal">22</mml:mn></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>=</mml:mo><mml:msub><mml:mi>J</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>M</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>=</mml:mo><mml:msub><mml:mi>M</mml:mi><mml:mn mathvariant="normal">11</mml:mn></mml:msub><mml:msub><mml:mi>M</mml:mi><mml:mn mathvariant="normal">22</mml:mn></mml:msub><mml:mo>-</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mn mathvariant="normal">12</mml:mn><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mrow></mml:math></disp-formula>

          Then the longitudinal acceleration and pitch angular acceleration are obtained as

            <disp-formula id="Ch1.E31" content-type="numbered"><label>31</label><mml:math id="M101" display="block"><mml:mrow><mml:mfenced close="" open="{"><mml:mtable columnspacing="1em" class="aligned" rowspacing="8.535827pt" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mover accent="true"><mml:mi>y</mml:mi><mml:mo mathvariant="normal">¨</mml:mo></mml:mover></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi>M</mml:mi><mml:mn mathvariant="normal">22</mml:mn></mml:msub><mml:mfenced close=")" open="("><mml:mrow><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mrow><mml:mn mathvariant="normal">2</mml:mn><mml:mi>u</mml:mi></mml:mrow><mml:mi>r</mml:mi></mml:mfrac></mml:mstyle><mml:mo>+</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mi>L</mml:mi><mml:mi>sin⁡</mml:mi><mml:mi mathvariant="italic">θ</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mover accent="true"><mml:mi mathvariant="italic">θ</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:mfenced><mml:mo>-</mml:mo><mml:msub><mml:mi>M</mml:mi><mml:mn mathvariant="normal">12</mml:mn></mml:msub><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mi>g</mml:mi><mml:mi>L</mml:mi><mml:mi>sin⁡</mml:mi><mml:mi mathvariant="italic">θ</mml:mi></mml:mrow></mml:mfenced></mml:mrow><mml:mrow><mml:msub><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>M</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mover accent="true"><mml:mi mathvariant="italic">θ</mml:mi><mml:mo mathvariant="normal">¨</mml:mo></mml:mover></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mo>-</mml:mo><mml:msub><mml:mi>M</mml:mi><mml:mn mathvariant="normal">12</mml:mn></mml:msub><mml:mfenced close=")" open="("><mml:mrow><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mrow><mml:mn mathvariant="normal">2</mml:mn><mml:mi>u</mml:mi></mml:mrow><mml:mi>r</mml:mi></mml:mfrac></mml:mstyle><mml:mo>+</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mi>L</mml:mi><mml:mi>sin⁡</mml:mi><mml:mi mathvariant="italic">θ</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mover accent="true"><mml:mi mathvariant="italic">θ</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:mfenced><mml:mo>+</mml:mo><mml:msub><mml:mi>M</mml:mi><mml:mn mathvariant="normal">11</mml:mn></mml:msub><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mi>g</mml:mi><mml:mi>L</mml:mi><mml:mi>sin⁡</mml:mi><mml:mi mathvariant="italic">θ</mml:mi></mml:mrow></mml:mfenced></mml:mrow><mml:mrow><mml:msub><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>M</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mrow></mml:math></disp-formula></p>
      <p id="d2e3964">For the balance control problem, the state vector is selected as

            <disp-formula id="Ch1.E32" content-type="numbered"><label>32</label><mml:math id="M102" display="block"><mml:mrow><mml:mi>x</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mfenced close="]" open="["><mml:mtable class="matrix" columnalign="center center center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mi>y</mml:mi></mml:mtd><mml:mtd><mml:mi mathvariant="italic">θ</mml:mi></mml:mtd><mml:mtd><mml:mover accent="true"><mml:mi>y</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover></mml:mtd><mml:mtd><mml:mover accent="true"><mml:mi mathvariant="italic">θ</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          The nonlinear state-space model used in the controller design is then written as

            <disp-formula id="Ch1.E33" content-type="numbered"><label>33</label><mml:math id="M103" display="block"><mml:mrow><mml:mover accent="true"><mml:mi>x</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mi>f</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>u</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mfenced open="[" close="]"><mml:mtable class="matrix" columnalign="center" framespacing="0em"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mi>y</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mi mathvariant="italic">θ</mml:mi><mml:mo mathvariant="normal">˙</mml:mo></mml:mover></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mi>y</mml:mi><mml:mo mathvariant="normal">¨</mml:mo></mml:mover></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mi mathvariant="italic">θ</mml:mi><mml:mo mathvariant="normal">¨</mml:mo></mml:mover></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
</sec>
</sec>
<sec id="Ch1.S3">
  <label>3</label><title>Hybrid NMPC–LQR control method</title>
<sec id="Ch1.S3.SS1">
  <label>3.1</label><title>Overall construction of the control method</title>
      <p id="d2e4077">The hybrid controller is designed to address the online optimization problem in self-balancing control. The controller provides the driving torque command to the PD-actuated system. It consists of two components, namely an NMPC controller and an LQR controller. When the tilt angle exceeds the predefined switching threshold <inline-formula><mml:math id="M104" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">sw</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, the NMPC controller is activated to cope with the nonlinear operating condition. In the controller design, <inline-formula><mml:math id="M105" display="inline"><mml:mi>u</mml:mi></mml:math></inline-formula> denotes the single-wheel torque command, and the same command is applied to the left and right wheels under straight-line symmetric motion. Once the tilt angle falls below the switching threshold, the control law is switched to the LQR controller:

            <disp-formula id="Ch1.E34" content-type="numbered"><label>34</label><mml:math id="M106" display="block"><mml:mrow><mml:mi>u</mml:mi><mml:mo>=</mml:mo><mml:mfenced open="{" close=""><mml:mtable rowspacing="0.2ex" class="cases" columnspacing="1em" columnalign="left left" framespacing="0em"><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">NMPC</mml:mi></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>|</mml:mo><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>|</mml:mo><mml:mo>≥</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">sw</mml:mi></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">LQR</mml:mi></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>|</mml:mo><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>|</mml:mo><mml:mo>&lt;</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">sw</mml:mi></mml:msub><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mrow></mml:math></disp-formula>

          The overall hybrid control architecture is illustrated in Fig. <xref ref-type="fig" rid="F2"/>.</p>

      <fig id="F2" specific-use="star"><label>Figure 2</label><caption><p id="d2e4168">Overall hybrid NMPC–LQR control framework for the self-balancing wheelchair.</p></caption>
          <graphic xlink:href="https://ms.copernicus.org/articles/17/713/2026/ms-17-713-2026-f02.png"/>

        </fig>

</sec>
<sec id="Ch1.S3.SS2">
  <label>3.2</label><title>LQR controller design</title>
      <p id="d2e4185">The LQR controller is used for local stabilization when the system approaches the equilibrium point. Based on the linearized state-space model and with reference to Chacko and Abraham (2023), the cost function of the LQR controller is constructed as

            <disp-formula id="Ch1.E35" content-type="numbered"><label>35</label><mml:math id="M107" display="block"><mml:mrow><mml:msub><mml:mi>J</mml:mi><mml:mi mathvariant="normal">LQR</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:munderover><mml:mo movablelimits="false">∫</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mi mathvariant="normal">∞</mml:mi></mml:munderover><mml:mfenced close="]" open="["><mml:mrow><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>-</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">ref</mml:mi></mml:msub><mml:msup><mml:mo>)</mml:mo><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:msub><mml:mi mathvariant="bold">Q</mml:mi><mml:mi>L</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>-</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">ref</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:mo>+</mml:mo><mml:msup><mml:mi>u</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:msub><mml:mi mathvariant="bold">R</mml:mi><mml:mi>L</mml:mi></mml:msub><mml:mi>u</mml:mi></mml:mrow></mml:mfenced><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mi mathvariant="normal">d</mml:mi><mml:mi>t</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where <inline-formula><mml:math id="M108" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">Q</mml:mi><mml:mi>L</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M109" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">R</mml:mi><mml:mi>L</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> are the weighting matrices for the state error and the control input, respectively. They are selected as

            <disp-formula id="Ch1.E36" content-type="numbered"><label>36</label><mml:math id="M110" display="block"><mml:mrow><mml:mfenced open="{" close=""><mml:mtable rowspacing="5.690551pt" class="aligned" columnspacing="1em" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi mathvariant="bold">Q</mml:mi><mml:mi>L</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mi mathvariant="normal">diag</mml:mi><mml:mo>(</mml:mo><mml:mn mathvariant="normal">20</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">200</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">20</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">50</mml:mn><mml:mo>)</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi mathvariant="bold">R</mml:mi><mml:mi>L</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mrow></mml:math></disp-formula>

          By solving the algebraic Riccati equation, the optimal feedback gain matrix is obtained, and the LQR control law becomes

            <disp-formula id="Ch1.E37" content-type="numbered"><label>37</label><mml:math id="M111" display="block"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">LQR</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mi mathvariant="bold">K</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>-</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mi mathvariant="normal">ref</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where <inline-formula><mml:math id="M112" display="inline"><mml:mi mathvariant="bold">K</mml:mi></mml:math></inline-formula> is the LQR feedback gain matrix and <inline-formula><mml:math id="M113" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mi mathvariant="normal">ref</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> denotes the reference state vector.</p>
</sec>
<sec id="Ch1.S3.SS3">
  <label>3.3</label><title>NMPC controller design</title>
      <p id="d2e4410">The NMPC controller is employed to address the highly nonlinear behavior of the system. When the tilt angle of the wheelchair exceeds the switching threshold, the NMPC controller is activated. At each control update, an optimal control sequence over a finite prediction horizon is solved online on the basis of the current system state and the nonlinear dynamic model. Only the first control input is then applied to the system, thereby forming a receding-horizon optimization framework.</p>
      <p id="d2e4413">With the state at the <inline-formula><mml:math id="M114" display="inline"><mml:mi>k</mml:mi></mml:math></inline-formula>th sampling instant, prediction horizon <inline-formula><mml:math id="M115" display="inline"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, and sampling time defined, the finite-horizon objective function is written as

            <disp-formula id="Ch1.E38" content-type="numbered"><label>38</label><mml:math id="M116" display="block"><mml:mtable class="split" rowspacing="0.2ex" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>J</mml:mi><mml:mi mathvariant="normal">NMPC</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>=</mml:mo><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>i</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:munderover><mml:mfenced close="" open="["><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">ref</mml:mi></mml:msub><mml:msup><mml:mo>)</mml:mo><mml:mi mathvariant="normal">T</mml:mi></mml:msup><mml:msub><mml:mi>Q</mml:mi><mml:mi>n</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">ref</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mfenced close="]" open=""><mml:mrow><mml:mo>+</mml:mo><mml:msubsup><mml:mi>u</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mi>i</mml:mi></mml:mrow><mml:mi mathvariant="normal">T</mml:mi></mml:msubsup><mml:msub><mml:mi>R</mml:mi><mml:mi>n</mml:mi></mml:msub><mml:msub><mml:mi>u</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>

          where <inline-formula><mml:math id="M117" display="inline"><mml:mi>k</mml:mi></mml:math></inline-formula> is the current sampling instant, <inline-formula><mml:math id="M118" display="inline"><mml:mi>i</mml:mi></mml:math></inline-formula> is the prediction-step index, <inline-formula><mml:math id="M119" display="inline"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the prediction horizon, and <inline-formula><mml:math id="M120" display="inline"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> is the predicted equivalent torque input at the <inline-formula><mml:math id="M121" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mi>i</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>th step. The weighting matrices are selected by prioritizing attitude safety. Larger weights are assigned to the pitch angle and pitch angular velocity, while the input term penalizes excessive wheel torque:

            <disp-formula id="Ch1.E39" content-type="numbered"><label>39</label><mml:math id="M122" display="block"><mml:mrow><mml:mfenced open="{" close=""><mml:mtable rowspacing="5.690551pt" class="aligned" columnspacing="1em" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msub><mml:mi>Q</mml:mi><mml:mi>n</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mi mathvariant="normal">diag</mml:mi><mml:mo>(</mml:mo><mml:mn mathvariant="normal">500</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">1000</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">50</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">300</mml:mn><mml:mo>)</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msub><mml:mi>R</mml:mi><mml:mi>n</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.1</mml:mn><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mrow></mml:math></disp-formula>

          The nonlinear state equations are directly used as prediction-model constraints, and actuator limits are imposed as input constraints:

            <disp-formula id="Ch1.E40" content-type="numbered"><label>40</label><mml:math id="M123" display="block"><mml:mrow><mml:mfenced close="" open="{"><mml:mtable class="aligned" rowspacing="5.690551pt" columnspacing="1em" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>=</mml:mo><mml:mi>f</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi>u</mml:mi><mml:mo>min⁡</mml:mo></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>≤</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub><mml:mo>≤</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mo>max⁡</mml:mo></mml:msub><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mrow></mml:math></disp-formula>

          Here, <inline-formula><mml:math id="M124" display="inline"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mo>min⁡</mml:mo></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M125" display="inline"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mo>max⁡</mml:mo></mml:msub></mml:mrow></mml:math></inline-formula> are the lower and upper bounds of the single-wheel torque command.</p>
</sec>
<sec id="Ch1.S3.SS4">
  <label>3.4</label><title>Switching-threshold evaluation and parameter sensitivity</title>
      <p id="d2e4807">The switching threshold determines the boundary between the nonlinear recovery stage and the local stabilization stage. According to the switching law in Eq. (<xref ref-type="disp-formula" rid="Ch1.E34"/>), NMPC is activated when <inline-formula><mml:math id="M126" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>|</mml:mo><mml:mo>≥</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">sw</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, whereas LQR is used when <inline-formula><mml:math id="M127" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>|</mml:mo><mml:mo>&lt;</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">sw</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>. Therefore, if the threshold is too small, the NMPC controller remains active until the system is very close to the equilibrium, which increases the computational burden and may delay the use of efficient local regulation. Conversely, if the threshold is too large, the controller may switch to LQR while the system is still in a region with strong nonlinear effects, which may weaken the recovery capability and reduce the validity of the local linear controller. Hence, the switching threshold must be selected by considering both nonlinear recovery and local stabilization performance.</p>
<sec id="Ch1.S3.SS4.SSS1">
  <label>3.4.1</label><title>Determination of the threshold search range</title>
      <p id="d2e4857">Before evaluating the switching threshold, a linearization-error analysis was conducted to determine a reasonable search interval. The nonlinear model and the linearized model were compared under different local angular ranges. The tested ranges were selected as 0.015, 0.030, 0.050, 0.080, 0.100, and 0.150 rad, which correspond to the candidate switching thresholds used in the following evaluation. An additional range of 0.200 rad was included as an outside reference.</p>

      <fig id="F3"><label>Figure 3</label><caption><p id="d2e4862">Linearization mismatch under different angular ranges. The shaded region denotes the selected switching-threshold search interval of 0.015–0.150 rad, while 0.200 rad is used as an outside reference.</p></caption>
            <graphic xlink:href="https://ms.copernicus.org/articles/17/713/2026/ms-17-713-2026-f03.png"/>

          </fig>

      <p id="d2e4871">The results in Fig. <xref ref-type="fig" rid="F3"/> show that the pitch angular–acceleration mismatch increases as the angular range expands. Within the interval of 0.015–0.150 rad, the mismatch increases gradually, whereas a more pronounced increase is observed when the range is enlarged to 0.200 rad. Therefore, the interval of 0.015–0.150 rad is adopted as the switching-threshold search range. It should be noted that the linearization-error analysis is used to determine the candidate range, while the final threshold is selected according to the five-index performance evaluation.</p>
</sec>
<sec id="Ch1.S3.SS4.SSS2">
  <label>3.4.2</label><title>Five-index evaluation under nominal parameters</title>
      <p id="d2e4884">Based on the above search interval, six switching thresholds are selected for simulation tests:

              <disp-formula id="Ch1.Ex1"><mml:math id="M128" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">sw</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.015</mml:mn><mml:mo>,</mml:mo><mml:mspace width="0.33em" linebreak="nobreak"/><mml:mn mathvariant="normal">0.030</mml:mn><mml:mo>,</mml:mo><mml:mspace width="0.33em" linebreak="nobreak"/><mml:mn mathvariant="normal">0.050</mml:mn><mml:mo>,</mml:mo><mml:mspace linebreak="nobreak" width="0.33em"/><mml:mn mathvariant="normal">0.080</mml:mn><mml:mo>,</mml:mo><mml:mspace width="0.33em" linebreak="nobreak"/><mml:mn mathvariant="normal">0.100</mml:mn><mml:mo>,</mml:mo><mml:mspace linebreak="nobreak" width="0.33em"/><mml:mn mathvariant="normal">0.150</mml:mn><mml:mspace linebreak="nobreak" width="0.33em"/><mml:mi mathvariant="normal">rad</mml:mi><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

            Under identical initial conditions, controller parameters, and input constraints, the five performance indices corresponding to each threshold are extracted, as shown in Table <xref ref-type="table" rid="T2"/>.</p>

<table-wrap id="T2" specific-use="star"><label>Table 2</label><caption><p id="d2e4938">Performance indices under different switching thresholds under nominal model parameters.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="6">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="right"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right"/>
     <oasis:colspec colnum="6" colname="col6" align="right"/>
     <oasis:thead>
       <oasis:row>
         <oasis:entry colname="col1">Threshold/</oasis:entry>
         <oasis:entry colname="col2">Settling</oasis:entry>
         <oasis:entry colname="col3">Steady-state</oasis:entry>
         <oasis:entry colname="col4">Steady-state</oasis:entry>
         <oasis:entry colname="col5">Drift rate/</oasis:entry>
         <oasis:entry colname="col6">Max steady-state</oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">rad</oasis:entry>
         <oasis:entry colname="col2">time/s</oasis:entry>
         <oasis:entry colname="col3">error/deg</oasis:entry>
         <oasis:entry colname="col4">SD/deg</oasis:entry>
         <oasis:entry colname="col5">deg s<sup>−1</sup></oasis:entry>
         <oasis:entry colname="col6">deviation/deg</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">0.015</oasis:entry>
         <oasis:entry colname="col2">–</oasis:entry>
         <oasis:entry colname="col3">2.8493</oasis:entry>
         <oasis:entry colname="col4">0.0723</oasis:entry>
         <oasis:entry colname="col5">0.1873</oasis:entry>
         <oasis:entry colname="col6">2.9324</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">0.030</oasis:entry>
         <oasis:entry colname="col2">–</oasis:entry>
         <oasis:entry colname="col3">3.1919</oasis:entry>
         <oasis:entry colname="col4">0.1028</oasis:entry>
         <oasis:entry colname="col5">0.3176</oasis:entry>
         <oasis:entry colname="col6">3.2875</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">0.050</oasis:entry>
         <oasis:entry colname="col2">0.9608</oasis:entry>
         <oasis:entry colname="col3">0.0997</oasis:entry>
         <oasis:entry colname="col4">0.0653</oasis:entry>
         <oasis:entry colname="col5">0.2261</oasis:entry>
         <oasis:entry colname="col6">0.2137</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">0.080</oasis:entry>
         <oasis:entry colname="col2">1.0010</oasis:entry>
         <oasis:entry colname="col3">0.0082</oasis:entry>
         <oasis:entry colname="col4">0.0572</oasis:entry>
         <oasis:entry colname="col5">0.1960</oasis:entry>
         <oasis:entry colname="col6">0.1026</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">0.100</oasis:entry>
         <oasis:entry colname="col2">1.0218</oasis:entry>
         <oasis:entry colname="col3">0.0030</oasis:entry>
         <oasis:entry colname="col4">0.0303</oasis:entry>
         <oasis:entry colname="col5"><inline-formula><mml:math id="M130" display="inline"><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">0.0012</mml:mn></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col6">0.0614</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">0.150</oasis:entry>
         <oasis:entry colname="col2">1.0505</oasis:entry>
         <oasis:entry colname="col3">0.0248</oasis:entry>
         <oasis:entry colname="col4">0.0352</oasis:entry>
         <oasis:entry colname="col5">0.1116</oasis:entry>
         <oasis:entry colname="col6">0.0685</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

      <p id="d2e5161">The min–max normalization method is employed to remove the influence of different physical dimensions and numerical ranges among the evaluation indices:

              <disp-formula id="Ch1.E41" content-type="numbered"><label>41</label><mml:math id="M131" display="block"><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">η</mml:mi><mml:mi>i</mml:mi><mml:mo>∗</mml:mo></mml:msubsup><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:mo>min⁡</mml:mo><mml:mo>(</mml:mo><mml:mi mathvariant="italic">η</mml:mi><mml:mo>)</mml:mo></mml:mrow><mml:mrow><mml:mo>max⁡</mml:mo><mml:mo>(</mml:mo><mml:mi mathvariant="italic">η</mml:mi><mml:mo>)</mml:mo><mml:mo>-</mml:mo><mml:mo>min⁡</mml:mo><mml:mo>(</mml:mo><mml:mi mathvariant="italic">η</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            where <inline-formula><mml:math id="M132" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> denotes the original value of a performance index and <inline-formula><mml:math id="M133" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">η</mml:mi><mml:mi>i</mml:mi><mml:mo>∗</mml:mo></mml:msubsup></mml:mrow></mml:math></inline-formula> denotes its normalized value.</p>
      <p id="d2e5243">A five-index composite cost function is then established to comprehensively evaluate the threshold-dependent performance:

              <disp-formula id="Ch1.E42" content-type="numbered"><label>42</label><mml:math id="M134" display="block"><mml:mrow><mml:msub><mml:mi>J</mml:mi><mml:mn mathvariant="normal">5</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">ν</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:msubsup><mml:mi>t</mml:mi><mml:mi mathvariant="normal">s</mml:mi><mml:mo>∗</mml:mo></mml:msubsup><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="italic">ν</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:msubsup><mml:mi>e</mml:mi><mml:mi mathvariant="normal">ss</mml:mi><mml:mo>∗</mml:mo></mml:msubsup><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="italic">ν</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msub><mml:msubsup><mml:mi mathvariant="italic">σ</mml:mi><mml:mi mathvariant="normal">s</mml:mi><mml:mo>∗</mml:mo></mml:msubsup><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="italic">ν</mml:mi><mml:mn mathvariant="normal">4</mml:mn></mml:msub><mml:msubsup><mml:mi>d</mml:mi><mml:mi mathvariant="normal">r</mml:mi><mml:mo>∗</mml:mo></mml:msubsup><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="italic">ν</mml:mi><mml:mn mathvariant="normal">5</mml:mn></mml:msub><mml:msubsup><mml:mi>e</mml:mi><mml:mo>max⁡</mml:mo><mml:mo>∗</mml:mo></mml:msubsup><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            where <inline-formula><mml:math id="M135" display="inline"><mml:mrow><mml:msubsup><mml:mi>t</mml:mi><mml:mi mathvariant="normal">s</mml:mi><mml:mo>∗</mml:mo></mml:msubsup></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M136" display="inline"><mml:mrow><mml:msubsup><mml:mi>e</mml:mi><mml:mi mathvariant="normal">ss</mml:mi><mml:mo>∗</mml:mo></mml:msubsup></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M137" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">σ</mml:mi><mml:mi mathvariant="normal">s</mml:mi><mml:mo>∗</mml:mo></mml:msubsup></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M138" display="inline"><mml:mrow><mml:msubsup><mml:mi>d</mml:mi><mml:mi mathvariant="normal">r</mml:mi><mml:mo>∗</mml:mo></mml:msubsup></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M139" display="inline"><mml:mrow><mml:msubsup><mml:mi>e</mml:mi><mml:mo>max⁡</mml:mo><mml:mo>∗</mml:mo></mml:msubsup></mml:mrow></mml:math></inline-formula> denote the normalized settling time, steady-state error, steady-state standard deviation, drift rate, and maximum steady-state deviation, respectively. The weights are selected as

              <disp-formula id="Ch1.E43" content-type="numbered"><label>43</label><mml:math id="M140" display="block"><mml:mrow><mml:mo>[</mml:mo><mml:msub><mml:mi mathvariant="italic">ν</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">ν</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">ν</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">ν</mml:mi><mml:mn mathvariant="normal">4</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">ν</mml:mi><mml:mn mathvariant="normal">5</mml:mn></mml:msub><mml:mo>]</mml:mo><mml:mo>=</mml:mo><mml:mo>[</mml:mo><mml:mn mathvariant="normal">0.18</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0.30</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0.20</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0.15</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0.17</mml:mn><mml:mo>]</mml:mo><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

            A larger weight is assigned to the steady-state error because accurate balance near the equilibrium is a primary requirement for wheelchair stabilization. A lower value of <inline-formula><mml:math id="M141" display="inline"><mml:mrow><mml:msub><mml:mi>J</mml:mi><mml:mn mathvariant="normal">5</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> indicates better overall control performance.</p>
      <p id="d2e5478">The calculated five-index costs are summarized in Table <xref ref-type="table" rid="T3"/>. The results show that smaller thresholds lead to shorter settling time in some cases, but they may also produce larger steady-state error and fluctuation. As the threshold increases, the steady-state behavior improves within a certain range, while the settling time gradually increases. Among the tested candidates, <inline-formula><mml:math id="M142" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">sw</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.100</mml:mn></mml:mrow></mml:math></inline-formula> rad yields the minimum five-index cost, indicating the best overall trade-off between transient recovery and steady-state regulation under the nominal model parameters.</p>

<table-wrap id="T3"><label>Table 3</label><caption><p id="d2e5501">Five-index costs under different switching thresholds under nominal model parameters.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="2">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="center"/>
     <oasis:thead>
       <oasis:row>
         <oasis:entry colname="col1">Threshold/</oasis:entry>
         <oasis:entry colname="col2">Five-index</oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">rad</oasis:entry>
         <oasis:entry colname="col2">cost <inline-formula><mml:math id="M143" display="inline"><mml:mrow><mml:msub><mml:mi>J</mml:mi><mml:mn mathvariant="normal">5</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">0.015</oasis:entry>
         <oasis:entry colname="col2">0.8031</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">0.030</oasis:entry>
         <oasis:entry colname="col2">1.0000</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">0.050</oasis:entry>
         <oasis:entry colname="col2">0.2203</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">0.080</oasis:entry>
         <oasis:entry colname="col2">0.1932</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">0.100</oasis:entry>
         <oasis:entry colname="col2">0.0366</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">0.150</oasis:entry>
         <oasis:entry colname="col2">0.1221</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

</sec>
<sec id="Ch1.S3.SS4.SSS3">
  <label>3.4.3</label><title>Parameter sensitivity of the selected threshold</title>
      <p id="d2e5610">To examine whether the selected switching threshold strongly depends on nominal model parameters, a one-factor-at-a-time sensitivity analysis was further conducted. The equivalent upper-body mass <inline-formula><mml:math id="M144" display="inline"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and the equivalent pendulum length <inline-formula><mml:math id="M145" display="inline"><mml:mi>L</mml:mi></mml:math></inline-formula> were varied independently. For each parameter factor, the threshold was scanned within the local range of 0.08–0.12 rad, and the optimal threshold was selected according to the minimum five-index cost.</p>
      <p id="d2e5631">For the equivalent mass variation, the mass factor is defined as

              <disp-formula id="Ch1.E44" content-type="numbered"><label>44</label><mml:math id="M146" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="italic">ρ</mml:mi><mml:mi mathvariant="normal">m</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mrow><mml:mi>p</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

            The optimal threshold decreases as the equivalent mass increases. A linear fitting gives

              <disp-formula id="Ch1.E45" content-type="numbered"><label>45</label><mml:math id="M147" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi mathvariant="normal">sw</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="normal">opt</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.212</mml:mn><mml:mo>-</mml:mo><mml:mn mathvariant="normal">0.110</mml:mn><mml:msub><mml:mi mathvariant="italic">ρ</mml:mi><mml:mi mathvariant="normal">m</mml:mi></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            with <inline-formula><mml:math id="M148" display="inline"><mml:mrow><mml:msup><mml:mi>R</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.945</mml:mn></mml:mrow></mml:math></inline-formula>. This negative correlation indicates that a larger equivalent upper-body mass tends to require a smaller switching threshold, allowing NMPC to remain active over a wider angular region before switching to LQR. It should also be noted that the optimal thresholds for the 0.8 and 0.9 mass factors are located at the upper boundary of the tested interval, suggesting that the optimal threshold may shift slightly upward when the equivalent mass decreases.</p>
      <p id="d2e5712">For the equivalent pendulum-length variation, the optimal threshold does not show a strictly monotonic trend. Under several length-variation cases, the minimum <inline-formula><mml:math id="M149" display="inline"><mml:mrow><mml:msub><mml:mi>J</mml:mi><mml:mn mathvariant="normal">5</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> occurs at the lower boundary of the tested interval, namely <inline-formula><mml:math id="M150" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">sw</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.08</mml:mn></mml:mrow></mml:math></inline-formula> rad. This indicates that when the center-of-mass-related parameter deviates from the nominal value, a smaller switching threshold is generally beneficial because NMPC remains active over a wider angular region and provides stronger nonlinear recovery capability.</p>

<table-wrap id="T4" specific-use="star"><label>Table 4</label><caption><p id="d2e5745">Optimal switching thresholds under representative parameter variations.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="4">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="right"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="left"/>
     <oasis:thead>
       <oasis:row>
         <oasis:entry colname="col1">Varied</oasis:entry>
         <oasis:entry colname="col2">Parameter</oasis:entry>
         <oasis:entry colname="col3">Optimal</oasis:entry>
         <oasis:entry colname="col4"/>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">parameter</oasis:entry>
         <oasis:entry colname="col2">factor</oasis:entry>
         <oasis:entry colname="col3">threshold/rad</oasis:entry>
         <oasis:entry colname="col4">Remark</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M151" display="inline"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">0.8</oasis:entry>
         <oasis:entry colname="col3">0.12</oasis:entry>
         <oasis:entry colname="col4">upper boundary</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M152" display="inline"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">0.9</oasis:entry>
         <oasis:entry colname="col3">0.12</oasis:entry>
         <oasis:entry colname="col4">upper boundary</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M153" display="inline"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">1.0</oasis:entry>
         <oasis:entry colname="col3">0.10</oasis:entry>
         <oasis:entry colname="col4">nominal</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M154" display="inline"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">1.1</oasis:entry>
         <oasis:entry colname="col3">0.09</oasis:entry>
         <oasis:entry colname="col4">–</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M155" display="inline"><mml:mrow><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">1.2</oasis:entry>
         <oasis:entry colname="col3">0.08</oasis:entry>
         <oasis:entry colname="col4">lower candidate</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M156" display="inline"><mml:mi>L</mml:mi></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">0.8</oasis:entry>
         <oasis:entry colname="col3">0.08</oasis:entry>
         <oasis:entry colname="col4">lower boundary</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M157" display="inline"><mml:mi>L</mml:mi></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">0.9</oasis:entry>
         <oasis:entry colname="col3">0.09</oasis:entry>
         <oasis:entry colname="col4">–</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M158" display="inline"><mml:mi>L</mml:mi></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">1.0</oasis:entry>
         <oasis:entry colname="col3">0.10</oasis:entry>
         <oasis:entry colname="col4">nominal</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M159" display="inline"><mml:mi>L</mml:mi></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">1.1</oasis:entry>
         <oasis:entry colname="col3">0.08</oasis:entry>
         <oasis:entry colname="col4">lower boundary</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M160" display="inline"><mml:mi>L</mml:mi></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">1.2</oasis:entry>
         <oasis:entry colname="col3">0.08</oasis:entry>
         <oasis:entry colname="col4">lower boundary</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

      <p id="d2e6018">Overall, the nominal threshold evaluation identifies <inline-formula><mml:math id="M161" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">sw</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.100</mml:mn></mml:mrow></mml:math></inline-formula> rad as the best fixed switching threshold under the nominal model parameters. The mass-sensitivity analysis further provides an empirical estimate of the optimal threshold within the tested mass range. For <inline-formula><mml:math id="M162" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">ρ</mml:mi><mml:mi mathvariant="normal">m</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>/</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mrow><mml:mi mathvariant="normal">p</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:msub><mml:mo>∈</mml:mo><mml:mo>[</mml:mo><mml:mn mathvariant="normal">0.8</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">1.2</mml:mn><mml:mo>]</mml:mo></mml:mrow></mml:math></inline-formula>, the fitted relation <inline-formula><mml:math id="M163" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi mathvariant="normal">sw</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="normal">opt</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.212</mml:mn><mml:mo>-</mml:mo><mml:mn mathvariant="normal">0.110</mml:mn><mml:msub><mml:mi mathvariant="italic">ρ</mml:mi><mml:mi mathvariant="normal">m</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> indicates that a larger equivalent mass generally requires a smaller switching threshold. Therefore, <inline-formula><mml:math id="M164" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">sw</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.100</mml:mn></mml:mrow></mml:math></inline-formula> rad is adopted as the nominal fixed threshold, while the fitted mass–threshold relation provides a reference for parameter-dependent threshold adjustment within the tested range.</p>
</sec>
</sec>
<sec id="Ch1.S3.SS5">
  <label>3.5</label><title>Stability considerations</title>
      <p id="d2e6130">The stability consideration of the proposed controller is based on the functional division between NMPC and LQR. LQR is not used over the entire nonlinear operating range but is restricted to the near-equilibrium region verified by the linearization-error analysis in Sect. <xref ref-type="sec" rid="Ch1.S3.SS4"/>. In this region, the nonlinear model is linearized around the equilibrium point, and the LQR gain is designed so that the closed-loop matrix <inline-formula><mml:math id="M165" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">A</mml:mi><mml:mi mathvariant="normal">l</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi mathvariant="bold">B</mml:mi><mml:mi mathvariant="normal">l</mml:mi></mml:msub><mml:mi mathvariant="bold">K</mml:mi></mml:mrow></mml:math></inline-formula> is Hurwitz. Thus, the LQR stage provides local asymptotic stability for the linearized system.</p>
      <p id="d2e6155">For states outside the local region, NMPC is activated to handle large-deviation nonlinear recovery under input constraints. The switching threshold therefore serves as a boundary between nonlinear recovery and local stabilization, preventing premature use of LQR in regions where the linear approximation is less reliable.</p>
      <p id="d2e6159">The above discussion provides a local stability guarantee for the LQR stage and a practical stability argument for the hybrid framework.  Rigorous global Lyapunov proof for the completely switched nonlinear system is beyond the scope of this study. Therefore, the overall closed-loop behavior is validated through large-initial-angle simulations, disturbance tests, parameter-sensitivity tests, friction-coefficient tests, and prototype experiments.</p>
</sec>
</sec>
<sec id="Ch1.S4">
  <label>4</label><title>Experiments</title>
<sec id="Ch1.S4.SS1">
  <label>4.1</label><title>Prototype</title>
      <p id="d2e6178">The desktop-scale two-wheeled self-balancing prototype used for experimental validation was developed based on the WHEELTEC B570 balancing vehicle architecture and employed an STM32F103C8T6 microcontroller together with an MPU6050 sensor for attitude measurement and closed-loop control implementation.</p>
</sec>
<sec id="Ch1.S4.SS2">
  <label>4.2</label><title>Simulation</title>
      <p id="d2e6189">Simulink in MATLAB is used to construct the simulation platform. The model includes the wheelchair body, driving wheels, center-of-mass and inertia parameters, external-disturbance input, and state-output modules. The body is modeled as a rigid body pitching about the wheel axis, and the driving torque is applied through the wheel-actuator module. The outputs include the pitch angle, pitch angular velocity, wheel displacement, and wheel velocity, which are used by the LQR, NMPC, and hybrid controllers. Disturbance input ports are reserved for robustness tests. The corresponding signal–flow relationship is shown in Fig. <xref ref-type="fig" rid="F4"/>.</p>

      <fig id="F4" specific-use="star"><label>Figure 4</label><caption><p id="d2e6196">Signal–flow diagram of the hybrid NMPC–LQR balance control system.</p></caption>
          <graphic xlink:href="https://ms.copernicus.org/articles/17/713/2026/ms-17-713-2026-f04.png"/>

        </fig>

<sec id="Ch1.S4.SS2.SSS1">
  <label>4.2.1</label><title>Numerical discretization of the NMPC model</title>
      <p id="d2e6212">The continuous-time nonlinear dynamic model is numerically discretized before being incorporated into the finite-horizon optimization problem. The state evolution is approximated with high accuracy by jointly utilizing the state values and dynamic information at both ends of the interval as well as the midpoint state in each sampling interval:

              <disp-formula id="Ch1.E46" content-type="numbered"><label>46</label><mml:math id="M166" display="block"><mml:mrow><mml:mfenced close="" open="{"><mml:mtable columnspacing="1em" rowspacing="5.690551pt 0.2ex" class="aligned" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi mathvariant="normal">m</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mfenced><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>t</mml:mi></mml:mrow><mml:mn mathvariant="normal">8</mml:mn></mml:mfrac></mml:mstyle><mml:mfenced open="[" close="]"><mml:mrow><mml:mi>f</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mfenced><mml:mo>-</mml:mo><mml:mi>f</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>t</mml:mi></mml:mrow><mml:mn mathvariant="normal">6</mml:mn></mml:mfrac></mml:mstyle><mml:mfenced close="" open="["><mml:mrow><mml:mi>f</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mo>+</mml:mo><mml:mn mathvariant="normal">4</mml:mn><mml:mi>f</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi mathvariant="normal">m</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mrow><mml:mi mathvariant="normal">m</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mstyle class="stylechange" displaystyle="true"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mfenced close="]" open=""><mml:mrow><mml:mo>+</mml:mo><mml:mi>f</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mrow></mml:math></disp-formula>

            where <inline-formula><mml:math id="M167" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>t</mml:mi></mml:mrow></mml:math></inline-formula> is the sampling interval; <inline-formula><mml:math id="M168" display="inline"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi mathvariant="normal">m</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> is the midpoint state; and <inline-formula><mml:math id="M169" display="inline"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mrow><mml:mi mathvariant="normal">m</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> is the midpoint control input, which can be approximated as <inline-formula><mml:math id="M170" display="inline"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mrow><mml:mi mathvariant="normal">m</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>+</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>/</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:math></inline-formula>. The resulting discrete state–transition relationship enables the construction of the discrete prediction model required by NMPC. Based on the above discrete state–transition relationship, the NMPC problem is formulated as a nonlinear programming problem over a finite prediction horizon. The optimization variables include the state sequence and control input sequence over the prediction horizon, while the constraints include consistency between the current state and the measured state, discrete state–transition constraints, and upper and lower bounds on the control input. To guarantee real-time performance and closed-loop robustness, a receding-horizon optimization mechanism is adopted. At each sampling instant, the optimization problem is reformulated using the current measured state as the initial condition. The optimal future control sequence is computed, and only the first control input is implemented.</p>
</sec>
</sec>
<sec id="Ch1.S4.SS3">
  <label>4.3</label><title>Balance verification</title>
<sec id="Ch1.S4.SS3.SSS1">
  <label>4.3.1</label><title>Comparative simulation under large initial tilt angles</title>
      <p id="d2e6548">The recovery motion of the self-balancing wheelchair is simulated under initial tilt angles of 35, 40, and 45°. The standalone LQR controller, the standalone NMPC controller, and the proposed hybrid NMPC–LQR controller are compared under the same system parameters, input constraints, and simulation settings. The representative response curves are shown in Fig. <xref ref-type="fig" rid="F5"/>, and the quantitative performance indices are summarized in Table <xref ref-type="table" rid="T5"/>.</p>

      <fig id="F5" specific-use="star"><label>Figure 5</label><caption><p id="d2e6557">Comparative simulation responses of the LQR, NMPC, and hybrid controllers under initial tilt angles of 35, 40, and 45°.</p></caption>
            <graphic xlink:href="https://ms.copernicus.org/articles/17/713/2026/ms-17-713-2026-f05.png"/>

          </fig>

<table-wrap id="T5" specific-use="star"><label>Table 5</label><caption><p id="d2e6569">Performance comparison of LQR, NMPC, and hybrid controllers under large initial tilt angles.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="7">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right"/>
     <oasis:colspec colnum="6" colname="col6" align="right"/>
     <oasis:colspec colnum="7" colname="col7" align="right"/>
     <oasis:thead>
       <oasis:row>
         <oasis:entry colname="col1">Initial</oasis:entry>
         <oasis:entry colname="col2"/>
         <oasis:entry colname="col3">Settling</oasis:entry>
         <oasis:entry colname="col4">Steady-state</oasis:entry>
         <oasis:entry colname="col5">Steady-state</oasis:entry>
         <oasis:entry colname="col6">Max steady-state</oasis:entry>
         <oasis:entry colname="col7">Drift rate/</oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">angle/deg</oasis:entry>
         <oasis:entry colname="col2">Controller</oasis:entry>
         <oasis:entry colname="col3">time/s</oasis:entry>
         <oasis:entry colname="col4">error/deg</oasis:entry>
         <oasis:entry colname="col5">SD/deg</oasis:entry>
         <oasis:entry colname="col6">deviation/deg</oasis:entry>
         <oasis:entry colname="col7">deg s<sup>−1</sup></oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">35</oasis:entry>
         <oasis:entry colname="col2">Hybrid</oasis:entry>
         <oasis:entry colname="col3">0.6500</oasis:entry>
         <oasis:entry colname="col4">0.2619</oasis:entry>
         <oasis:entry colname="col5">0.2806</oasis:entry>
         <oasis:entry colname="col6">0.7811</oasis:entry>
         <oasis:entry colname="col7">0.0056</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">35</oasis:entry>
         <oasis:entry colname="col2">LQR</oasis:entry>
         <oasis:entry colname="col3">2.8863</oasis:entry>
         <oasis:entry colname="col4">0.1602</oasis:entry>
         <oasis:entry colname="col5">0.1356</oasis:entry>
         <oasis:entry colname="col6">0.3952</oasis:entry>
         <oasis:entry colname="col7">0.1116</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">35</oasis:entry>
         <oasis:entry colname="col2">NMPC</oasis:entry>
         <oasis:entry colname="col3">9.0207</oasis:entry>
         <oasis:entry colname="col4">0.6581</oasis:entry>
         <oasis:entry colname="col5">1.3004</oasis:entry>
         <oasis:entry colname="col6">2.6708</oasis:entry>
         <oasis:entry colname="col7">0.0861</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">40</oasis:entry>
         <oasis:entry colname="col2">Hybrid</oasis:entry>
         <oasis:entry colname="col3">0.6662</oasis:entry>
         <oasis:entry colname="col4">0.2703</oasis:entry>
         <oasis:entry colname="col5">0.2625</oasis:entry>
         <oasis:entry colname="col6">0.7207</oasis:entry>
         <oasis:entry colname="col7"><inline-formula><mml:math id="M172" display="inline"><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">0.0610</mml:mn></mml:mrow></mml:math></inline-formula></oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">40</oasis:entry>
         <oasis:entry colname="col2">LQR</oasis:entry>
         <oasis:entry colname="col3">1.1018</oasis:entry>
         <oasis:entry colname="col4">0.1314</oasis:entry>
         <oasis:entry colname="col5">0.1293</oasis:entry>
         <oasis:entry colname="col6">0.3952</oasis:entry>
         <oasis:entry colname="col7">0.1308</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">40</oasis:entry>
         <oasis:entry colname="col2">NMPC</oasis:entry>
         <oasis:entry colname="col3">9.0207</oasis:entry>
         <oasis:entry colname="col4">0.4449</oasis:entry>
         <oasis:entry colname="col5">1.2501</oasis:entry>
         <oasis:entry colname="col6">2.8622</oasis:entry>
         <oasis:entry colname="col7">0.6028</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">45</oasis:entry>
         <oasis:entry colname="col2">Hybrid</oasis:entry>
         <oasis:entry colname="col3">0.7966</oasis:entry>
         <oasis:entry colname="col4">0.0383</oasis:entry>
         <oasis:entry colname="col5">0.0837</oasis:entry>
         <oasis:entry colname="col6">0.2053</oasis:entry>
         <oasis:entry colname="col7">0.2672</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">45</oasis:entry>
         <oasis:entry colname="col2">LQR</oasis:entry>
         <oasis:entry colname="col3">0.9424</oasis:entry>
         <oasis:entry colname="col4">0.1267</oasis:entry>
         <oasis:entry colname="col5">0.1375</oasis:entry>
         <oasis:entry colname="col6">0.3951</oasis:entry>
         <oasis:entry colname="col7">0.0663</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">45</oasis:entry>
         <oasis:entry colname="col2">NMPC</oasis:entry>
         <oasis:entry colname="col3">3.9760</oasis:entry>
         <oasis:entry colname="col4">0.0610</oasis:entry>
         <oasis:entry colname="col5">0.3919</oasis:entry>
         <oasis:entry colname="col6">0.8252</oasis:entry>
         <oasis:entry colname="col7">0.1836</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

</sec>
<sec id="Ch1.S4.SS3.SSS2">
  <label>4.3.2</label><title>Benchmark comparison with sliding-mode control</title>
      <p id="d2e6900">The SMC controller was tested using the same simulation model and input constraint as the proposed controller. Since sliding-mode control is widely applied to nonlinear systems, it provides a meaningful benchmark for evaluating the proposed hybrid strategy. Recent studies have also used SMC as a robust benchmark to evaluate intelligent LQR-based controllers for inverted-pendulum-type systems <xref ref-type="bibr" rid="bib1.bibx16" id="paren.1"/>.</p>

<table-wrap id="T6"><label>Table 6</label><caption><p id="d2e6909">Performance of the SMC benchmark under different recoverable initial tilt angles.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="4">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="right"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:thead>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Performance index</oasis:entry>
         <oasis:entry colname="col2">15°</oasis:entry>
         <oasis:entry colname="col3">25°</oasis:entry>
         <oasis:entry colname="col4">35°</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">Initial angle/deg</oasis:entry>
         <oasis:entry colname="col2">15.0000</oasis:entry>
         <oasis:entry colname="col3">25.0000</oasis:entry>
         <oasis:entry colname="col4">35.0000</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Maximum angle/deg</oasis:entry>
         <oasis:entry colname="col2">15.0000</oasis:entry>
         <oasis:entry colname="col3">25.0000</oasis:entry>
         <oasis:entry colname="col4">35.0000</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Settling time/s</oasis:entry>
         <oasis:entry colname="col2">9.3483</oasis:entry>
         <oasis:entry colname="col3">0.7158</oasis:entry>
         <oasis:entry colname="col4">1.0204</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Steady-state error/deg</oasis:entry>
         <oasis:entry colname="col2">0.4477</oasis:entry>
         <oasis:entry colname="col3">0.2056</oasis:entry>
         <oasis:entry colname="col4">0.7205</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Steady-state SD/deg</oasis:entry>
         <oasis:entry colname="col2">0.3425</oasis:entry>
         <oasis:entry colname="col3">0.0090</oasis:entry>
         <oasis:entry colname="col4">0.0420</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Max steady-state deviation / deg</oasis:entry>
         <oasis:entry colname="col2">0.7812</oasis:entry>
         <oasis:entry colname="col3">0.2220</oasis:entry>
         <oasis:entry colname="col4">0.7812</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Drift rate/deg s<sup>−1</sup></oasis:entry>
         <oasis:entry colname="col2">0.1138</oasis:entry>
         <oasis:entry colname="col3">0.0311</oasis:entry>
         <oasis:entry colname="col4">0.1418</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Tolerance band/deg</oasis:entry>
         <oasis:entry colname="col2">0.7500</oasis:entry>
         <oasis:entry colname="col3">1.2500</oasis:entry>
         <oasis:entry colname="col4">1.7500</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

<table-wrap id="T7" specific-use="star"><label>Table 7</label><caption><p id="d2e7082">Recoverability comparison between the proposed hybrid NMPC–LQR controller and the SMC benchmark under different initial tilt angles.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="6">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="left"/>
     <oasis:colspec colnum="4" colname="col4" align="left"/>
     <oasis:colspec colnum="5" colname="col5" align="left"/>
     <oasis:colspec colnum="6" colname="col6" align="left"/>
     <oasis:thead>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Controller</oasis:entry>
         <oasis:entry colname="col2">15°</oasis:entry>
         <oasis:entry colname="col3">25°</oasis:entry>
         <oasis:entry colname="col4">35°</oasis:entry>
         <oasis:entry colname="col5">40°</oasis:entry>
         <oasis:entry colname="col6">45°</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">SMC benchmark</oasis:entry>
         <oasis:entry colname="col2">Stable</oasis:entry>
         <oasis:entry colname="col3">Stable</oasis:entry>
         <oasis:entry colname="col4">Stable</oasis:entry>
         <oasis:entry colname="col5">Failed</oasis:entry>
         <oasis:entry colname="col6">Failed</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Proposed hybrid NMPC–LQR</oasis:entry>
         <oasis:entry colname="col2">Stable</oasis:entry>
         <oasis:entry colname="col3">Stable</oasis:entry>
         <oasis:entry colname="col4">Stable</oasis:entry>
         <oasis:entry colname="col5">Stable</oasis:entry>
         <oasis:entry colname="col6">Stable</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

</sec>
<sec id="Ch1.S4.SS3.SSS3">
  <label>4.3.3</label><title>Comparative analysis of control performance</title>
      <p id="d2e7183">Table <xref ref-type="table" rid="T5"/> shows that the proposed hybrid controller achieves the shortest settling time under all three large-initial-angle conditions. At 35 and 40°, LQR gives slightly smaller steady-state error and fluctuation, reflecting its local regulation advantage. However, the standalone LQR controller has weaker large-deviation recovery capability, whereas the standalone NMPC controller shows longer settling time and larger residual oscillation.</p>
      <p id="d2e7188">At 45°, the hybrid controller achieves the fastest recovery and the smallest steady-state error, standard deviation, and maximum steady-state deviation. This indicates that NMPC improves large-angle nonlinear recovery, while LQR enhances local stabilization after the state enters the near-equilibrium region.</p>
      <p id="d2e7191">The SMC benchmark results in Tables <xref ref-type="table" rid="T6"/> and <xref ref-type="table" rid="T7"/> show that SMC fails under 40  and 45°, whereas the proposed hybrid controller remains stable under all tested initial angles. Therefore, the hybrid NMPC–LQR controller provides a better balance between recoverability, local stabilization, and robustness under the same input constraint.</p>
</sec>
<sec id="Ch1.S4.SS3.SSS4">
  <label>4.3.4</label><title>Computational efficiency test</title>
      <p id="d2e7206">A computational time test was conducted under the same simulation conditions to evaluate the computational efficiency of the proposed hybrid controller. Five repeated runs were performed under the same simulation settings. The average computation time decreases from 48.04 min for standalone NMPC to 35.00 min for the hybrid controller, indicating that the proposed switching strategy reduces the online computational burden. The detailed results are provided in Appendix <xref ref-type="sec" rid="App1.Ch1.S2"/>.</p>
</sec>
<sec id="Ch1.S4.SS3.SSS5">
  <label>4.3.5</label><title>External disturbance test</title>
      <p id="d2e7220">The disturbance-rejection capability of the hybrid controller is evaluated using both pulse and step disturbances. The disturbance magnitudes are 50, 65, 70, and 80 N, and the response curves are provided in Appendix <xref ref-type="sec" rid="App1.Ch1.S1"/>.</p>
      <p id="d2e7226">The system exhibits a secondary pitch deflection after the pulse is applied, but no sustained divergence is observed. Under 50 and 65 N disturbances, the wheelchair quickly returns to the stable region. Under 70 and 80 N disturbances, the recovery process becomes longer and the residual oscillation increases, but the response remains bounded. These results indicate that the proposed controller retains disturbance-rejection capability under representative pulse impacts.</p>
      <p id="d2e7229">In addition to the pulse-disturbance test, a step-disturbance test was conducted to evaluate the response of the proposed controller under persistent external force. The step disturbance was applied at <inline-formula><mml:math id="M174" display="inline"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:math></inline-formula> s after the initial recovery process, and the tested disturbance magnitudes were 10, 20, and 30 N. The detailed response curves are provided in Appendix <xref ref-type="sec" rid="App1.Ch1.S4"/>. The results show that the post-step peak deviation increases with the disturbance magnitude. Specifically, the maximum post-step pitch deviations are 3.62, 5.89, and 8.11° under 10, 20, and 30 N step disturbances, respectively. Nevertheless, the responses remain bounded and gradually return to the near-equilibrium region. This indicates that the proposed hybrid controller can maintain recovery capability under persistent external disturbances.</p>
</sec>
<sec id="Ch1.S4.SS3.SSS6">
  <label>4.3.6</label><title>Flat-ground friction-coefficient robustness test</title>
      <p id="d2e7254">Flat-ground simulations were further conducted to examine the influence of wheel–ground friction uncertainty. The slope angle was set to zero, and all controller parameters were kept unchanged. Only the static friction coefficient in the spatial contact model was varied. The tested coefficients were 0.03, 0.10, and 0.30, corresponding to low-, medium-, and high-friction contact conditions, respectively.</p>

<table-wrap id="T8" specific-use="star"><label>Table 8</label><caption><p id="d2e7260">Flat-ground robustness test under different static friction coefficients.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="6">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="right"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right"/>
     <oasis:colspec colnum="6" colname="col6" align="right"/>
     <oasis:thead>
       <oasis:row>
         <oasis:entry colname="col1">Static friction</oasis:entry>
         <oasis:entry colname="col2">Settling</oasis:entry>
         <oasis:entry colname="col3">Steady-state</oasis:entry>
         <oasis:entry colname="col4">Steady-state</oasis:entry>
         <oasis:entry colname="col5">Max steady-state</oasis:entry>
         <oasis:entry colname="col6">Drift rate/</oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">coefficient</oasis:entry>
         <oasis:entry colname="col2">time/s</oasis:entry>
         <oasis:entry colname="col3">error/deg</oasis:entry>
         <oasis:entry colname="col4">SD/deg</oasis:entry>
         <oasis:entry colname="col5">deviation/deg</oasis:entry>
         <oasis:entry colname="col6">deg s<sup>−1</sup></oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">0.03</oasis:entry>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M176" display="inline"><mml:mrow><mml:mo>&gt;</mml:mo><mml:mn mathvariant="normal">10</mml:mn></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col3">5.6585</oasis:entry>
         <oasis:entry colname="col4">0.0615</oasis:entry>
         <oasis:entry colname="col5">5.7830</oasis:entry>
         <oasis:entry colname="col6">0.0191</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">0.10</oasis:entry>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M177" display="inline"><mml:mrow><mml:mo>&gt;</mml:mo><mml:mn mathvariant="normal">10</mml:mn></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col3">5.6703</oasis:entry>
         <oasis:entry colname="col4">0.0850</oasis:entry>
         <oasis:entry colname="col5">5.9358</oasis:entry>
         <oasis:entry colname="col6">0.0176</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">0.30</oasis:entry>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M178" display="inline"><mml:mrow><mml:mo>&gt;</mml:mo><mml:mn mathvariant="normal">10</mml:mn></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col3">5.6891</oasis:entry>
         <oasis:entry colname="col4">0.5060</oasis:entry>
         <oasis:entry colname="col5">7.1727</oasis:entry>
         <oasis:entry colname="col6">0.0819</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

      <p id="d2e7432">The results in Table <xref ref-type="table" rid="T8"/> show that the wheelchair does not overturn under the tested friction coefficients, indicating bounded recovery under friction-parameter variations. The steady-state error changes slightly from 0.03 to 0.10, while the high-friction case of 0.30 produces larger steady-state fluctuation. This suggests that stronger wheel–ground contact interaction may amplify residual pitch oscillations.</p>
      <p id="d2e7438">Since the responses do not enter and remain within the prescribed error band during the 10 s simulation, these results are interpreted as bounded recovery rather than exact convergence to the upright target. The detailed response curves are provided in Appendix <xref ref-type="sec" rid="App1.Ch1.S3"/>, where the final steady-state mean angle is also marked for each friction condition.</p>
</sec>
<sec id="Ch1.S4.SS3.SSS7">
  <label>4.3.7</label><title>Prototype balance-recovery experiments</title>
      <p id="d2e7451">Prototype balance-recovery experiments were conducted under initial tilt angles of 25, 30, and 35°. The measured responses are shown in Fig. <xref ref-type="fig" rid="F6"/>. In all cases, the prototype recovers to a small neighborhood around the upright equilibrium, indicating the physical realizability of the proposed controller.</p>

      <fig id="F6" specific-use="star"><label>Figure 6</label><caption><p id="d2e7459">Prototype balance-recovery experiment results under initial tilt angles of 25, 30, and 35°.</p></caption>
            <graphic xlink:href="https://ms.copernicus.org/articles/17/713/2026/ms-17-713-2026-f06.png"/>

          </fig>

      <p id="d2e7468">When the initial angle increases, the transient rebound and oscillation become more evident. Nevertheless, the response remains bounded and eventually approaches the upright region. These experimental results are consistent with the simulation trends and further support the engineering applicability of the proposed hybrid control strategy.</p>
</sec>
</sec>
</sec>
<sec id="Ch1.S5" sec-type="conclusions">
  <label>5</label><title>Conclusions</title>
      <p id="d2e7482">This paper develops a hybrid NMPC–LQR balance control strategy for two-wheeled self-balancing wheelchairs. NMPC is used for large-deviation nonlinear recovery, while LQR is restricted to the local stabilization region verified by linearization-error analysis. Comparative simulations, SMC benchmark tests, disturbance tests, friction-coefficient tests, and prototype experiments show that the proposed controller improves large-angle recovery capability while reducing the computational burden compared with the standalone NMPC.</p>
      <p id="d2e7485">For switching-threshold selection, the linearization-error analysis is first used to determine the threshold search range. A normalized five-index evaluation criterion is then adopted to compare different threshold candidates. Under the nominal model parameters, <inline-formula><mml:math id="M179" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">sw</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.100</mml:mn></mml:mrow></mml:math></inline-formula> rad gives the lowest comprehensive cost and is selected as the nominal fixed threshold. The mass-sensitivity analysis further provides an empirical estimate of the optimal threshold within the tested mass range. For <inline-formula><mml:math id="M180" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">ρ</mml:mi><mml:mi mathvariant="normal">m</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>/</mml:mo><mml:msub><mml:mi>m</mml:mi><mml:mrow><mml:mi>p</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:msub><mml:mo>∈</mml:mo><mml:mo>[</mml:mo><mml:mn mathvariant="normal">0.8</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">1.2</mml:mn><mml:mo>]</mml:mo></mml:mrow></mml:math></inline-formula>, the fitted relation <inline-formula><mml:math id="M181" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi mathvariant="normal">sw</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="normal">opt</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.212</mml:mn><mml:mo>-</mml:mo><mml:mn mathvariant="normal">0.110</mml:mn><mml:msub><mml:mi mathvariant="italic">ρ</mml:mi><mml:mi mathvariant="normal">m</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> indicates that a larger equivalent upper-body mass generally requires a smaller switching threshold.</p>
      <p id="d2e7573">Several limitations remain. The model is a planar reduced-order model and does not include yaw, roll, tire deformation, lateral instability, or active human-body motion. The stability discussion is based on local LQR analysis and closed-loop simulations rather than  rigorous global Lyapunov proof for the switched nonlinear system. In addition, the prototype experiments are conducted on a desktop-scale platform. Future work will focus on human–wheelchair coupled modeling, multi-parameter threshold fitting, adaptive switching-threshold calculation, explicit friction compensation, robust NMPC with terminal constraints, and full-scale experiments on slopes and uneven terrains.</p>
</sec>

      
      </body>
    <back><app-group>

<app id="App1.Ch1.S1">
  <label>Appendix A</label><title>Pitch-angle responses under external pulse disturbances</title>

      <fig id="FA1"><label>Figure A1</label><caption><p id="d2e7590">Pitch-angle responses under different external pulse disturbances.</p></caption>
        
        <graphic xlink:href="https://ms.copernicus.org/articles/17/713/2026/ms-17-713-2026-f07.png"/>

      </fig>


</app>

<app id="App1.Ch1.S2">
  <label>Appendix B</label><title>Detailed results of the computational time tests</title>

<table-wrap id="TB1"><label>Table B1</label><caption><p id="d2e7614">Detailed results of the computational time tests.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="3">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="center"/>
     <oasis:colspec colnum="3" colname="col3" align="center"/>
     <oasis:thead>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Trial</oasis:entry>
         <oasis:entry colname="col2">NMPC (min)</oasis:entry>
         <oasis:entry colname="col3">Hybrid (min)</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">1</oasis:entry>
         <oasis:entry colname="col2">47.6</oasis:entry>
         <oasis:entry colname="col3">34.2</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">2</oasis:entry>
         <oasis:entry colname="col2">48.9</oasis:entry>
         <oasis:entry colname="col3">35.8</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">3</oasis:entry>
         <oasis:entry colname="col2">46.8</oasis:entry>
         <oasis:entry colname="col3">34.9</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">4</oasis:entry>
         <oasis:entry colname="col2">49.1</oasis:entry>
         <oasis:entry colname="col3">35.4</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">5</oasis:entry>
         <oasis:entry colname="col2">47.8</oasis:entry>
         <oasis:entry colname="col3">34.7</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

</app>

<app id="App1.Ch1.S3">
  <label>Appendix C</label><title>Pitch-angle responses under different flat-ground friction coefficients</title>

      <fig id="FC1"><label>Figure C1</label><caption><p id="d2e7716">Pitch-angle responses under different flat-ground static friction coefficients. The horizontal dash-dotted line denotes the final steady-state mean angle <inline-formula><mml:math id="M182" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">ss</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, calculated from the last 10 % of the simulation time.</p></caption>
        
        <graphic xlink:href="https://ms.copernicus.org/articles/17/713/2026/ms-17-713-2026-f08.png"/>

      </fig>


</app>

<app id="App1.Ch1.S4">
  <label>Appendix D</label><title>Pitch-angle responses under step disturbances</title>

      <fig id="FD1"><label>Figure D1</label><caption><p id="d2e7750">Pitch-angle responses under different step disturbances. The shaded region denotes the period after the step disturbance is applied, and the red marker indicates the maximum post-step pitch deviation.</p></caption>
        
        <graphic xlink:href="https://ms.copernicus.org/articles/17/713/2026/ms-17-713-2026-f09.png"/>

      </fig>

</app>
  </app-group><notes notes-type="codedataavailability"><title>Code and data availability</title>

      <p id="d2e7765">The code and data used in this study are not publicly available due to laboratory confidentiality requirements. Relevant information may be made available by the corresponding author upon reasonable request and with permission from the laboratory.</p>
  </notes><notes notes-type="authorcontribution"><title>Author contributions</title>

      <p id="d2e7771">Haomin Sun contributed to algorithm design, dynamic modeling, and hardware implementation. Xinying Zhang contributed to simulation system development and simulation experiment design. Yaozhi Gu performed data processing. Weiyue Chen and Shuyue Zhang contributed to manuscript preparation.</p>
  </notes><notes notes-type="competinginterests"><title>Competing interests</title>

      <p id="d2e7779">The contact author has declared that none of the authors has any competing interests.</p>
  </notes><notes notes-type="disclaimer"><title>Disclaimer</title>

      <p id="d2e7785">Publisher's note: Copernicus Publications remains neutral with regard to jurisdictional claims made in the text, published maps, institutional affiliations, or any other geographical representation in this paper. The authors bear the ultimate responsibility for providing appropriate place names. Views expressed in the text are those of the authors and do not necessarily reflect the views of the publisher.</p>
  </notes><ack><title>Acknowledgements</title><p id="d2e7792">The authors thank Chongyu Wang, Lin Gui, Dongyang Shao, and Wenhao Yan for their participation. The authors used ChatGPT for language polishing and LaTeX-formatting assistance. All scientific content, data interpretation, and conclusions were checked and approved by the authors.</p></ack><notes notes-type="financialsupport"><title>Financial support</title>

      <p id="d2e7798">This research has been supported by the Shanghai High-Quality Development Program for Science and Technology Industry–Elderly Care Technology Support Project (grant no. 25YL1900900).</p>
  </notes><notes notes-type="reviewstatement"><title>Review statement</title>

      <p id="d2e7804">This paper was edited by Liangliang Cheng and reviewed by four anonymous referees.</p>
  </notes><ref-list>
    <title>References</title>

      <ref id="bib1.bibx1"><label>Chacko and Abraham(2023)</label><mixed-citation>Chacko, S. J. and Abraham, R. J.: On LQR controller design for an inverted pendulum stabilization, Int. J. Dynam. Control, 11, 1584–1592, <ext-link xlink:href="https://doi.org/10.1007/s40435-022-01079-0" ext-link-type="DOI">10.1007/s40435-022-01079-0</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx2"><label>Chénier et al.(2023)</label><mixed-citation>Chénier, F., Marquis, E., and Fleury-Rousseau, M.: Tracking the whole-body centre of mass of humans seated in a wheelchair using motion capture, J. Biomech., 156, 111675, <ext-link xlink:href="https://doi.org/10.1016/j.jbiomech.2023.111675" ext-link-type="DOI">10.1016/j.jbiomech.2023.111675</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx3"><label>Cui et al.(2015)</label><mixed-citation>Cui, R., Guo, J., and Mao, Z.: Adaptive backstepping control of wheeled inverted pendulums models, Nonlinear Dynam., 79, 501–511, <ext-link xlink:href="https://doi.org/10.1007/s11071-014-1682-9" ext-link-type="DOI">10.1007/s11071-014-1682-9</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx4"><label>Dai et al.(2015)</label><mixed-citation>Dai, F., Gao, X., Jiang, S., Guo, W., and Liu, Y.: A two-wheeled inverted pendulum robot with friction compensation, Mechatronics, 30, 116–125, <ext-link xlink:href="https://doi.org/10.1016/j.mechatronics.2015.06.011" ext-link-type="DOI">10.1016/j.mechatronics.2015.06.011</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx5"><label>Feng et al.(2023)</label><mixed-citation>Feng, X., Liu, S., Yuan, Q., Xiao, J., and Zhao, D.: Research on wheel-legged robot based on LQR and ADRC, Sci. Rep., 13, 15122, <ext-link xlink:href="https://doi.org/10.1038/s41598-023-41462-1" ext-link-type="DOI">10.1038/s41598-023-41462-1</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx6"><label>Huynh et al.(2017)</label><mixed-citation>Huynh, H. N., Verlinden, O., and Vande Wouwer, A.: Comparative application of model predictive control strategies to a wheeled mobile robot, J. Intell. Robot. Syst., 87, 81–95, <ext-link xlink:href="https://doi.org/10.1007/s10846-017-0500-2" ext-link-type="DOI">10.1007/s10846-017-0500-2</ext-link>, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx7"><label>Kim and Kwon(2015)</label><mixed-citation>Kim, S. and Kwon, S.: Dynamic modeling of a two-wheeled inverted pendulum balancing mobile robot, Int. J. Control Autom. Syst., 13, 926–933, <ext-link xlink:href="https://doi.org/10.1007/s12555-014-0564-8" ext-link-type="DOI">10.1007/s12555-014-0564-8</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx8"><label>Kim et al.(2005)</label><mixed-citation>Kim, Y., Kim, S. H., and Kwak, Y. K.: Dynamic analysis of a nonholonomic two-wheeled inverted pendulum robot, J. Intell. Robot. Syst., 44, 25–46, <ext-link xlink:href="https://doi.org/10.1007/s10846-005-9022-4" ext-link-type="DOI">10.1007/s10846-005-9022-4</ext-link>, 2005.</mixed-citation></ref>
      <ref id="bib1.bibx9"><label>Li et al.(2021)</label><mixed-citation>Li, J., Wang, J., Wang, S., Qi, W., Zhang, L., Hu, Y., and Su, H.: Neural approximation-based model predictive tracking control of non-holonomic wheel-legged robots, Int. J. Control Autom. Syst., 19, 372–381, <ext-link xlink:href="https://doi.org/10.1007/s12555-019-0927-2" ext-link-type="DOI">10.1007/s12555-019-0927-2</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx10"><label>Li and Zhang(2010)</label><mixed-citation>Li, Z. and Zhang, Y.: Robust adaptive motion/force control for wheeled inverted pendulums, Automatica, 46, 1346–1353, <ext-link xlink:href="https://doi.org/10.1016/j.automatica.2010.05.015" ext-link-type="DOI">10.1016/j.automatica.2010.05.015</ext-link>, 2010.</mixed-citation></ref>
      <ref id="bib1.bibx11"><label>Liang et al.(2021)</label><mixed-citation>Liang, S., Wang, Z., and Stepan, G.: Motion control of a two-wheeled inverted pendulum with uncertain rolling resistance and angle constraint based on slow-fast dynamics, Nonlinear Dynam., 104, 2185–2199, <ext-link xlink:href="https://doi.org/10.1007/s11071-021-06439-7" ext-link-type="DOI">10.1007/s11071-021-06439-7</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx12"><label>Liu et al.(2024)</label><mixed-citation>Liu, C., Qin, K., Xin, G., Li, C., and Wang, S.: Nonlinear model predictive control for a self-balancing wheelchair, IEEE Access, 12, 28938–28949, <ext-link xlink:href="https://doi.org/10.1109/ACCESS.2024.3368853" ext-link-type="DOI">10.1109/ACCESS.2024.3368853</ext-link>, 2024.</mixed-citation></ref>
      <ref id="bib1.bibx13"><label>Ma et al.(2024)</label><mixed-citation>Ma, Y., Meng, F., and Xiong, S.: Design and implementation of a two-wheeled self-balancing car using a fuzzy Kalman filter, Appl. Sci., 14, 5296, <ext-link xlink:href="https://doi.org/10.3390/app14125296" ext-link-type="DOI">10.3390/app14125296</ext-link>, 2024.</mixed-citation></ref>
      <ref id="bib1.bibx14"><label>Onozuka et al.(2020)</label><mixed-citation>Onozuka, Y., Tomokuni, N., Murata, G., and Shino, M.: Attitude control of an inverted-pendulum-type robotic wheelchair to climb stairs considering dynamic equilibrium, Robomech J., 7, 23, <ext-link xlink:href="https://doi.org/10.1186/s40648-020-00171-4" ext-link-type="DOI">10.1186/s40648-020-00171-4</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx15"><label>Saleem et al.(2021)</label><mixed-citation>Saleem, O., Mahmood-ul-Hasan, K., and Rizwan, M.: An experimental comparison of different hierarchical self-tuning regulatory control procedures for under-actuated mechatronic systems, PLOS ONE, 16, e0256750, <ext-link xlink:href="https://doi.org/10.1371/journal.pone.0256750" ext-link-type="DOI">10.1371/journal.pone.0256750</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx16"><label>Saleem et al.(2025)</label><mixed-citation>Saleem, O., Iqbal, J., and Alharbi, S.: Self-regulating fuzzy-LQR control of an inverted pendulum system via adaptive hyperbolic error modulation, Machines, 13, 939, <ext-link xlink:href="https://doi.org/10.3390/machines13100939" ext-link-type="DOI">10.3390/machines13100939</ext-link>, 2025.</mixed-citation></ref>
      <ref id="bib1.bibx17"><label>Shen and Hong(2022)</label><mixed-citation>Shen, J. and Hong, D.: Model predictive control using dynamic model decomposition applied to two-wheeled inverted pendulum mobile robot, in: 2022 19th International Conference on Ubiquitous Robots (UR), Jeju, Republic of Korea, 332–337, <ext-link xlink:href="https://doi.org/10.1109/UR55393.2022.9826244" ext-link-type="DOI">10.1109/UR55393.2022.9826244</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx18"><label>Xin et al.(2025)</label><mixed-citation>Xin, G., Jin, B., Liu, C., and Jiang, M.: A unified control framework for self-balancing robots: addressing model variations in wheel-legged platforms and human-carrying wheelchairs, Sensors, 25, 7144, <ext-link xlink:href="https://doi.org/10.3390/s25237144" ext-link-type="DOI">10.3390/s25237144</ext-link>, 2025.</mixed-citation></ref>
      <ref id="bib1.bibx19"><label>Yan and Li(2024)</label><mixed-citation>Yan, C. and Li, X.: Research on stability control system of two-wheel heavy-load self-balancing vehicles in complex terrain, Appl. Sci., 14, 7682, <ext-link xlink:href="https://doi.org/10.3390/app14177682" ext-link-type="DOI">10.3390/app14177682</ext-link>, 2024.</mixed-citation></ref>
      <ref id="bib1.bibx20"><label>Zhang et al.(2025)</label><mixed-citation>Zhang, A., Zhou, R., Zhang, T., Zheng, J., and Chen, S.: Balance control method for bipedal wheel-legged robots based on friction feedforward linear quadratic regulator, Sensors, 25, 1056, <ext-link xlink:href="https://doi.org/10.3390/s25041056" ext-link-type="DOI">10.3390/s25041056</ext-link>, 2025.</mixed-citation></ref>
      <ref id="bib1.bibx21"><label>Zhang and Wu(2019)</label><mixed-citation>Zhang, B. and Wu, G.: Design of two-wheel self-balancing vehicle based on visual identification, EURASIP J. Image Video Process., 2019, 34, <ext-link xlink:href="https://doi.org/10.1186/s13640-019-0434-7" ext-link-type="DOI">10.1186/s13640-019-0434-7</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx22"><label>Zhang and Mohamad Nor(2025)</label><mixed-citation>Zhang, H. and Mohamad Nor, N.: Control strategies for two-wheeled self-balancing robotic systems: a comprehensive review, Robotics, 14, 101, <ext-link xlink:href="https://doi.org/10.3390/robotics14080101" ext-link-type="DOI">10.3390/robotics14080101</ext-link>, 2025.</mixed-citation></ref>
      <ref id="bib1.bibx23"><label>Zhang et al.(2024)</label><mixed-citation>Zhang, Z., Xu, P., Wu, C., and Yu, H.: Smart nursing wheelchairs: a new trend in assisted care and the future of multifunctional integration, Biomimetics, 9, 492, <ext-link xlink:href="https://doi.org/10.3390/biomimetics9080492" ext-link-type="DOI">10.3390/biomimetics9080492</ext-link>, 2024.</mixed-citation></ref>

  </ref-list></back>
    <!--<article-title-html>Hybrid nonlinear model predictive and linear quadratic balance control for a two-wheeled self-balancing wheelchair</article-title-html>
<abstract-html/>
<ref-html id="bib1.bib1"><label>Chacko and Abraham(2023)</label><mixed-citation>
      
Chacko, S. J. and Abraham, R. J.: On LQR controller design for an inverted pendulum stabilization, Int. J. Dynam. Control, 11, 1584–1592, <a href="https://doi.org/10.1007/s40435-022-01079-0" target="_blank">https://doi.org/10.1007/s40435-022-01079-0</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib2"><label>Chénier et al.(2023)</label><mixed-citation>
      
Chénier, F., Marquis, E., and Fleury-Rousseau, M.: Tracking the whole-body centre of mass of humans seated in a wheelchair using motion capture, J. Biomech., 156, 111675, <a href="https://doi.org/10.1016/j.jbiomech.2023.111675" target="_blank">https://doi.org/10.1016/j.jbiomech.2023.111675</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib3"><label>Cui et al.(2015)</label><mixed-citation>
      
Cui, R., Guo, J., and Mao, Z.: Adaptive backstepping control of wheeled inverted pendulums models, Nonlinear Dynam., 79, 501–511, <a href="https://doi.org/10.1007/s11071-014-1682-9" target="_blank">https://doi.org/10.1007/s11071-014-1682-9</a>, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib4"><label>Dai et al.(2015)</label><mixed-citation>
      
Dai, F., Gao, X., Jiang, S., Guo, W., and Liu, Y.: A two-wheeled inverted pendulum robot with friction compensation, Mechatronics, 30, 116–125, <a href="https://doi.org/10.1016/j.mechatronics.2015.06.011" target="_blank">https://doi.org/10.1016/j.mechatronics.2015.06.011</a>, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib5"><label>Feng et al.(2023)</label><mixed-citation>
      
Feng, X., Liu, S., Yuan, Q., Xiao, J., and Zhao, D.: Research on wheel-legged robot based on LQR and ADRC, Sci. Rep., 13, 15122, <a href="https://doi.org/10.1038/s41598-023-41462-1" target="_blank">https://doi.org/10.1038/s41598-023-41462-1</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib6"><label>Huynh et al.(2017)</label><mixed-citation>
      
Huynh, H. N., Verlinden, O., and Vande Wouwer, A.: Comparative application of model predictive control strategies to a wheeled mobile robot, J. Intell. Robot. Syst., 87, 81–95, <a href="https://doi.org/10.1007/s10846-017-0500-2" target="_blank">https://doi.org/10.1007/s10846-017-0500-2</a>, 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib7"><label>Kim and Kwon(2015)</label><mixed-citation>
      
Kim, S. and Kwon, S.: Dynamic modeling of a two-wheeled inverted pendulum balancing mobile robot, Int. J. Control Autom. Syst., 13, 926–933, <a href="https://doi.org/10.1007/s12555-014-0564-8" target="_blank">https://doi.org/10.1007/s12555-014-0564-8</a>, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib8"><label>Kim et al.(2005)</label><mixed-citation>
      
Kim, Y., Kim, S. H., and Kwak, Y. K.: Dynamic analysis of a nonholonomic two-wheeled inverted pendulum robot, J. Intell. Robot. Syst., 44, 25–46, <a href="https://doi.org/10.1007/s10846-005-9022-4" target="_blank">https://doi.org/10.1007/s10846-005-9022-4</a>, 2005.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib9"><label>Li et al.(2021)</label><mixed-citation>
      
Li, J., Wang, J., Wang, S., Qi, W., Zhang, L., Hu, Y., and Su, H.: Neural approximation-based model predictive tracking control of non-holonomic wheel-legged robots, Int. J. Control Autom. Syst., 19, 372–381, <a href="https://doi.org/10.1007/s12555-019-0927-2" target="_blank">https://doi.org/10.1007/s12555-019-0927-2</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib10"><label>Li and Zhang(2010)</label><mixed-citation>
      
Li, Z. and Zhang, Y.: Robust adaptive motion/force control for wheeled inverted pendulums, Automatica, 46, 1346–1353, <a href="https://doi.org/10.1016/j.automatica.2010.05.015" target="_blank">https://doi.org/10.1016/j.automatica.2010.05.015</a>, 2010.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib11"><label>Liang et al.(2021)</label><mixed-citation>
      
Liang, S., Wang, Z., and Stepan, G.: Motion control of a two-wheeled inverted pendulum with uncertain rolling resistance and angle constraint based on slow-fast dynamics, Nonlinear Dynam., 104, 2185–2199, <a href="https://doi.org/10.1007/s11071-021-06439-7" target="_blank">https://doi.org/10.1007/s11071-021-06439-7</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib12"><label>Liu et al.(2024)</label><mixed-citation>
      
Liu, C., Qin, K., Xin, G., Li, C., and Wang, S.: Nonlinear model predictive control for a self-balancing wheelchair, IEEE Access, 12, 28938–28949, <a href="https://doi.org/10.1109/ACCESS.2024.3368853" target="_blank">https://doi.org/10.1109/ACCESS.2024.3368853</a>, 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib13"><label>Ma et al.(2024)</label><mixed-citation>
      
Ma, Y., Meng, F., and Xiong, S.: Design and implementation of a two-wheeled self-balancing car using a fuzzy Kalman filter, Appl. Sci., 14, 5296, <a href="https://doi.org/10.3390/app14125296" target="_blank">https://doi.org/10.3390/app14125296</a>, 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib14"><label>Onozuka et al.(2020)</label><mixed-citation>
      
Onozuka, Y., Tomokuni, N., Murata, G., and Shino, M.: Attitude control of an inverted-pendulum-type robotic wheelchair to climb stairs considering dynamic equilibrium, Robomech J., 7, 23, <a href="https://doi.org/10.1186/s40648-020-00171-4" target="_blank">https://doi.org/10.1186/s40648-020-00171-4</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib15"><label>Saleem et al.(2021)</label><mixed-citation>
      
Saleem, O., Mahmood-ul-Hasan, K., and Rizwan, M.: An experimental comparison of different hierarchical self-tuning regulatory control procedures for under-actuated mechatronic systems, PLOS ONE, 16, e0256750, <a href="https://doi.org/10.1371/journal.pone.0256750" target="_blank">https://doi.org/10.1371/journal.pone.0256750</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib16"><label>Saleem et al.(2025)</label><mixed-citation>
      
Saleem, O., Iqbal, J., and Alharbi, S.: Self-regulating fuzzy-LQR control of an inverted pendulum system via adaptive hyperbolic error modulation, Machines, 13, 939, <a href="https://doi.org/10.3390/machines13100939" target="_blank">https://doi.org/10.3390/machines13100939</a>, 2025.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib17"><label>Shen and Hong(2022)</label><mixed-citation>
      
Shen, J. and Hong, D.: Model predictive control using dynamic model decomposition applied to two-wheeled inverted pendulum mobile robot, in: 2022 19th International Conference on Ubiquitous Robots (UR), Jeju, Republic of Korea, 332–337, <a href="https://doi.org/10.1109/UR55393.2022.9826244" target="_blank">https://doi.org/10.1109/UR55393.2022.9826244</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib18"><label>Xin et al.(2025)</label><mixed-citation>
      
Xin, G., Jin, B., Liu, C., and Jiang, M.: A unified control framework for self-balancing robots: addressing model variations in wheel-legged platforms and human-carrying wheelchairs, Sensors, 25, 7144, <a href="https://doi.org/10.3390/s25237144" target="_blank">https://doi.org/10.3390/s25237144</a>, 2025.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib19"><label>Yan and Li(2024)</label><mixed-citation>
      
Yan, C. and Li, X.: Research on stability control system of two-wheel heavy-load self-balancing vehicles in complex terrain, Appl. Sci., 14, 7682, <a href="https://doi.org/10.3390/app14177682" target="_blank">https://doi.org/10.3390/app14177682</a>, 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib20"><label>Zhang et al.(2025)</label><mixed-citation>
      
Zhang, A., Zhou, R., Zhang, T., Zheng, J., and Chen, S.: Balance control method for bipedal wheel-legged robots based on friction feedforward linear quadratic regulator, Sensors, 25, 1056, <a href="https://doi.org/10.3390/s25041056" target="_blank">https://doi.org/10.3390/s25041056</a>, 2025.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib21"><label>Zhang and Wu(2019)</label><mixed-citation>
      
Zhang, B. and Wu, G.: Design of two-wheel self-balancing vehicle based on visual identification, EURASIP J. Image Video Process., 2019, 34, <a href="https://doi.org/10.1186/s13640-019-0434-7" target="_blank">https://doi.org/10.1186/s13640-019-0434-7</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib22"><label>Zhang and Mohamad Nor(2025)</label><mixed-citation>
      
Zhang, H. and Mohamad Nor, N.: Control strategies for two-wheeled self-balancing robotic systems: a comprehensive review, Robotics, 14, 101, <a href="https://doi.org/10.3390/robotics14080101" target="_blank">https://doi.org/10.3390/robotics14080101</a>, 2025.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib23"><label>Zhang et al.(2024)</label><mixed-citation>
      
Zhang, Z., Xu, P., Wu, C., and Yu, H.: Smart nursing wheelchairs: a new trend in assisted care and the future of multifunctional integration, Biomimetics, 9, 492, <a href="https://doi.org/10.3390/biomimetics9080492" target="_blank">https://doi.org/10.3390/biomimetics9080492</a>, 2024.

    </mixed-citation></ref-html>--></article>
