<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing DTD v2.3 20070202//EN" "journalpublishing.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" article-type="research-article" dtd-version="2.3" xml:lang="EN">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">Front. Mar. Sci.</journal-id>
<journal-title>Frontiers in Marine Science</journal-title>
<abbrev-journal-title abbrev-type="pubmed">Front. Mar. Sci.</abbrev-journal-title>
<issn pub-type="epub">2296-7745</issn>
<publisher>
<publisher-name>Frontiers Media S.A.</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="doi">10.3389/fmars.2025.1648335</article-id>
<article-categories>
<subj-group subj-group-type="heading">
<subject>Marine Science</subject>
<subj-group>
<subject>Original Research</subject>
</subj-group>
</subj-group>
</article-categories>
<title-group>
<article-title>Research on design, modeling, and maneuverability analysis of hybrid-driven robotic fish</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname>Bai</surname>
<given-names>Fagang</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<uri xlink:href="https://loop.frontiersin.org/people/3164053/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/software/"/>
<role content-type="https://credit.niso.org/contributor-roles/formal-analysis/"/>
<role content-type="https://credit.niso.org/contributor-roles/visualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/validation/"/>
<role content-type="https://credit.niso.org/contributor-roles/data-curation/"/>
<role content-type="https://credit.niso.org/contributor-roles/conceptualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/writing-original-draft/"/>
<role content-type="https://credit.niso.org/contributor-roles/methodology/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Song</surname>
<given-names>Xuening</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<role content-type="https://credit.niso.org/contributor-roles/methodology/"/>
<role content-type="https://credit.niso.org/contributor-roles/writing-review-editing/"/>
<role content-type="https://credit.niso.org/contributor-roles/investigation/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Wang</surname>
<given-names>Zekai</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<role content-type="https://credit.niso.org/contributor-roles/software/"/>
<role content-type="https://credit.niso.org/contributor-roles/writing-review-editing/"/>
<role content-type="https://credit.niso.org/contributor-roles/validation/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Wang</surname>
<given-names>Xingyao</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<role content-type="https://credit.niso.org/contributor-roles/validation/"/>
<role content-type="https://credit.niso.org/contributor-roles/writing-review-editing/"/>
<role content-type="https://credit.niso.org/contributor-roles/formal-analysis/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Liu</surname>
<given-names>Yanjun</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<xref ref-type="aff" rid="aff2">
<sup>2</sup>
</xref>
<role content-type="https://credit.niso.org/contributor-roles/writing-review-editing/"/>
<role content-type="https://credit.niso.org/contributor-roles/methodology/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Liu</surname>
<given-names>Kun</given-names>
</name>
<xref ref-type="aff" rid="aff3">
<sup>3</sup>
</xref>
<role content-type="https://credit.niso.org/contributor-roles/validation/"/>
<role content-type="https://credit.niso.org/contributor-roles/writing-review-editing/"/>
<role content-type="https://credit.niso.org/contributor-roles/software/"/>
</contrib>
<contrib contrib-type="author" corresp="yes">
<name>
<surname>Xue</surname>
<given-names>Gang</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<xref ref-type="aff" rid="aff2">
<sup>2</sup>
</xref>
<xref ref-type="author-notes" rid="fn001">
<sup>*</sup>
</xref>
<uri xlink:href="https://loop.frontiersin.org/people/1984760/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/funding-acquisition/"/>
<role content-type="https://credit.niso.org/contributor-roles/writing-review-editing/"/>
<role content-type="https://credit.niso.org/contributor-roles/project-administration/"/>
</contrib>
</contrib-group>
<aff id="aff1">
<sup>1</sup>
<institution>Institute of Marine Science and Technology, Shandong University</institution>, <addr-line>Qingdao</addr-line>,&#xa0;<country>China</country>
</aff>
<aff id="aff2">
<sup>2</sup>
<institution>School of Mechanical Engineering, Key Laboratory of High-Efficiency and Clean Mechanical Manufacture of Ministry of Education, National Demonstration Center for Experimental Mechanical Engineering Education, Shandong University</institution>, <addr-line>Jinan</addr-line>,&#xa0;<country>China</country>
</aff>
<aff id="aff3">
<sup>3</sup>
<institution>National Deep Sea Center</institution>, <addr-line>Qingdao</addr-line>,&#xa0;<country>China</country>
</aff>
<author-notes>
<fn fn-type="edited-by">
<p>Edited by: <ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/2757854/overview">Xujiang Chao</ext-link>, Northwestern Polytechnical University, China</p>
</fn>
<fn fn-type="edited-by">
<p>Reviewed by: <ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/1441829/overview">Cetin Canpolat</ext-link>, &#xc7;ukurova University, T&#xfc;rkiye</p>
<p>
<ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/1613397/overview">Yong Zhong</ext-link>, South China University of Technology, China</p>
</fn>
<fn fn-type="corresp" id="fn001">
<p>*Correspondence: Gang Xue, <email xlink:href="mailto:xuegangzb@163.com">xuegangzb@163.com</email>
</p>
</fn>
</author-notes>
<pub-date pub-type="epub">
<day>18</day>
<month>08</month>
<year>2025</year>
</pub-date>
<pub-date pub-type="collection">
<year>2025</year>
</pub-date>
<volume>12</volume>
<elocation-id>1648335</elocation-id>
<history>
<date date-type="received">
<day>17</day>
<month>06</month>
<year>2025</year>
</date>
<date date-type="accepted">
<day>29</day>
<month>07</month>
<year>2025</year>
</date>
</history>
<permissions>
<copyright-statement>Copyright &#xa9; 2025 Bai, Song, Wang, Wang, Liu, Liu and Xue.</copyright-statement>
<copyright-year>2025</copyright-year>
<copyright-holder>Bai, Song, Wang, Wang, Liu, Liu and Xue</copyright-holder>
<license xlink:href="http://creativecommons.org/licenses/by/4.0/">
<p>This is an open-access article distributed under the terms of the Creative Commons Attribution License (CC BY). The use, distribution or reproduction in other forums is permitted, provided the original author(s) and the copyright owner(s) are credited and that the original publication in this journal is cited, in accordance with accepted academic practice. No use, distribution or reproduction is permitted which does not comply with these terms.</p>
</license>
</permissions>
<abstract>
<p>Hybrid-driven robotic fish combines the maneuverability of propeller propulsion with the efficiency of biomimetic fin propulsion, offering potential advantages in underwater exploration and robotic applications. This paper presents the design and development of a hybrid-driven robotic fish that integrates both biomimetic fin and propeller propulsion systems. Initially, the kinematic and dynamic modeling challenges associated with robotic fish are addressed, establishing a comprehensive coupled mathematical model that accounts for the robotic fish&#x2019;s six degrees of freedom and the actuator dynamics. Subsequently, computational fluid dynamics techniques are employed to simulate a virtual tank for the robotic fish, and hydrodynamic data fitting is performed to determine key parameters such as damping coefficients and thrust coefficients. Finally, a simulation platform based on MATLAB/Simulink is constructed to simulate the robot&#x2019;s motion, validated through comparisons with simulated calculations and experimental observations. Based on these findings, this paper further analyzes the robotic fish&#x2019;s maneuverability metrics, including its surge speed, turning radius, and motion characteristics in three-dimensional space, and examines how perturbations in hydrodynamic coefficients affect swimming speed. This study provides valuable insights into the complex motion modeling and performance prediction of hybrid-driven robotic fish, and establishes a foundation for future studies on the motion control of robotic fish.</p>
</abstract>
<kwd-group>
<kwd>robotic fish</kwd>
<kwd>hybrid driven</kwd>
<kwd>dynamic and kinematics modeling</kwd>
<kwd>CFD numerical simulation</kwd>
<kwd>maneuverability analysis</kwd>
</kwd-group>
<contract-num rid="cn001">2023YFC2810100</contract-num>
<contract-num rid="cn002">52471331</contract-num>
<contract-sponsor id="cn001">National Key Research and Development Program of China<named-content content-type="fundref-id">10.13039/501100012166</named-content>
</contract-sponsor>
<contract-sponsor id="cn002">National Natural Science Foundation of China<named-content content-type="fundref-id">10.13039/501100001809</named-content>
</contract-sponsor>
<counts>
<fig-count count="18"/>
<table-count count="1"/>
<equation-count count="27"/>
<ref-count count="34"/>
<page-count count="23"/>
<word-count count="11655"/>
</counts>
<custom-meta-wrap>
<custom-meta>
<meta-name>section-in-acceptance</meta-name>
<meta-value>Ocean Solutions</meta-value>
</custom-meta>
</custom-meta-wrap>
</article-meta>
</front>
<body>
<sec id="s1" sec-type="intro">
<label>1</label>
<title>Introduction</title>
<p>With the increasing competition in maritime strategies and the advancement of underwater equipment technology, the design and development of intelligent underwater robots have garnered widespread attention. Autonomous underwater vehicles (AUVs) and other types of underwater unmanned systems are widely applied in areas such as ocean environmental monitoring (<xref ref-type="bibr" rid="B14">Liljeback and Mills, 2017</xref>), seafloor topography exploration (<xref ref-type="bibr" rid="B34">Zhao et&#xa0;al., 2023</xref>), ocean reconnaissance and surveillance (<xref ref-type="bibr" rid="B24">Terracciano et&#xa0;al., 2020</xref>), as well as underwater equipment maintenance and repair (<xref ref-type="bibr" rid="B6">Fahrni et&#xa0;al., 2018</xref>). The unique undulating motion patterns of marine organisms like fish (<xref ref-type="bibr" rid="B2">Barrett et&#xa0;al., 1996</xref>) provide valuable biological inspiration to overcome the limitations of traditional underwater vehicles that rely on propeller thrusters, such as large size and high noise levels. Bionic robotic fish, inspired by biological motion, have become a research focus due to their superior maneuverability, enhanced stealth capabilities, and lower environmental disturbance (<xref ref-type="bibr" rid="B20">Salazar et&#xa0;al., 2018</xref>).</p>
<p>To achieve the swimming performance of classical body/caudal fin (BCF) propulsion mode bionic robotic fish (<xref ref-type="bibr" rid="B22">Sfakiotakis et al., 2002</xref>), researchers often place the motion excitation source near the tail, designing single-joint or multi-joint mechanical structures driven by motors or servos (<xref ref-type="bibr" rid="B32">Yu et&#xa0;al., 2019</xref>; <xref ref-type="bibr" rid="B5">Chen D, et&#xa0;al., 2022</xref>; <xref ref-type="bibr" rid="B19">Qiu et&#xa0;al., 2023</xref>). Unfortunately, although bionic designs offer clear advantages in maneuverability and stealth, and the movement speed of robotic fish with special mechanical structures is also impressive, their maneuverability and stability are significantly compromised in the ocean and complex water environments due to unstable factors like complex currents. The cruising posture is difficult to balance, making it challenging to apply in real ocean environments.</p>
<p>Compared to traditional underwater robots with single propulsion systems, combining bionic principles with technologically mature propeller thrusters to create hybrid propulsion systems seems like a promising approach. Hybrid-driven bionic underwater robots can not only change their hydrodynamic shape by mimicking the motion patterns of marine organisms to achieve steering and maneuvering but also benefit from the higher environmental adaptability and better performance provided by propeller thrusters. <xref ref-type="bibr" rid="B10">Huang et&#xa0;al. (2025)</xref> presented a hybrid-driven robotic fish architecture that integrates pectoral-fin-mounted propellers with a caudal-fin-based propulsion system, effectively enhancing the robot&#x2019;s swimming performance. <xref ref-type="bibr" rid="B13">Li et&#xa0;al. (2024)</xref> designed a compact micro hybrid-driven robotic fish, combining vertically arranged propellers with tail fin swinging to achieve high maneuverability. <xref ref-type="bibr" rid="B11">Ji et&#xa0;al. (2023)</xref> developed a new type of hybrid-driven bionic tuna robot, featuring a three-joint tail with a propeller at the end of the tail fin, offering high speed and maneuverability. <xref ref-type="bibr" rid="B21">Scaradozzi et&#xa0;al. (2017)</xref> developed a hybrid-driven underwater robot named &#x201c;BRAVE,&#x201d; which resolves the contradiction between long-distance movement and rapid maneuvering through hybrid propulsion and is equipped with a vision module for seafloor topography mapping. Norwegian researchers developed an underwater robot called &#x201c;Eelume&#x201d; (<xref ref-type="bibr" rid="B14">Liljeback and Mills, 2017</xref>), which has multiple body segments and additional propellers for flexible movement and target approach, providing innovative solutions for the inspection, maintenance, and repair (IMR) of underwater facilities in the oil and gas industry. <xref ref-type="bibr" rid="B16">Liu K, et&#xa0;al. (2022)</xref> developed the &#x201c;Jinlong&#x201d; multi-joint AUV (MJ-AUV), a bold attempt that significantly improves maneuverability compared to traditional AUVs with single rigid configurations and has been developed for detecting ocean profile parameters. Additionally, hybrid-driven robotic fish for rescue and exploration tasks (<xref ref-type="bibr" rid="B28">Xia et&#xa0;al., 2021</xref>) have been developed, enriching the technological level of underwater vehicles. Therefore, compared with purely bio-inspired vehicles that still lack sufficient locomotive capabilities, hybrid-propelled swimmers offer far greater promise for near-term industrial deployment.</p>
<p>The establishment of a dynamic model by integrating analytical methods with Computational Fluid Dynamics (CFD) simulation techniques provides a comprehensive description of the relationship between the motion and forces experienced by robotic fish. This model serves as a crucial mathematical tool and theoretical foundation for performance evaluation and optimization, motion simulation, and controller design of robotic fish. Compared with traditional propeller-driven underwater vehicles, the key challenge in modeling robotic fish lies in the precise construction of a mathematical model that describes the thrust generated by tail swinging. For propeller-driven underwater vehicles, once the geometric parameters of the propeller are determined, the thrust primarily depends on the vehicle&#x2019;s velocity and the propeller&#x2019;s rotational speed. Through open-water tests of the propeller or CFD simulations, the thrust characteristics of the propeller can be accurately obtained, and a mathematical model of the propeller thrust can be established accordingly (<xref ref-type="bibr" rid="B12">Li et&#xa0;al., 2022</xref>). However, for robotic fish with multi-joint tail propulsion, the thrust is influenced by a complex array of parameters due to the amplitude, phase difference, and offset angle of joints, so it is challenging to directly obtain an accurate mathematical relationship between the thrust of the propulsion system and the joint motion parameters through experimental means. Moreover, the oscillating caudal fin generates regular or fragmented turbulent vortex structures in the wake. Their strength, shedding frequency, and spatial evolution are closely linked to thrust fluctuations. Neglecting wake-vortex modeling makes it difficult to reproduce the true propulsive efficiency and flow-field details in numerical simulations. Therefore, to approximate the swimming patterns of real fish and design a propulsion system that can predict the swimming performance of robotic fish, it is crucial to accurately quantify the hydrodynamic thrust generated by the biomimetic tail. CFD simulation technology has become a key tool for obtaining data on hydrodynamic forces resulting from the interaction between fluid and moving structures (<xref ref-type="bibr" rid="B3">Borazjani and Sotiropoulos, 2008</xref>; <xref ref-type="bibr" rid="B17">Liu J, et&#xa0;al., 2022</xref>). When using CFD methods to analyze the hydrodynamic forces generated by multi-joint tail swinging, the position of each segment of the robotic fish must be obtained through fitting fish body wave methods (<xref ref-type="bibr" rid="B9">Hu et&#xa0;al., 2021</xref>), and the method of calculating the hydrodynamic forces on rigid parts such as the robotic fish&#x2019;s pectoral fins based on the relative relationship between velocity in different directions is applicable (<xref ref-type="bibr" rid="B33">Yuan et&#xa0;al., 2017</xref>). The integration of the aforementioned research methods with traditional modeling and control techniques of marine vessels and underwater vehicles (<xref ref-type="bibr" rid="B7">Fossen, 1994</xref>), and their subsequent application to the study of biomimetic robotic fish, has been demonstrated to be an efficient and straightforward approach (<xref ref-type="bibr" rid="B27">Watts et&#xa0;al., 2007</xref>). Researchers have conducted extensive explorations and attempts in this domain and have achieved remarkable outcomes (<xref ref-type="bibr" rid="B23">Suebsaiprom and Lin, 2015</xref>; <xref ref-type="bibr" rid="B18">Ozmen Koca et&#xa0;al., 2018</xref>; <xref ref-type="bibr" rid="B4">Chen Y, et&#xa0;al., 2022</xref>; <xref ref-type="bibr" rid="B8">Gong et&#xa0;al., 2024</xref>).</p>
<p>With the emergence of a diverse array of biomimetic robotic fish, numerous scholars have employed various theories and methods to establish corresponding dynamic models in an attempt to accurately describe their motion characteristics. However, due to the differing propulsion structures of these robotic fish and the varied simplification approaches for the mechanics of propulsion, a universal framework for dynamic modeling has yet to be developed. Therefore, inspired by previous research, we have designed and fabricated a hybrid-driven robotic fish that incorporates both biomimetic fins and a propeller, and aimed to establish an accurate and detailed mathematical model for it. To the best of our knowledge, this study is one of the few that systematically models and comprehensively analyzes complex issues, including the nonlinear hydrodynamics of underwater controlled objects, the nonlinear dynamics of multiple actuators, actuator input saturation and so on. Our principal contributions are as follows: (1) Considering the dynamics of multiple actuators, we have established a complete model architecture for the six degrees of freedom (DOF) dynamic and kinematic equations of motion for the hybrid-driven robotic fish; (2) Utilizing CFD technology, we have realized the simulation of hybrid-driven biomimetic fish and successfully identified the hydrodynamic coefficients; (3) Based on the comprehensive mathematical model, we have developed a computer simulation platform, validated the model&#x2019;s accuracy through comparison with experimental prototype results, and further analyzed the robotic fish&#x2019;s maneuverability and uncertainty using this simulation platform.</p>
<p>The remainder of this paper is organized as follows. Section 2 introduces the design and manufacturing of the hybrid-driven robotic fish. Section 3 discusses the coupled modeling process of the robotic fish&#x2019;s kinematics and dynamics. Section 4 presents the numerical simulation method based on CFD and the identification of hydrodynamic coefficients. Section 5 describes the construction of the proposed simulation platform, the validation of the proposed model, and the discussion on simulation results. The final section summarizes the work and conclusions of this paper. The overall research approach is illustrated in <xref ref-type="fig" rid="f1">
<bold>Figure&#xa0;1</bold>
</xref>.</p>
<fig id="f1" position="float">
<label>Figure&#xa0;1</label>
<caption>
<p>The framework of the overall research approach.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g001.tif">
<alt-text content-type="machine-generated">A diagram illustrating a process flow for developing a hybrid-driven robotic fish. It starts with mechatronics and theoretical modeling, showing equations and a robotic fish image. Next is CFD simulation and hydrodynamic coefficient identification, featuring propulsion types and graphs. The third section details the hybrid-driven fish maneuverability model using Simulink for model construction, with a flowchart of inputs and outputs. Finally, results analysis and visualization are shown with two graphs and a 3D environment depicting the fish's trajectory near underwater terrain.</alt-text>
</graphic>
</fig>
</sec>
<sec id="s2">
<label>2</label>
<title>Mechatronics design of robotic fish</title>
<sec id="s2_1">
<label>2.1</label>
<title>Mechanical structure</title>
<p>The designed and developed robotic fish is based on the biomimicry of a shark, as shown in <xref ref-type="fig" rid="f2">
<bold>Figure&#xa0;2</bold>
</xref>. It has a total length <italic>L</italic> of approximately 1.483 m, a body width <italic>W</italic> of about 0.45 m, the outermost distance of the pectoral fins is about 0.75 m, a body height <italic>H</italic> of about 0.45 m, and a total weight of approximately 48 kg. For detailed parameter information, please refer to <xref ref-type="supplementary-material" rid="SM1">
<bold>Appendix A</bold>
</xref>. The head contains the underwater camera, motion controller, power supply, and related onboard sensors of the robotic fish. The pectoral fins driven by four servomotors (RM-SV-40 underwater servomotors), the tail driven by three servomotors, and three propeller thrusters (T200-type thruster) provide the driving thrust for the robotic fish. Therefore, the robotic fish possesses both fish-inspired actuators-driving fins-and propeller thrusters commonly used in traditional underwater vehicles, offering three swimming modes: biomimetic driving, propeller driving, and hybrid driving. Thanks to the advantages of biomimetic swinging and propeller driving, the propulsion system of the robotic fish can provide stable thrust during long-distance and fast movement, and also achieve more precise and flexible maneuvering control when approaching the working area.</p>
<fig id="f2" position="float">
<label>Figure&#xa0;2</label>
<caption>
<p>The design model and prototype of hybrid-driven robot fish.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g002.tif">
<alt-text content-type="machine-generated">Diagram of a robotic fish labeled with key components: dorsal fin with Bluetooth module, propeller thruster, caudal fin, control module, battery system, underwater servo motor, pressure sensor, connector, underwater camera, and pectoral fin. Inset shows the robotic fish prototype in water.</alt-text>
</graphic>
</fig>
<p>It is also worth mentioning that in actual situations, when the horizontal propeller thrusters of the robotic fish rotate at the same speed, the thrust generated always extends along the body axis rather than the actual direction of movement. Due to the yaw motion of the body caused by the swinging of the tail, the robotic fish may not maintain good straight-line performance when both the tail swinging and the two horizontal propeller thrusters provide straight-line thrust. However, the combination of different actuators can effectively avoid this issue.</p>
</sec>
<sec id="s2_2">
<label>2.2</label>
<title>Working principle</title>
<p>The robotic fish also integrates an underwater camera, lateral line pressure sensors, and attitude sensors, capable of collecting pressure and attitude data from the sensors in real-time. It also has abundant sensor interfaces, allowing for flexible integration of various peripheral instruments. The working principle of the robotic fish is illustrated in <xref ref-type="fig" rid="f3">
<bold>Figure&#xa0;3</bold>
</xref>. Initially, the operator configures parameters via the upper-level computer software, including adjustments for underwater illumination and settings for control commands of the actuators (servomotors and propellers). Subsequently, the actuators commence operation, facilitating the movement of the robotic fish, including maneuvers such as forward motion, turning, ascending, and descending. Concurrently, the image and pressure sensors capture image and pressure information, respectively, generating data related to the robotic fish&#x2019;s joint angles, environmental pressure, and temperature. These data are then transmitted back to the upper-level computer software for display and processing. The developed robotic fish prototype platform enables comprehensive control and monitoring of the robotic fish, providing a foundational basis for validating modeling and simulation theories as well as for subsequent control algorithm research.</p>
<fig id="f3" position="float">
<label>Figure&#xa0;3</label>
<caption>
<p>Working principle diagram.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g003.tif">
<alt-text content-type="machine-generated">Flowchart showing the components and processes of a swimming control system. It includes PC software for data processing, control command settings, swimming operations like forward, turning, ascending, and descending. Sensors include a pressure sensor, IMU, and camera. Actuators depicted are a servomotor and propeller. Data acquisition and return arrows connect the components, with a data panel displaying graphs.</alt-text>
</graphic>
</fig>
</sec>
</sec>
<sec id="s3">
<label>3</label>
<title>Modeling of robotic fish</title>
<sec id="s3_1">
<label>3.1</label>
<title>Kinematics</title>
<p>Define the earth-fixed reference frame <inline-formula>
<mml:math display="inline" id="im1">
<mml:mrow>
<mml:msub>
<mml:mi>o</mml:mi>
<mml:mi>e</mml:mi>
</mml:msub>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mi>e</mml:mi>
</mml:msub>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>e</mml:mi>
</mml:msub>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>e</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> as the <inline-formula>
<mml:math display="inline" id="im2">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mi>e</mml:mi>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> frame, the body-fixed reference frame <inline-formula>
<mml:math display="inline" id="im3">
<mml:mrow>
<mml:msub>
<mml:mi>o</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> as the <inline-formula>
<mml:math display="inline" id="im4">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mi>b</mml:mi>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> frame, and the origin of the <inline-formula>
<mml:math display="inline" id="im5">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mi>b</mml:mi>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> frame is chosen to coincide with the center of gravity (CG) of the robotic fish. Therefore, the linear and angular velocity vector of the robot fish is described as <inline-formula>
<mml:math display="inline" id="im6">
<mml:mover accent="true">
<mml:mi>&#x3b7;</mml:mi>
<mml:mi>&#x2d9;</mml:mi>
</mml:mover>
</mml:math>
</inline-formula> in th <inline-formula>
<mml:math display="inline" id="im7">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mi>e</mml:mi>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>e frame and <italic>
<bold>v</bold>
</italic>
<inline-formula>
<mml:math display="inline" id="im8">
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:math>
</inline-formula> in the <inline-formula>
<mml:math display="inline" id="im9">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mi>b</mml:mi>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> frame. The transformation between them is established as (<xref ref-type="bibr" rid="B7">Fossen, 1994</xref>) (<xref ref-type="disp-formula" rid="eq1">Equation 1</xref>)</p>
<disp-formula id="eq1">
<label>(1)</label>
<mml:math display="block" id="M1">
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mover accent="true">
<mml:mi mathvariant="bold-italic">&#x3b7;</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mover accent="true">
<mml:mi mathvariant="bold-italic">&#x3b7;</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo>]</mml:mo>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:munder>
<mml:munder>
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">J</mml:mi>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">&#x3b7;</mml:mi>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mn mathvariant="bold">0</mml:mn>
<mml:mrow>
<mml:mn>3</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mn mathvariant="bold">0</mml:mn>
<mml:mrow>
<mml:mn>3</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">J</mml:mi>
<mml:mn>2</mml:mn>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">&#x3b7;</mml:mi>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo>]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mo stretchy="true">&#xfe38;</mml:mo>
</mml:munder>
<mml:mrow>
<mml:mi>J</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>&#x3b7;</mml:mi>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:munder>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">&#x3bd;</mml:mi>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">&#x3bd;</mml:mi>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo>]</mml:mo>
</mml:mrow>
<mml:mo>&#x21d4;</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold-italic">&#x3b7;</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold-italic">J</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3b7;</mml:mi>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3bd;</mml:mi>
</mml:mrow>
</mml:math>
</disp-formula>
<p>Where, <inline-formula>
<mml:math display="inline" id="im10">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3b7;</mml:mi>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold-italic">&#x3b7;</mml:mi>
<mml:mn>1</mml:mn>
<mml:mi>T</mml:mi>
</mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mi mathvariant="bold-italic">&#x3b7;</mml:mi>
<mml:mn>2</mml:mn>
<mml:mi>T</mml:mi>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mi>T</mml:mi>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>; <inline-formula>
<mml:math display="inline" id="im11">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">&#x3b7;</mml:mi>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>x</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>z</mml:mi>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
<mml:mi>T</mml:mi>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>; <inline-formula>
<mml:math display="inline" id="im12">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">&#x3b7;</mml:mi>
<mml:mn>2</mml:mn>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>&#x3d5;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3b8;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3c8;</mml:mi>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
<mml:mi>T</mml:mi>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>; <inline-formula>
<mml:math display="inline" id="im13">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3bd;</mml:mi>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold-italic">&#x3bd;</mml:mi>
<mml:mn>1</mml:mn>
<mml:mi>T</mml:mi>
</mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mi mathvariant="bold-italic">&#x3bd;</mml:mi>
<mml:mn>2</mml:mn>
<mml:mi>T</mml:mi>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mi>T</mml:mi>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>; <inline-formula>
<mml:math display="inline" id="im14">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">&#x3bd;</mml:mi>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>u</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>v</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>w</mml:mi>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
<mml:mi>T</mml:mi>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>; <inline-formula>
<mml:math display="inline" id="im15">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">&#x3bd;</mml:mi>
<mml:mn>2</mml:mn>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mi>p</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>q</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>r</mml:mi>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
<mml:mi>T</mml:mi>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>. <inline-formula>
<mml:math display="inline" id="im16">
<mml:mrow>
<mml:mi mathvariant="bold-italic">J</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3b7;</mml:mi>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> is a transformation matrix related through the Euler angles: roll (<inline-formula>
<mml:math display="inline" id="im17">
<mml:mi>&#x3d5;</mml:mi>
</mml:math>
</inline-formula>), pitch (<inline-formula>
<mml:math display="inline" id="im18">
<mml:mi>&#x3b8;</mml:mi>
</mml:math>
</inline-formula>), yaw (<inline-formula>
<mml:math display="inline" id="im19">
<mml:mi>&#x3c8;</mml:mi>
</mml:math>
</inline-formula>) according to <xref ref-type="disp-formula" rid="eq2">Equations 2</xref>, <xref ref-type="disp-formula" rid="eq3">3</xref>
</p>
<disp-formula id="eq2">
<label>(2)</label>
<mml:math display="block" id="M2">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">J</mml:mtext>
<mml:mn mathvariant="bold">1</mml:mn>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mn mathvariant="bold">2</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo stretchy="true">[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3c8;</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3c8;</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3c8;</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3c8;</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo stretchy="true">]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
<disp-formula id="eq3">
<label>(3)</label>
<mml:math display="block" id="M3">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">J</mml:mi>
<mml:mn>2</mml:mn>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold-italic">&#x3b7;</mml:mi>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo stretchy="true">[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mn>1</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
<mml:mi>tan</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
<mml:mi>tan</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
<mml:mo stretchy="false">/</mml:mo>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3d5;</mml:mi>
<mml:mo stretchy="false">/</mml:mo>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo stretchy="true">]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
</sec>
<sec id="s3_2">
<label>3.2</label>
<title>Six DOF rigid-body equations of motion</title>
<p>Based on Lagrangian Formulation, the robot fish&#x2019;s six DOF rigid-body equations of motion can be expressed as <xref ref-type="disp-formula" rid="eq4">Equation 4</xref>
</p>
<disp-formula id="eq4">
<label>(4)</label>
<mml:math display="block" id="M4">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="bold-italic">RB</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mover accent="true">
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mo mathvariant="bold">&#x2d9;</mml:mo>
</mml:mover>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">C</mml:mtext>
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mi>B</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mi>B</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</disp-formula>
<p>Where, <inline-formula>
<mml:math display="inline" id="im20">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mi>B</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is a generalized vector of external forces and moments, <inline-formula>
<mml:math display="inline" id="im21">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mi>B</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula>
<mml:math display="inline" id="im22">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">C</mml:mtext>
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mi>B</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> are respectively the inertia matrix and Coriolis and centripetal matrix as <xref ref-type="disp-formula" rid="eq5">Equations 5</xref>, <xref ref-type="disp-formula" rid="eq6">6</xref>
</p>
<disp-formula id="eq5">
<label>(5)</label>
<mml:math display="block" id="M5">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mi>B</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:msub>
<mml:mtext mathvariant="bold-italic">E</mml:mtext>
<mml:mrow>
<mml:mn>3</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>m</mml:mi>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mi>G</mml:mi>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mi>G</mml:mi>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">I</mml:mtext>
<mml:mn>0</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo>]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
<disp-formula id="eq6">
<label>(6)</label>
<mml:math display="block" id="M6">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">C</mml:mtext>
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mi>B</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mn mathvariant="bold">0</mml:mn>
<mml:mrow>
<mml:mn>3</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>m</mml:mi>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>m</mml:mi>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mi>G</mml:mi>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>m</mml:mi>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>+</mml:mo>
<mml:mi>m</mml:mi>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mi>G</mml:mi>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">I</mml:mtext>
<mml:mn mathvariant="bold">0</mml:mn>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo>]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
<p>Where, <inline-formula>
<mml:math display="inline" id="im23">
<mml:mi>m</mml:mi>
</mml:math>
</inline-formula> is the mass of robotic fish, <inline-formula>
<mml:math display="inline" id="im24">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">I</mml:mtext>
<mml:mn>0</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is the inertia tensor referred to the origin <inline-formula>
<mml:math display="inline" id="im25">
<mml:mrow>
<mml:msub>
<mml:mi>o</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im26">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">E</mml:mtext>
<mml:mrow>
<mml:mn>3</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is the 3&#xd7;3 identity matrix and <inline-formula>
<mml:math display="inline" id="im27">
<mml:mrow>
<mml:mi>S</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>&#x3bb;</mml:mi>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> is a skew-symmetrical matrix defined such that <inline-formula>
<mml:math display="inline" id="im28">
<mml:mrow>
<mml:mtext mathvariant="bold-italic">&#x3bb;</mml:mtext>
<mml:mo>&#xd7;</mml:mo>
<mml:mtext mathvariant="bold-italic">a</mml:mtext>
<mml:mo>&#x225c;</mml:mo>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3bb;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mtext mathvariant="bold-italic">a</mml:mtext>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im29">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mi>G</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mi>G</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>G</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>G</mml:mi>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mi>T</mml:mi>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> is the vector from the origin <inline-formula>
<mml:math display="inline" id="im30">
<mml:mrow>
<mml:msub>
<mml:mi>o</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> to the robot fish's CG. Meanwhile, define <inline-formula>
<mml:math display="inline" id="im31">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mi>B</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mi>B</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>B</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>B</mml:mi>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mi>T</mml:mi>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> as the vector from origin <inline-formula>
<mml:math display="inline" id="im32">
<mml:mrow>
<mml:msub>
<mml:mi>o</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> to the robot fish's center of buoyancy (CB).</p>
</sec>
<sec id="s3_3">
<label>3.3</label>
<title>External forces and moments</title>
<p>The external forces and moments <inline-formula>
<mml:math display="inline" id="im33">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mi>B</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> acting on the robotic fish&#x2019;s CG during its motion in underwater space mainly consist of radiation-induced forces <inline-formula>
<mml:math display="inline" id="im34">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mi>H</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, environmental disturbance forces and moments <inline-formula>
<mml:math display="inline" id="im35">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mi>E</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> caused by underwater currents, as well as the control forces and moments <inline-formula>
<mml:math display="inline" id="im36">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3c4;</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> generated by the actuators, that is <xref ref-type="disp-formula" rid="eq7">Equation 7</xref>
</p>
<disp-formula id="eq7">
<label>(7)</label>
<mml:math display="block" id="M7">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mi>B</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mi>H</mml:mi>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mi>E</mml:mi>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mi>T</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</disp-formula>
<sec id="s3_3_1">
<label>3.3.1</label>
<title>Radiation-induced forces</title>
<p>Radiation-induced forces can be categorized into three components: added mass forces and moments, hydrodynamic damping, and restoring forces and moments (<xref ref-type="disp-formula" rid="eq8">Equation 8</xref>).</p>
<disp-formula id="eq8">
<label>(8)</label>
<mml:math display="block" id="M8">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mi>H</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:munder>
<mml:munder>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mi>A</mml:mi>
</mml:msub>
<mml:mover accent="true">
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mo mathvariant="bold">&#x2d9;</mml:mo>
</mml:mover>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">C</mml:mtext>
<mml:mtext mathvariant="bold-italic">A</mml:mtext>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
</mml:mrow>
<mml:mo stretchy="true">&#xfe38;</mml:mo>
</mml:munder>
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mtext>Added&#xa0;Mass</mml:mtext>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mtext>forces&#xa0;and&#xa0;moments</mml:mtext>
<mml:mo>&#xa0;</mml:mo>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:munder>
<mml:mo>&#x2212;</mml:mo>
<mml:munder>
<mml:munder>
<mml:mrow>
<mml:mtext mathvariant="bold-italic">D</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
</mml:mrow>
<mml:mo stretchy="true">&#xfe38;</mml:mo>
</mml:munder>
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mtext>Hydrodynamic</mml:mtext>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>&#xa0;</mml:mo>
<mml:mtext>damping</mml:mtext>
<mml:mo>&#xa0;</mml:mo>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:munder>
<mml:mo>&#x2212;</mml:mo>
<mml:munder>
<mml:munder>
<mml:mrow>
<mml:mtext mathvariant="bold-italic">g</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mo stretchy="true">&#xfe38;</mml:mo>
</mml:munder>
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mtext>Restoring&#xa0;forces&#xa0;</mml:mtext>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mtext>and&#xa0;moments</mml:mtext>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:munder>
</mml:mrow>
</mml:math>
</disp-formula>
<p>The added mass forces and moments are <inline-formula>
<mml:math display="inline" id="im37">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mi>A</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mi>A</mml:mi>
</mml:msub>
<mml:mover accent="true">
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mo mathvariant="bold">&#x2d9;</mml:mo>
</mml:mover>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">C</mml:mtext>
<mml:mi>A</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
</mml:mrow>
</mml:math>
</inline-formula>, and the shape of the robot fish is approximately a regular geometry, then <inline-formula>
<mml:math display="inline" id="im38">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mi>A</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula>
<mml:math display="inline" id="im39">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">C</mml:mtext>
<mml:mi>A</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">v</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> are approximately expressed as <xref ref-type="disp-formula" rid="eq9">Equations 9</xref>, <xref ref-type="disp-formula" rid="eq10">10</xref>
</p>
<disp-formula id="eq9">
<label>(9)</label>
<mml:math display="block" id="M9">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mi>A</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mrow>
<mml:mn>11</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mrow>
<mml:mn>12</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mrow>
<mml:mn>21</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mrow>
<mml:mn>22</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo>]</mml:mo>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mtext>diag</mml:mtext>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>X</mml:mi>
<mml:mover accent="true">
<mml:mi>u</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mover accent="true">
<mml:mi>v</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>Z</mml:mi>
<mml:mover accent="true">
<mml:mi>w</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mover accent="true">
<mml:mi>p</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>M</mml:mi>
<mml:mover accent="true">
<mml:mi>q</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>N</mml:mi>
<mml:mover accent="true">
<mml:mi>r</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:msub>
</mml:mrow>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
<disp-formula id="eq10">
<label>(10)</label>
<mml:math display="block" id="M10">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">C</mml:mtext>
<mml:mi>A</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mn mathvariant="bold">0</mml:mn>
<mml:mrow>
<mml:mn>3</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mrow>
<mml:mn>11</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mi>&#x3bd;</mml:mi>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mrow>
<mml:mn>12</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mrow>
<mml:mn>11</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mrow>
<mml:mn>12</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mrow>
<mml:mn>21</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mrow>
<mml:mn>22</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo>]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
<p>Where, the coefficients such as <inline-formula>
<mml:math display="inline" id="im40">
<mml:mrow>
<mml:msub>
<mml:mi>X</mml:mi>
<mml:mover accent="true">
<mml:mi>u</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im41">
<mml:mrow>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mover accent="true">
<mml:mi>v</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and so on are added mass coefficients.</p>
<p>The hydrodynamic damping coefficient matrix that needs to be identified can be expressed as <xref ref-type="disp-formula" rid="eq11">Equation 11</xref>
</p>
<disp-formula id="eq11">
<label>(11)</label>
<mml:math display="block" id="M11">
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:mtext mathvariant="bold-italic">D</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mtext>diag</mml:mtext>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>X</mml:mi>
<mml:mi>u</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mi>v</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>Z</mml:mi>
<mml:mi>w</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mi>p</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>M</mml:mi>
<mml:mi>q</mml:mi>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>N</mml:mi>
<mml:mi>r</mml:mi>
</mml:msub>
</mml:mrow>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mtext>&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;</mml:mtext>
<mml:mo>&#x2212;</mml:mo>
<mml:mtext>diag</mml:mtext>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>X</mml:mi>
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>u</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>u</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mrow>
<mml:mi>v</mml:mi>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>v</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>v</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mi>w</mml:mi>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>w</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>w</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>p</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>p</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>M</mml:mi>
<mml:mrow>
<mml:mi>q</mml:mi>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>q</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>q</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>N</mml:mi>
<mml:mrow>
<mml:mi>r</mml:mi>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>r</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>r</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
</disp-formula>
<p>Where, the coefficients such as <inline-formula>
<mml:math display="inline" id="im42">
<mml:mrow>
<mml:msub>
<mml:mi>X</mml:mi>
<mml:mi>u</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im43">
<mml:mrow>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mi>v</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and so on are linear damping coefficients. And the coefficients such as <inline-formula>
<mml:math display="inline" id="im44">
<mml:mrow>
<mml:msub>
<mml:mi>X</mml:mi>
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>u</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im45">
<mml:mrow>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mrow>
<mml:mi>v</mml:mi>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>v</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and so on are quadratic damping coefficients.</p>
<p>The gravity and the buoyancy act on the CG and CB of the robot fish respectively, and the restoring force is expressed as <xref ref-type="disp-formula" rid="eq12">Equation 12</xref>
</p>
<disp-formula id="eq12">
<label>(12)</label>
<mml:math display="block" id="M12">
<mml:mrow>
<mml:mtext mathvariant="bold-italic">g</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">f</mml:mtext>
<mml:mi>G</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">f</mml:mtext>
<mml:mi>B</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mi>G</mml:mi>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">f</mml:mtext>
<mml:mi>G</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>+</mml:mo>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mi>B</mml:mi>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">f</mml:mtext>
<mml:mi>B</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo>]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
<p>Here, <inline-formula>
<mml:math display="inline" id="im46">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">f</mml:mtext>
<mml:mi>G</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="bold-italic">J</mml:mtext>
<mml:mn>1</mml:mn>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mi>W</mml:mi>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>3</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im47">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">f</mml:mtext>
<mml:mi>B</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="bold-italic">J</mml:mtext>
<mml:mn>1</mml:mn>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mi>B</mml:mi>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>3</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and they are the gravity and buoyancy in the <inline-formula>
<mml:math display="inline" id="im48">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mi>b</mml:mi>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> frame, respectively.</p>
</sec>
<sec id="s3_3_2">
<label>3.3.2</label>
<title>Underwater current disturbances</title>
<p>The impact of underwater current disturbances <inline-formula>
<mml:math display="inline" id="im49">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mi>E</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is incorporated into the robotic fish&#x2019;s dynamics model by introducing the concept of relative velocity vector. Let the linear velocity vector of the current in the <inline-formula>
<mml:math display="inline" id="im50">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mi>e</mml:mi>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> frame and the <inline-formula>
<mml:math display="inline" id="im51">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mi>b</mml:mi>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> frame be denoted as <inline-formula>
<mml:math display="inline" id="im52">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mi>s</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula>
<mml:math display="inline" id="im53">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mi>c</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, respectively. The conversion relationship between these vectors is given by <inline-formula>
<mml:math display="inline" id="im54">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mi>c</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="bold-italic">J</mml:mtext>
<mml:mn>1</mml:mn>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mi>s</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>. Consequently, the linear velocity vector at which the robotic fish moves relative to the current in the <inline-formula>
<mml:math display="inline" id="im55">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mi>b</mml:mi>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> frame can be expressed as <inline-formula>
<mml:math display="inline" id="im56">
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mn>1</mml:mn>
<mml:mi>r</mml:mi>
</mml:msubsup>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mi>c</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>. By substituting <inline-formula>
<mml:math display="inline" id="im57">
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mn>1</mml:mn>
<mml:mi>r</mml:mi>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula> for <inline-formula>
<mml:math display="inline" id="im58">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, a new generalized velocity vector <inline-formula>
<mml:math display="inline" id="im59">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mi>r</mml:mi>
</mml:msub>
<mml:mtext>&#xa0;</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mover accent="true">
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mo mathvariant="bold">&#x2d9;</mml:mo>
</mml:mover>
<mml:mi>r</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mover accent="true">
<mml:mtext mathvariant="bold-italic">&#x3bd;</mml:mtext>
<mml:mo mathvariant="bold">&#x2d9;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:math>
</inline-formula>) is obtained.</p>
</sec>
<sec id="s3_3_3">
<label>3.3.3</label>
<title>Control forces and moments</title>
<p>Hybrid-driven robotic fish utilize propeller thrusters, pectoral fins, and the three-joint tail as actuators to facilitate propulsion, as shown in <xref ref-type="fig" rid="f4">
<bold>Figure&#xa0;4</bold>
</xref>. Depending on the motion contributions of these actuators during horizontal and vertical maneuvers of the robotic fish, they are classified into two categories: horizontal actuators and vertical actuators, each assigned a unique identifier. The control forces and moments produced by these distinct actuators can be expressed as <xref ref-type="disp-formula" rid="eq13">Equation 13</xref>
</p>
<fig id="f4" position="float">
<label>Figure&#xa0;4</label>
<caption>
<p>Horizontal and vertical actuators of hybrid-driven robotic fish.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g004.tif">
<alt-text content-type="machine-generated">Diagram of an underwater robotic fish showing labeled components: right and left pectoral fins with vertical actuators, right and left propellers with horizontal actuators, a heave propeller with a vertical actuator, and a three-joint tail with a horizontal actuator. Axes are marked as \(x_p\), \(y_b\), and origin as \(o_b\).</alt-text>
</graphic>
</fig>
<disp-formula id="eq13">
<label>(13)</label>
<mml:math display="block" id="M13">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mi>T</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mi>H</mml:mi>
<mml:mi>A</mml:mi>
<mml:mn>1</mml:mn>
<mml:mo>&amp;</mml:mo>
<mml:mi>H</mml:mi>
<mml:mi>A</mml:mi>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mi>V</mml:mi>
<mml:mi>A</mml:mi>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mi>V</mml:mi>
<mml:mi>A</mml:mi>
<mml:mn>2</mml:mn>
<mml:mo>&amp;</mml:mo>
<mml:mi>V</mml:mi>
<mml:mi>A</mml:mi>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mi>H</mml:mi>
<mml:mi>A</mml:mi>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</disp-formula>
<p>Where, <inline-formula>
<mml:math display="inline" id="im60">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mi>H</mml:mi>
<mml:mi>A</mml:mi>
<mml:mn>1</mml:mn>
<mml:mi>H</mml:mi>
<mml:mi>A</mml:mi>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula>
<mml:math display="inline" id="im61">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mi>V</mml:mi>
<mml:mi>A</mml:mi>
<mml:mn>2</mml:mn>
<mml:mi>V</mml:mi>
<mml:mi>A</mml:mi>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> are respectively the resultant forces and moments generated by the left and right propellers and pectoral fins, <inline-formula>
<mml:math display="inline" id="im62">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mi>V</mml:mi>
<mml:mi>A</mml:mi>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula>
<mml:math display="inline" id="im63">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mi>H</mml:mi>
<mml:mi>A</mml:mi>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> are respectively the forces and moments generated by the vertical propeller and three-joint tail.</p>
<sec id="s3_3_3_1">
<label>3.3.3.1</label>
<title>Propeller thruster</title>
<p>The propeller thrust <inline-formula>
<mml:math display="inline" id="im64">
<mml:mi>T</mml:mi>
</mml:math>
</inline-formula> and moment <inline-formula>
<mml:math display="inline" id="im65">
<mml:mi>Q</mml:mi>
</mml:math>
</inline-formula> can be obtained by CFD simulation, then, the coefficients <inline-formula>
<mml:math display="inline" id="im66">
<mml:mrow>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula>
<mml:math display="inline" id="im67">
<mml:mrow>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mi>Q</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> can be obtained as <xref ref-type="disp-formula" rid="eq14">Equation 14</xref>
</p>
<disp-formula id="eq14">
<label>(14)</label>
<mml:math display="block" id="M14">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mi>&#x3c1;</mml:mi>
<mml:msup>
<mml:mi>D</mml:mi>
<mml:mn>4</mml:mn>
</mml:msup>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>n</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mi>Q</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mi>Q</mml:mi>
<mml:mrow>
<mml:mi>&#x3c1;</mml:mi>
<mml:msup>
<mml:mi>D</mml:mi>
<mml:mn>5</mml:mn>
</mml:msup>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mi>n</mml:mi>
<mml:mo>|</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
<p>Where, <inline-formula>
<mml:math display="inline" id="im68">
<mml:mi>&#x3c1;</mml:mi>
</mml:math>
</inline-formula> is the fluid density, <inline-formula>
<mml:math display="inline" id="im69">
<mml:mi>n</mml:mi>
</mml:math>
</inline-formula> is the rotational speed of the propeller, and <inline-formula>
<mml:math display="inline" id="im70">
<mml:mi>D</mml:mi>
</mml:math>
</inline-formula> is the diameter of the propeller. Moreover, the relationship between the advance number <inline-formula>
<mml:math display="inline" id="im71">
<mml:mi>J</mml:mi>
</mml:math>
</inline-formula> and these coefficients was established.</p>
<p>The force and moment generated by the HA2 actuator of the robot fish is shown as <xref ref-type="fig" rid="f5">
<bold>Figure&#xa0;5a</bold>
</xref>. The force generated by the HA2 actuator is&#xa0;<inline-formula>
<mml:math display="inline" id="im72">
<mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and the moment is <inline-formula>
<mml:math display="inline" id="im73">
<mml:mrow>
<mml:msub>
<mml:mi>Q</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>. Where, <inline-formula>
<mml:math display="inline" id="im74">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is the vector from <inline-formula>
<mml:math display="inline" id="im75">
<mml:mrow>
<mml:msub>
<mml:mi>o</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> to the force center of HA2, and <inline-formula>
<mml:math display="inline" id="im76">
<mml:mrow>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is the moment generated by <inline-formula>
<mml:math display="inline" id="im77">
<mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> relative to the <inline-formula>
<mml:math display="inline" id="im78">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mi>b</mml:mi>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> frame. We can ignore <inline-formula>
<mml:math display="inline" id="im79">
<mml:mrow>
<mml:msub>
<mml:mi>Q</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> because of <inline-formula>
<mml:math display="inline" id="im80">
<mml:mrow>
<mml:mo>&#x2016;</mml:mo>
<mml:msub>
<mml:mi>Q</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mo>&#x2016;</mml:mo>
<mml:mo>&#x226a;</mml:mo>
<mml:mo>&#x2016;</mml:mo>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mo>&#x2016;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>, so that the resultant force and moment generated by the HA1 and HA2 actuators can be expressed as <xref ref-type="disp-formula" rid="eq15">Equation 15</xref>
</p>
<fig id="f5" position="float">
<label>Figure&#xa0;5</label>
<caption>
<p>Control force analysis of robot fish&#x2019;s motion actuators. <bold>(a)</bold> The HA2 actuator; <bold>(b)</bold> The VA2 and VA3 actuators; <bold>(c)</bold> The HA3 actuator.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g005.tif">
<alt-text content-type="machine-generated">Diagram illustrating a fish-like autonomous underwater vehicle with three labeled views: (a) side view showing axes and forces T_HA2 and Q_HA2; (b) front view with fin orientations and angles &#x3b1;, Y_VA2, Y_VA3, Z_VA2, Z_VA3; (c) overhead view depicting forces F_surge, F_sway, M_yaw, and angles &#x3b8;_offset, 1/2 A.</alt-text>
</graphic>
</fig>
<disp-formula id="eq15">
<label>(15)</label>
<mml:math display="block" id="M15">
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>1</mml:mn>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo>]</mml:mo>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mtext>&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;&#x2009;</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mi>&#x3c1;</mml:mi>
<mml:msup>
<mml:mi>D</mml:mi>
<mml:mn>4</mml:mn>
</mml:msup>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>e</mml:mi>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>e</mml:mi>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo>]</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo>|</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo>|</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo>]</mml:mo>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
</disp-formula>
<p>Where, <inline-formula>
<mml:math display="inline" id="im81">
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula>
<mml:math display="inline" id="im82">
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> are respectively the rotational speed of the HA1 and HA2 actuators, and <inline-formula>
<mml:math display="inline" id="im83">
<mml:mrow>
<mml:msub>
<mml:mi>e</mml:mi>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is a unit vector pointing in the positive direction of the <inline-formula>
<mml:math display="inline" id="im84">
<mml:mrow>
<mml:msub>
<mml:mi>o</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> axis.</p>
<p>Similarly, the force and moment provided by the VA1 actuator can be expressed as <xref ref-type="disp-formula" rid="eq16">Equation 16</xref>
</p>
<disp-formula id="eq16">
<label>(16)</label>
<mml:math display="block" id="M16">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>3</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>3</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo>]</mml:mo>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:mi>&#x3c1;</mml:mi>
<mml:msup>
<mml:mi>D</mml:mi>
<mml:mn>4</mml:mn>
</mml:msup>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo>|</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>3</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mtext mathvariant="bold-italic">S</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>3</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo>]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
<p>Where, <inline-formula>
<mml:math display="inline" id="im85">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is the vector from <inline-formula>
<mml:math display="inline" id="im86">
<mml:mrow>
<mml:msub>
<mml:mi>o</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> to the force action center of VA1, <inline-formula>
<mml:math display="inline" id="im87">
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is the rotational speed of the VA1 actuator and <inline-formula>
<mml:math display="inline" id="im88">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">e</mml:mtext>
<mml:mn>3</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is a unit vector pointing in the positive direction of the <inline-formula>
<mml:math display="inline" id="im89">
<mml:mrow>
<mml:msub>
<mml:mi>o</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> axis.</p>
</sec>
<sec id="s3_3_3_2">
<label>3.3.3.2</label>
<title>Pectoral fin</title>
<p>The hybrid-driven robotic fish we developed features two pectoral fins (the VA2 and VA3 actuators) that influence its heave motion, pitch angle, and roll angle, with each fin possessing two DOF. As shown in <xref ref-type="fig" rid="f5">
<bold>Figure&#xa0;5b</bold>
</xref>, the motion and force analysis of them is conducted using the VA3 actuator as an example. The flapping angle is defined as <inline-formula>
<mml:math display="inline" id="im90">
<mml:mi>&#x3b1;</mml:mi>
</mml:math>
</inline-formula>, and the rotating angle as <inline-formula>
<mml:math display="inline" id="im91">
<mml:mi>&#x3b4;</mml:mi>
</mml:math>
</inline-formula>. If the flapping angles <inline-formula>
<mml:math display="inline" id="im92">
<mml:mi>&#x3b1;</mml:mi>
</mml:math>
</inline-formula> of the VA2 and VA3 actuators are equal, then for a fixed <inline-formula>
<mml:math display="inline" id="im93">
<mml:mi>&#x3b1;</mml:mi>
</mml:math>
</inline-formula>, the position vectors from <inline-formula>
<mml:math display="inline" id="im94">
<mml:mrow>
<mml:msub>
<mml:mi>o</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> to the force centers of the VA2 and VA3 actuators are given by <inline-formula>
<mml:math display="inline" id="im95">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>r</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mi>T</mml:mi>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im96">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">r</mml:mtext>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>l</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mi>T</mml:mi>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, respectively. The rotating angles of the VA2 and VA3 actuators relative to the body are denoted as <inline-formula>
<mml:math display="inline" id="im97">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b4;</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula>
<mml:math display="inline" id="im98">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b4;</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>. Using the empirical formula for lift experienced by the airfoil, the lift generated by VA2 and VA3 actuators can be expressed as <xref ref-type="disp-formula" rid="eq17">Equation 17</xref>
</p>
<disp-formula id="eq17">
<label>(17)</label>
<mml:math display="block" id="M17">
<mml:mrow>
<mml:msub>
<mml:mi>L</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
<mml:mo>&amp;</mml:mo>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mn>1</mml:mn>
<mml:mn>2</mml:mn>
</mml:mfrac>
<mml:mi>&#x3c1;</mml:mi>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>L</mml:mi>
</mml:msub>
<mml:msub>
<mml:mi>S</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mi>u</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:msub>
<mml:mi>&#x3b4;</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
<mml:mo>&amp;</mml:mo>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:mi>u</mml:mi>
<mml:mi>w</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mi>u</mml:mi>
<mml:mi>q</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
<p>As shown in <xref ref-type="fig" rid="f5">
<bold>Figure&#xa0;5b</bold>
</xref>, through the flapping angle <inline-formula>
<mml:math display="inline" id="im99">
<mml:mi>&#x3b1;</mml:mi>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im100">
<mml:mrow>
<mml:msub>
<mml:mi>L</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula>
<mml:math display="inline" id="im101">
<mml:mrow>
<mml:msub>
<mml:mi>L</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> can be decomposed into the following forces and moments in the <inline-formula>
<mml:math display="inline" id="im102">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mi>b</mml:mi>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> frame (<xref ref-type="disp-formula" rid="eq18">Equation 18</xref>).</p>
<disp-formula id="eq18">
<label>(18)</label>
<mml:math display="block" id="M18">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable columnalign="left">
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>L</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mi>sin</mml:mi>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msub>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>L</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mi>cos</mml:mi>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msub>
<mml:mi>M</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msub>
<mml:mi>N</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mrow>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable columnalign="left">
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>L</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mtext>sin</mml:mtext>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msub>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>L</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mtext>cos</mml:mtext>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>z</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msub>
<mml:mi>M</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msub>
<mml:mi>N</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mtext>fin</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:math>
</disp-formula>
<p>Therefore, the resultant force and moment generated by the VA2 and VA3 actuators can be expressed as <xref ref-type="disp-formula" rid="eq19">Equation 19</xref>
</p>
<disp-formula id="eq19">
<label>(19)</label>
<mml:math display="block" id="M19">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
<mml:mo>&amp;</mml:mo>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>Z</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>M</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>M</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>N</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>N</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo>]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
</sec>
<sec id="s3_3_3_3">
<label>3.3.3.3</label>
<title>Three-joint tail</title>
<p>Define the rotation angle of the <italic>i</italic>-th (where <italic>i</italic> = 1, 2, 3) motion joint of the robotic fish as <inline-formula>
<mml:math display="inline" id="im103">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b8;</mml:mi>
<mml:mi>i</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> rad. In this study, we fix the robotic fish&#x2019;s tail swing amplitude <italic>A</italic> to be approximately 0.12 times the body length (BL). Based on the joint length conditions, the three-joint tail moving at a tail swing frequency <inline-formula>
<mml:math display="inline" id="im104">
<mml:mi>f</mml:mi>
</mml:math>
</inline-formula> has its swinging pattern fitted using an exponential fish-like body wave (<xref ref-type="bibr" rid="B30">Xue et&#xa0;al., 2020</xref>), specifically as <xref ref-type="disp-formula" rid="eq20">Equation 20</xref>
</p>
<disp-formula id="eq20">
<label>(20)</label>
<mml:math display="block" id="M20">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b8;</mml:mi>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>0.0973</mml:mn>
<mml:mi>sin</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mtext>&#x3c0;</mml:mtext>
<mml:mi>f</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1.635</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mtext>e</mml:mtext>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mi>t</mml:mi>
<mml:mrow>
<mml:mn>0.2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo>)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b8;</mml:mi>
<mml:mn>2</mml:mn>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>0.0760</mml:mn>
<mml:mi>sin</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mtext>&#x3c0;</mml:mtext>
<mml:mi>f</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>2.031</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mtext>e</mml:mtext>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mi>t</mml:mi>
<mml:mrow>
<mml:mn>0.2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo>)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b8;</mml:mi>
<mml:mn>3</mml:mn>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>0.134</mml:mn>
<mml:mi>sin</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mtext>&#x3c0;</mml:mtext>
<mml:mi>f</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>2.356</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mtext>e</mml:mtext>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mi>t</mml:mi>
<mml:mrow>
<mml:mn>0.2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo>)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
<p>The Strouhal number <italic>St</italic> is a dimensionless parameter used to characterize oscillatory flow phenomena and can be employed to describe the propulsion movement of fish (<xref ref-type="bibr" rid="B25">Triantafyllou, 1993</xref>).&#xa0;It directly governs the formation pattern and shedding frequency&#xa0;of the wake vortex street, thereby serving as the key dimensionless criterion in wake-vortex modeling for matching vortex strength with thrust pulsations. And it is defined as <inline-formula>
<mml:math display="inline" id="im105">
<mml:mrow>
<mml:mtext>St</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mi>A</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mi>U</mml:mi>
<mml:mi>s</mml:mi>
</mml:msub>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula>, where <inline-formula>
<mml:math display="inline" id="im106">
<mml:mrow>
<mml:msub>
<mml:mi>U</mml:mi>
<mml:mi>s</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mo>&#x2016;</mml:mo>
<mml:msub>
<mml:mi>&#x3bd;</mml:mi>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:msub>
<mml:mo>&#x2016;</mml:mo>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, represents the steady-state cruising speed. Using CFD software for numerical analysis and simulation of the robotic fish&#x2019;s movement, previous numerical studies (Costa et&#xa0;al., 2020; <xref ref-type="bibr" rid="B31">Yu and Huang, 2021</xref>) have indicated that: under&#xa0;the condition of a fixed tail swing amplitude <italic>A</italic>, the hydrodynamic coefficient of the actuator HA3 (with the force center at the intersection of the first tail joint&#x2019;s rotation axis and the <inline-formula>
<mml:math display="inline" id="im107">
<mml:mrow>
<mml:msub>
<mml:mi>o</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
<mml:msub>
<mml:mi>y</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> plane) is a function of the Strouhal number <italic>St</italic> and the tail swing frequency <inline-formula>
<mml:math display="inline" id="im108">
<mml:mi>f</mml:mi>
</mml:math>
</inline-formula>. Therefore, the force and moment can be expressed as <xref ref-type="disp-formula" rid="eq21">Equation 21</xref>
</p>
<disp-formula id="eq21">
<label>(21)</label>
<mml:math display="block" id="M21">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>F</mml:mi>
<mml:mrow>
<mml:mtext>surge</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mn>1</mml:mn>
<mml:mn>2</mml:mn>
</mml:mfrac>
<mml:mi>&#x3c1;</mml:mi>
<mml:msup>
<mml:mi>U</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:msub>
<mml:mi>S</mml:mi>
<mml:mrow>
<mml:mtext>Tail</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mtext>St,</mml:mtext>
<mml:mi>f</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>F</mml:mi>
<mml:mrow>
<mml:mtext>sway</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mn>1</mml:mn>
<mml:mn>2</mml:mn>
</mml:mfrac>
<mml:mi>&#x3c1;</mml:mi>
<mml:msup>
<mml:mi>U</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:msub>
<mml:mi>S</mml:mi>
<mml:mrow>
<mml:mtext>Tail</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>L</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mtext>St,</mml:mtext>
<mml:mi>f</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>M</mml:mi>
<mml:mrow>
<mml:mtext>yaw</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mn>1</mml:mn>
<mml:mn>2</mml:mn>
</mml:mfrac>
<mml:mi>&#x3c1;</mml:mi>
<mml:msup>
<mml:mi>U</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:msub>
<mml:mi>S</mml:mi>
<mml:mrow>
<mml:mtext>Tail</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>M</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mtext>St,</mml:mtext>
<mml:mi>f</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
<p>Where, <inline-formula>
<mml:math display="inline" id="im109">
<mml:mrow>
<mml:msub>
<mml:mi>S</mml:mi>
<mml:mrow>
<mml:mtext>Tail</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> represents the effective area during tail swinging, and <inline-formula>
<mml:math display="inline" id="im110">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mtext>St,</mml:mtext>
<mml:mi>f</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im111">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>L</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mtext>St,</mml:mtext>
<mml:mi>f</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>, and <inline-formula>
<mml:math display="inline" id="im112">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>M</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mtext>St,</mml:mtext>
<mml:mi>f</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> are the surge thrust coefficient, sway force coefficient, and yaw moment coefficient of the robotic fish&#x2019;s tail, respectively, obtained through CFD calculations.</p>
<p>The periodic asymmetric swinging of the robotic fish&#x2019;s tail causes it to move in a curved path (turning motion). To account for this while simplifying the complexity of modeling the tail actuator HA3, a bias angle <inline-formula>
<mml:math display="inline" id="im113">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b8;</mml:mi>
<mml:mrow>
<mml:mtext>offset</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is introduced only at the first joint of the tail. As shown in <xref ref-type="fig" rid="f5">
<bold>Figure&#xa0;5c</bold>
</xref>, after considering the bias angle <inline-formula>
<mml:math display="inline" id="im114">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b8;</mml:mi>
<mml:mrow>
<mml:mtext>offset</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> of the swing tail, the control force and moment generated by the tail actuator HA3 can be expressed as <xref ref-type="disp-formula" rid="eq22">Equation 22</xref>
</p>
<disp-formula id="eq22">
<label>(22)</label>
<mml:math display="block" id="M22">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>&#x3c4;</mml:mi>
<mml:mrow>
<mml:mtext>surge</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>HA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>F</mml:mi>
<mml:mrow>
<mml:mtext>surge</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mi>cos</mml:mi>
<mml:msub>
<mml:mi>&#x3b8;</mml:mi>
<mml:mrow>
<mml:mtext>offset</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>F</mml:mi>
<mml:mrow>
<mml:mtext>sway</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mi>sin</mml:mi>
<mml:msub>
<mml:mi>&#x3b8;</mml:mi>
<mml:mrow>
<mml:mtext>offset</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>&#x3c4;</mml:mi>
<mml:mrow>
<mml:mtext>sway</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>HA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>F</mml:mi>
<mml:mrow>
<mml:mtext>surge</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mi>sin</mml:mi>
<mml:msub>
<mml:mi>&#x3b8;</mml:mi>
<mml:mrow>
<mml:mtext>offset</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>F</mml:mi>
<mml:mrow>
<mml:mtext>sway</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mi>cos</mml:mi>
<mml:msub>
<mml:mi>&#x3b8;</mml:mi>
<mml:mrow>
<mml:mtext>offset</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>&#x3c4;</mml:mi>
<mml:mrow>
<mml:mtext>yaw</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>HA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>M</mml:mi>
<mml:mrow>
<mml:mtext>yaw</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>l</mml:mi>
<mml:mtext>d</mml:mtext>
</mml:msub>
<mml:msub>
<mml:mi>&#x3c4;</mml:mi>
<mml:mrow>
<mml:mtext>sway</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>HA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
<p>Here, <inline-formula>
<mml:math display="inline" id="im115">
<mml:mrow>
<mml:msub>
<mml:mi>l</mml:mi>
<mml:mtext>d</mml:mtext>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> denotes the distance from the center of the tail force to <inline-formula>
<mml:math display="inline" id="im116">
<mml:mrow>
<mml:msub>
<mml:mi>o</mml:mi>
<mml:mi>b</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>. That is, the force and moment generated by the tail actuator HA3 are <xref ref-type="disp-formula" rid="eq23">Equation 23</xref>
</p>
<disp-formula id="eq23">
<label>(23)</label>
<mml:math display="block" id="M23">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>&#x3c4;</mml:mi>
<mml:mrow>
<mml:mtext>surge</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>HA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>&#x3c4;</mml:mi>
<mml:mrow>
<mml:mtext>sway</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>HA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>&#x3c4;</mml:mi>
<mml:mrow>
<mml:mtext>yaw</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>HA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mtext>T</mml:mtext>
</mml:msup>
</mml:mrow>
</mml:math>
</disp-formula>
</sec>
</sec>
</sec>
<sec id="s3_4">
<label>3.4</label>
<title>Equation of motion</title>
<p>After thorough analysis, we have derived the final nonlinear equation of motion, which in the body-fixed frame can be written as <xref ref-type="disp-formula" rid="eq24">Equation 24</xref>.</p>
<disp-formula id="eq24">
<label>(24)</label>
<mml:math display="block" id="M24">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mi>B</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">M</mml:mtext>
<mml:mi>A</mml:mi>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mover accent="true">
<mml:mtext mathvariant="bold-italic">v</mml:mtext>
<mml:mo mathvariant="bold">&#x2d9;</mml:mo>
</mml:mover>
<mml:mo>+</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">C</mml:mtext>
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mi>B</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">v</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">C</mml:mtext>
<mml:mi>A</mml:mi>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">v</mml:mtext>
<mml:mi>r</mml:mi>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">v</mml:mtext>
<mml:mi>r</mml:mi>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:mi>D</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">v</mml:mtext>
<mml:mi>r</mml:mi>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">v</mml:mtext>
<mml:mi>r</mml:mi>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:mi>g</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mi>T</mml:mi>
</mml:msub>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mover accent="true">
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mo mathvariant="bold">&#x2d9;</mml:mo>
</mml:mover>
<mml:mo>=</mml:mo>
<mml:mtext mathvariant="bold-italic">J</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="bold-italic">&#x3b7;</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mtext mathvariant="bold-italic">v</mml:mtext>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
</sec>
</sec>
<sec id="s4">
<label>4</label>
<title>Hydrodynamic coefficient identification</title>
<sec id="s4_1">
<label>4.1</label>
<title>Added mass coefficients</title>
<p>Since the added mass coefficient is not affected by the oscillation frequency of the robotic fish, it can be assumed to be constant (<xref ref-type="bibr" rid="B7">Fossen, 1994</xref>). In the mathematical model, it is reasonable to assume that the shape of the robotic fish is an elongated ellipsoid. The formula for the diagonal added mass coefficient of the equivalent elongated ellipsoid (<xref ref-type="bibr" rid="B1">Ahmad Mazlan, 2015</xref>) is listed in <xref ref-type="disp-formula" rid="eq25">Equation 25</xref>.</p>
<disp-formula id="eq25">
<label>(25)</label>
<mml:math display="block" id="M25">
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>X</mml:mi>
<mml:mover accent="true">
<mml:mi>u</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:msub>
<mml:mo>&#x2009;</mml:mo>
<mml:mo>=</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b1;</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>&#x3b1;</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mfrac>
<mml:mi>m</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>Y</mml:mi>
<mml:mover accent="true">
<mml:mi>v</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:msub>
<mml:mo>&#x2009;</mml:mo>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>Z</mml:mi>
<mml:mover accent="true">
<mml:mi>w</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b2;</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>&#x3b2;</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mfrac>
<mml:mi>m</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mover accent="true">
<mml:mi>p</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:msub>
<mml:mo>&#x2009;</mml:mo>
<mml:mo>=</mml:mo>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>N</mml:mi>
<mml:mover accent="true">
<mml:mi>r</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:msub>
<mml:mo>&#x2009;</mml:mo>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>M</mml:mi>
<mml:mover accent="true">
<mml:mi>q</mml:mi>
<mml:mo>&#x2d9;</mml:mo>
</mml:mover>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mn>1</mml:mn>
<mml:mn>5</mml:mn>
</mml:mfrac>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mi>b</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mi>a</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b1;</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>&#x3b2;</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mi>b</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mi>a</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>+</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mi>b</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mi>a</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b2;</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mi>&#x3b1;</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mfrac>
<mml:mi>m</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>&#x3b1;</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
<mml:mo>&#x2009;</mml:mo>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mi>e</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:msup>
<mml:mi>e</mml:mi>
<mml:mn>3</mml:mn>
</mml:msup>
</mml:mrow>
</mml:mfrac>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mn>1</mml:mn>
<mml:mn>2</mml:mn>
</mml:mfrac>
<mml:mtext>ln</mml:mtext>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>+</mml:mo>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mo>)</mml:mo>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi>&#x3b2;</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
<mml:mo>&#x2009;</mml:mo>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mn>1</mml:mn>
<mml:mrow>
<mml:msup>
<mml:mi>e</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mi>e</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:msup>
<mml:mi>e</mml:mi>
<mml:mn>3</mml:mn>
</mml:msup>
</mml:mrow>
</mml:mfrac>
<mml:mtext>ln</mml:mtext>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>+</mml:mo>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
</disp-formula>
<p>Where, <italic>a</italic>, <italic>b</italic>, and <italic>c</italic> are the lengths of the three semi-axes of the robotic fish&#x2019;s equivalent ellipsoid, <inline-formula>
<mml:math display="inline" id="im117">
<mml:mrow>
<mml:mi>e</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>b</mml:mi>
<mml:mo stretchy="false">/</mml:mo>
<mml:mi>a</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mn>2</mml:mn>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> is the eccentricity, <inline-formula>
<mml:math display="inline" id="im118">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b1;</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula>
<mml:math display="inline" id="im119">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b2;</mml:mi>
<mml:mn>0</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> are variables related to <italic>e</italic>. Based on the calculations of the equivalent ellipsoid dimensions of the robotic fish, the added mass coefficients of the robotic fish can be determined, as shown in <xref ref-type="supplementary-material" rid="SM1">
<bold>Appendix A</bold>
</xref>.</p>
</sec>
<sec id="s4_2">
<label>4.2</label>
<title>CFD numerical model</title>
<sec id="s4_2_1">
<label>4.2.1</label>
<title>Computational domain construction</title>
<p>CFD simulations are employed to determine the hydrodynamic damping coefficients, thrust coefficients of swing tail, and thrust coefficients of propeller required for developing the mathematical model of the robotic fish. Initially, the propeller propulsion system and the three-joint tail propulsion system of the robotic fish are kept stationary relative to the head. The robotic fish is then subjected to various translational (sway, surge, heave) and rotational (roll, pitch, yaw) motions at different velocities, and the hydrodynamic damping coefficients are calculated for each direction individually. Subsequently, by simulating the self-propulsion of the robotic fish with different propeller rotational speeds and tail swing frequencies, and after determining the hydrodynamic conditions acting on the robotic fish, the thrust coefficients of the swing tail and the propeller are calculated. the robotic fish&#x2019;s self-propulsion movement only considers planar translational motion and does not account for the head&#x2019;s yaw oscillation. This is not an oversimplification or oversight but rather a necessary compromise for simulating the tail movement under different Strouhal numbers and acquiring thrust data from the three-joint tail and propeller propulsion system during the movement. To facilitate CFD simulations, the 3D model was simplified to a certain extent while retaining key geometric features, with virtual hinges between each joint.</p>
<p>A unified numerical simulation domain for a 3D virtual water tank flow field, with the dimensions of the virtual water tank set to: <inline-formula>
<mml:math display="inline" id="im120">
<mml:mrow>
<mml:mn>8.5</mml:mn>
<mml:mi>L</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>6.5</mml:mn>
<mml:mi>W</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>7.5</mml:mn>
<mml:mi>H</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> are constructed. Overlapping grid technology is employed to enable the robotic fish to perform translational and rotational movements in various directions. A combination of dynamic and overlapping grids is used to simulate the swinging motion of the robotic fish&#x2019;s three-joint tail relative to the <inline-formula>
<mml:math display="inline" id="im121">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mi>b</mml:mi>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> frame, as well as the forward swimming of the robotic fish relative to the <inline-formula>
<mml:math display="inline" id="im122">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mi>e</mml:mi>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> frame (<xref ref-type="bibr" rid="B29">Xue et&#xa0;al., 2023</xref>) [(substituting the movement of a small surrounding flow field around the robotic fish for itself]. Sliding grids are utilized to facilitate the rotational motion of the propeller thrusters relative to the <inline-formula>
<mml:math display="inline" id="im123">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mi>b</mml:mi>
<mml:mo>}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> frame.</p>
<p>As depicted in <xref ref-type="fig" rid="f6">
<bold>Figure&#xa0;6A</bold>
</xref>, both background and component grids are established, including the rotational domain of the propeller thrusters. Independent component grids are created for the outer flow field regions of the robotic fish tail&#x2019;s three joints, which are nested within the component grids of the overall outer flow field region that encloses the entire robotic fish. The component grids of the overall region are also nested within the background grid. A velocity-inlet boundary condition is applied with 0 m/s, and a pressure-outlet boundary condition is set with 0 Pa. The exterior surfaces of the robotic fish are defined as no-slip walls. The overlapping regions are designated as overset surfaces, and the grid sliding regions are set as interfaces.</p>
<fig id="f6" position="float">
<label>Figure&#xa0;6</label>
<caption>
<p>Computational domain and boundary condition settings. <bold>(A)</bold> Self-propulsion simulation setup for the robotic fish; <bold>(B)</bold> Six DOF hydrodynamic damping coefficients solution setup.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g006.tif">
<alt-text content-type="machine-generated">Diagram showing the meshing and hydrodynamic analysis of a robotic fish. (A) Depicts the component and background mesh regions with dimensions, illustrating the surface mesh of the robotic fish and propellers. Labels indicate different parts like over-set, wall, interface, velocity-inlet, and pressure-outlet. (B) Displays six panels showing hydrodynamic coefficients of surge, sway, heave, roll, pitch, and yaw, with arrows indicating flow directions and pressures.</alt-text>
</graphic>
</fig>
<p>As shown in <xref ref-type="fig" rid="f6">
<bold>Figure&#xa0;6B</bold>
</xref>, for the robotic fish&#x2019;s sway, surge, and heave motions, the relative motion between the robotic fish and the surrounding fluid domain is equivalently replaced by fixing the position of the robotic fish and varying the inlet velocity of the&#xa0;velocity-inlet boundary condition. The inlet velocity for the velocity-inlet boundary condition in different directions is set to <inline-formula>
<mml:math display="inline" id="im124">
<mml:mrow>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> m/s, with the pressure-outlet boundary condition set to 0 Pa, and all other boundary conditions remain consistent with the aforementioned setup. For the robotic fish&#x2019;s roll, pitch, and yaw motions, the overlapping grid technique is employed to define the relative rotational motion of the robotic fish&#x2019;s overlapping region. The inlet velocity for the velocity-inlet boundary condition is set to 0 m/s, with the pressure-outlet boundary condition set to 0 Pa, and all other boundary conditions remain consistent with the aforementioned setup.</p>
<p>The control equations for the numerical simulation domain of the hybrid-driven robotic fish are the averaged continuity equation and the Reynolds-averaged Navier-Stokes (RANS) equations in a 3D Cartesian coordinate system for incompressible flow (<xref ref-type="bibr" rid="B26">Versteeg and Malalasekera, 2007</xref>). To effectively solve these control equations, the following computational settings are chosen: a pressure-based solver, absolute velocity formulation, and transient time model; the <italic>k-&#x3c9;</italic> SST turbulence model; the Coupled algorithm for pressure-velocity coupling; in the solution methods, the gradient calculation uses a least-squares cell-based approach, the pressure term uses a second-order discretization scheme, the momentum term uses a second-order upwind scheme, and both the turbulent kinetic energy and dissipation rate use a second-order upwind scheme. The transient calculation scheme is first-order implicit, and other solution control parameters are in their general form. Additionally, the motion state of the robotic fish and the net force <inline-formula>
<mml:math display="inline" id="im125">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3c4;</mml:mi>
<mml:mrow>
<mml:mtext>BodyNet</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> acting on the robotic fish&#x2019;s body, as well as the force <inline-formula>
<mml:math display="inline" id="im126">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3c4;</mml:mi>
<mml:mrow>
<mml:mtext>prop</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> experienced by the propeller thrusters, are monitored.</p>
</sec>
<sec id="s4_2_2">
<label>4.2.2</label>
<title>Grid and time-step size independence verification</title>
<p>To enhance solution accuracy and conserve computational resources, a verification of grid size and time-step independence relative to simulation results is conducted to determine the most appropriate grid and time-step size. The background and component grid regions of the computational domain are divided into five size levels, with the requirement that the minimum orthogonal quality of all grids, except for the boundary layer, should not be less than 0.3. Five sets of body cell grid models are generated, corresponding to coarse, coarser, normal, finer, and fine levels (grid counts for different size levels: 390,974, 573,855, 947,726, 2,104,248, and 4,320,628). During the independence verification simulations using grids of different levels, the tail swing frequency and the propeller rotational speed are respectively set to 2 Hz and 1500 rpm, simulating the self-propulsion movement of the robotic fish under the hybrid-driven system. The surge cruising speed of the robotic fish after reaching a stable swimming state is designated as the observation parameter to verify independence.</p>
<p>As shown in <xref ref-type="fig" rid="f7">
<bold>Figure&#xa0;7A</bold>
</xref>, the cruising speed results for the normal grid level gradually converge with those of subsequent grids. Therefore, the normal-sized grid is selected for the time-step independence verification and subsequent formal simulation. Similarly, the time step is divided into five levels to verify its independence relative to the simulation results: 0.0025 s, 0.005 s, 0.0075 s, 0.001 s, and 0.00125 s. As depicted in <xref ref-type="fig" rid="f7">
<bold>Figure&#xa0;7B</bold>
</xref>, to ensure computational accuracy while minimizing the computational period and facilitating data storage, a time step of 0.01 s is chosen for the subsequent simulation process.</p>
<fig id="f7" position="float">
<label>Figure&#xa0;7</label>
<caption>
<p>The results of independence verification. <bold>(A)</bold> Grid size. <bold>(B)</bold> Time-step size.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g007.tif">
<alt-text content-type="machine-generated">Chart (A) shows the relationship between mesh level and cruising speed, with speed decreasing as mesh becomes finer. Chart (B) illustrates cruising speed varying slightly with different time-step levels. Both charts plot cruising speed in body lengths per second against respective variables.</alt-text>
</graphic>
</fig>
</sec>
</sec>
<sec id="s4_3">
<label>4.3</label>
<title>Damping coefficients identification</title>
<p>When the robotic fish moves in 3D space, the hydrodynamic damping forces it experiences in each direction are opposite to the corresponding velocity directions. When calculating the hydrodynamic coefficients for sway, surge, and heave, the velocity inlet <inline-formula>
<mml:math display="inline" id="im127">
<mml:mrow>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is defined for each direction as <inline-formula>
<mml:math display="inline" id="im128">
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>&#x223c;</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> m/s, <inline-formula>
<mml:math display="inline" id="im129">
<mml:mrow>
<mml:mi>v</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>&#x223c;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> m/s, and <inline-formula>
<mml:math display="inline" id="im130">
<mml:mrow>
<mml:mi>w</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>&#x223c;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> m/s, respectively. For calculating the hydrodynamic coefficients of roll, pitch, and yaw, the rotational velocities of the robotic fish along the three directions are defined as <inline-formula>
<mml:math display="inline" id="im131">
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo>=</mml:mo>
<mml:mi>q</mml:mi>
<mml:mo>=</mml:mo>
<mml:mi>r</mml:mi>
<mml:mo>=</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> 0.1745~0.8757 rad/s (equivalent to 10~50&#xb0;/s). Through CFD simulations, the converged values of the hydrodynamic damping forces and moments in the sway, surge, heave, roll, pitch, and yaw directions were obtained at different motion velocities. The CFD data and fitted curves that include standard deviation (std) bounds are shown in <xref ref-type="fig" rid="f8">
<bold>Figure&#xa0;8</bold>
</xref>. The coefficients of determination (R&#xb2;) for all curves are close to 1, indicating excellent fits and allowing for the determination of the damping coefficients for sway, surge, heave, roll, pitch, and yaw of the robotic fish, as detailed in <xref ref-type="supplementary-material" rid="SM1">
<bold>Appendix A</bold>
</xref>.</p>
<fig id="f8" position="float">
<label>Figure&#xa0;8</label>
<caption>
<p>Hydrodynamic damping fitting.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g008.tif">
<alt-text content-type="machine-generated">Six graphs display CFD data and curve fittings. Black crosses represent CFD data, and red dashed lines show curve fitting. Graphs illustrate torque versus velocity for variables \( u, v, w, p, q, \) and \( r \). Inset detail in the first graph highlights fit precision. R-squared values range from 0.9969 to 1.0000, indicating excellent fit across all graphs.</alt-text>
</graphic>
</fig>
</sec>
<sec id="s4_4">
<label>4.4</label>
<title>Thrust coefficients of tail and propellers</title>
<sec id="s4_4_1">
<label>4.4.1</label>
<title>Self-propulsion simulation parameter configuration</title>
<p>User-defined functions (UDF) are employed to define the tail swinging and propeller rotation of the robotic fish, simulating its transition from a stationary state to a converged state with stable forward swimming speed. By simulating the swimming motion of the robotic fish under various propeller rotational speeds and tail swing frequencies, the hydrodynamic coefficient variations of the tail and propellers in single or hybrid-driven modes are investigated. Eight propeller rotational speeds ranging from 500 rpm to 3000 rpm and six servomotor rotation frequencies ranging from 0.5 Hz to 3.0 Hz are set, resulting in 14 parameter configurations for single-driven mode. Combining these parameters, 24 parameter configurations for hybrid-driven mode are selected, with the detailed configuration methods shown in <xref ref-type="table" rid="T1">
<bold>Table&#xa0;1</bold>
</xref> (where &#x201c;&#x25cb;&#x201d; and &#x201c;&#xd7;&#x201d; in the table indicate whether the condition is selected).</p>
<table-wrap id="T1" position="float">
<label>Table&#xa0;1</label>
<caption>
<p>Parameter configurations.</p>
</caption>
<table frame="hsides">
<thead>
<tr>
<th valign="middle" rowspan="2" colspan="2" align="center">Parameters</th>
<th valign="middle" colspan="9" align="center">Propeller rotational speed (rpm)</th>
</tr>
<tr>
<th valign="middle" align="center">0</th>
<th valign="middle" align="center">500</th>
<th valign="middle" align="center">750</th>
<th valign="middle" align="center">1000</th>
<th valign="middle" align="center">1250</th>
<th valign="middle" align="center">1500</th>
<th valign="middle" align="center">2000</th>
<th valign="middle" align="center">2500</th>
<th valign="middle" align="center">3000</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="middle" rowspan="7" align="center" style="background-color:#ffffff">Tail swing frequency (Hz)</td>
<td valign="middle" align="center">0.0</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
</tr>
<tr>
<td valign="middle" align="center">0.5</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#xd7;</td>
</tr>
<tr>
<td valign="middle" align="center">1.0</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#xd7;</td>
</tr>
<tr>
<td valign="middle" align="center">1.5</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#xd7;</td>
</tr>
<tr>
<td valign="middle" align="center">2.0</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#xd7;</td>
</tr>
<tr>
<td valign="middle" align="center">2.5</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#xd7;</td>
</tr>
<tr>
<td valign="middle" align="center">3.0</td>
<td valign="middle" align="center">&#x25cb;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#xd7;</td>
<td valign="middle" align="center">&#xd7;</td>
</tr>
</tbody>
</table>
</table-wrap>
</sec>
<sec id="s4_4_2">
<label>4.4.2</label>
<title>Thrust coefficients</title>
<sec id="s4_4_2_1">
<label>4.4.2.1</label>
<title>Three-joint tail</title>
<p>In the process of the hybrid-driven robotic fish accelerating from rest to the cruising swimming speed, thrust is provided by the tail and propeller thrusters. Once the cruising swimming speed is reached (force equilibrium), the net force experienced by the fish&#x2019;s body is counterbalanced by the force exerted by the propeller thrusters, i.e., <inline-formula>
<mml:math display="inline" id="im132">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mtext>BodyNet</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mtext>prop</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mn>0</mml:mn>
<mml:mrow>
<mml:mn>6</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>. The thrust provided by the tail, <inline-formula>
<mml:math display="inline" id="im133">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, can be calculated as the sum of the net force on the fish&#x2019;s body at cruising speed, <inline-formula>
<mml:math display="inline" id="im134">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mrow>
<mml:mtext>BodyNet</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and the damping, <inline-formula>
<mml:math display="inline" id="im135">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mtext>D</mml:mtext>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> (where <inline-formula>
<mml:math display="inline" id="im136">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="bold-italic">&#x3c4;</mml:mtext>
<mml:mtext>D</mml:mtext>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is computed using the aforementioned hydrodynamic damping coefficients). Through CFD simulations, the forces and moments <inline-formula>
<mml:math display="inline" id="im137">
<mml:mrow>
<mml:msub>
<mml:mi>F</mml:mi>
<mml:mrow>
<mml:mtext>surge</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im138">
<mml:mrow>
<mml:msub>
<mml:mi>F</mml:mi>
<mml:mrow>
<mml:mtext>sway</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and <inline-formula>
<mml:math display="inline" id="im139">
<mml:mrow>
<mml:msub>
<mml:mi>M</mml:mi>
<mml:mrow>
<mml:mtext>yaw</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> acting on the fish&#x2019;s tail can be obtained. Furthermore, the instantaneous variations of <inline-formula>
<mml:math display="inline" id="im140">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im141">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>L</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and <inline-formula>
<mml:math display="inline" id="im142">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>M</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> can be determined using <xref ref-type="disp-formula" rid="eq21">Equation 21</xref>. By employing curvilinear regression methods to fit the variation curves of these coefficients, the instantaneous variation patterns of the thrust coefficients of swing tail, represented by trigonometric functions, are obtained for different tail swing frequencies and propeller rotational speed configurations as <xref ref-type="disp-formula" rid="eq26">Equation 26</xref>:</p>
<disp-formula id="eq26">
<label>(26)</label>
<mml:math display="block" id="M26">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mi>sin</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>4</mml:mn>
<mml:mi>&#x3c0;</mml:mi>
<mml:mi>f</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>L</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>y</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mi>sin</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>&#x3c0;</mml:mi>
<mml:mi>f</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>y</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>M</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>z</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mi>sin</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>&#x3c0;</mml:mi>
<mml:mi>f</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>z</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:math>
</disp-formula>
<p>Where, <inline-formula>
<mml:math display="inline" id="im143">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im144">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im145">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im146">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>y</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im147">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>y</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im148">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>z</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im149">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>z</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> are the parameters related to the tail thrust coefficients, as detailed in <xref ref-type="supplementary-material" rid="SM1">
<bold>Appendix B</bold>
</xref>.</p>
<p>It is worth noting that the parameters <inline-formula>
<mml:math display="inline" id="im150">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im151">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and <inline-formula>
<mml:math display="inline" id="im152">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> can represent the mean value of the surge thrust coefficient <inline-formula>
<mml:math display="inline" id="im153">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> over a certain period, the amplitude of periodic oscillation, and the phase, respectively, with similar interpretations for other parameters. By employing curvilinear regression analysis to examine the relationship between the hydrodynamic coefficient parameters and the Strouhal number <italic>St</italic>. It is found that <inline-formula>
<mml:math display="inline" id="im154">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im155">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im156">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>y</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and <inline-formula>
<mml:math display="inline" id="im157">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>z</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> can be approximated as quadratic functions of <italic>St</italic>, while <inline-formula>
<mml:math display="inline" id="im158">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im159">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>y</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and <inline-formula>
<mml:math display="inline" id="im160">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>z</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> can be considered as constants, as shown in <xref ref-type="fig" rid="f9">
<bold>Figure&#xa0;9</bold>
</xref>. The results are as follows: <inline-formula>
<mml:math display="inline" id="im165">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>0.01797</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.7047</mml:mn>
<mml:mi>S</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1.905</mml:mn>
<mml:mi>S</mml:mi>
<mml:msup>
<mml:mi>t</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im166">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>0.09809</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.3937</mml:mn>
<mml:mi>S</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>2.081</mml:mn>
<mml:mi>S</mml:mi>
<mml:msup>
<mml:mi>t</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im167">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>0.1025</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im168">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>y</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>20.97</mml:mn>
<mml:mi>S</mml:mi>
<mml:msup>
<mml:mi>t</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im169">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>y</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>3.205</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im170">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>z</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>17.16</mml:mn>
<mml:mi>S</mml:mi>
<mml:msup>
<mml:mi>t</mml:mi>
<mml:mn>2</mml:mn>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, and <inline-formula>
<mml:math display="inline" id="im171">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>z</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>13.31</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>. Consequently, the time-varying patterns of the thrust coefficients of swing tail <inline-formula>
<mml:math display="inline" id="im172">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im173">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>L</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and <inline-formula>
<mml:math display="inline" id="im174">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>M</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> with respect to the Strouhal number <italic>St</italic> and tail swing frequency <inline-formula>
<mml:math display="inline" id="im175">
<mml:mrow>
<mml:mi>f</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> are obtained. It is observed that when <inline-formula>
<mml:math display="inline" id="im176">
<mml:mrow>
<mml:mi>S</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>&lt;</mml:mo>
<mml:mn>0.33</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im177">
<mml:mrow>
<mml:msub>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mtext>x</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&lt;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, indicating that the robotic fish&#x2019;s tail cannot provide effective positive thrust at this point. For a complementary perspective on how the Strouhal number influences the wake field of the robotic fish, we have provided relevant discussion in the <xref ref-type="supplementary-material" rid="SM1">
<bold>Supplementary Material</bold>
</xref>.</p>
<fig id="f9" position="float">
<label>Figure&#xa0;9</label>
<caption>
<p>The variation patterns of the parameters related to the thrust coefficients of swing tail with respect to <inline-formula>
<mml:math display="inline" id="im161">
<mml:mrow>
<mml:mi>S</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. <bold>(A)</bold> Parameters related to surge thrust coefficient <inline-formula>
<mml:math display="inline" id="im162">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>; <bold>(B)</bold> Parameters related to sway force coefficient <inline-formula>
<mml:math display="inline" id="im163">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>L</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>; <bold>(C)</bold> Parameters related to yaw moment coefficient <inline-formula>
<mml:math display="inline" id="im164">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>M</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g009.tif">
<alt-text content-type="machine-generated">Three graphs (A, B, C) show the relationship between non-dimensional numbers (St) and response variables \(k_x\), \(k_y\), and \(k_z\). Each graph includes CFD data and curve fittings with standard deviations depicted by shaded areas. High R-squared values indicate good fits. Graph A displays \(k_x\), B shows \(k_y\), and C presents \(k_z\), with different curve fitting lines and legends for each.</alt-text>
</graphic>
</fig>
<p>In addition, if we define the overall system Reynolds number as <inline-formula>
<mml:math display="inline" id="im178">
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mi>e</mml:mi>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi>U</mml:mi>
<mml:mi>s</mml:mi>
</mml:msub>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mi>&#x3bd;</mml:mi>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula> (where <inline-formula>
<mml:math display="inline" id="im179">
<mml:mi>&#x3bd;</mml:mi>
</mml:math>
</inline-formula> is the kinematic viscosity of the fluid), the computed values listed in <xref ref-type="supplementary-material" rid="SM1">
<bold>Appendix B</bold>
</xref> span the range 10&#x2075;~10&#x2076;, placing the flow firmly in the fully turbulent regime. It is noteworthy that cases yielding nearly identical Strouhal numbers <italic>St</italic> can exhibit markedly different Reynolds numbers <italic>Re</italic>, whereas cases with similar <italic>Re</italic> may possess distinct <italic>St</italic>. This implies that neither <italic>St</italic> nor <italic>Re</italic> alone is sufficient to characterize the scale effects on tail-vortex dynamics and turbulent kinetic energy distribution. Consequently, when scaling prototypes up or down, simultaneous similarity in both <italic>St</italic> and <italic>Re</italic> must be maintained to reliably reproduce the thrust characteristics observed under laboratory conditions.</p>
</sec>
<sec id="s4_4_2_2">
<label>4.4.2.2</label>
<title>Propellers</title>
<p>By analyzing the relationship between the force <inline-formula>
<mml:math display="inline" id="im180">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3c4;</mml:mi>
<mml:mrow>
<mml:mtext>prop</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> experienced by the propeller thruster, as obtained from CFD calculations, and the advance number <inline-formula>
<mml:math display="inline" id="im181">
<mml:mi>J</mml:mi>
</mml:math>
</inline-formula>, and employing linear regression for data fitting, it is found that the thrust coefficient of propeller <inline-formula>
<mml:math display="inline" id="im182">
<mml:mrow>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> decreases with increasing advance number <inline-formula>
<mml:math display="inline" id="im183">
<mml:mi>J</mml:mi>
</mml:math>
</inline-formula>, exhibiting an approximate linear relationship, as shown in <xref ref-type="fig" rid="f10">
<bold>Figure&#xa0;10</bold>
</xref>. The curve relationship for the thrust coefficient is given by <xref ref-type="disp-formula" rid="eq27">Equation 27</xref>
</p>
<fig id="f10" position="float">
<label>Figure&#xa0;10</label>
<caption>
<p>The variation patterns of the thrust coefficient of propeller with respect to <inline-formula>
<mml:math display="inline" id="im184">
<mml:mrow>
<mml:mi>S</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g010.tif">
<alt-text content-type="machine-generated">Scatter plot showing a linear relationship between \( K_T \) on the y-axis and \( J \) on the x-axis. Black crosses represent CFD data points. A red dashed line indicates curve fitting, with a pink band showing the standard deviation. The R-squared value is 0.9764, indicating a strong fit.</alt-text>
</graphic>
</fig>
<disp-formula id="eq27">
<label>(27)</label>
<mml:math display="block" id="M27">
<mml:mrow>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.4674</mml:mn>
<mml:mi>J</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>0.4421</mml:mn>
</mml:mrow>
</mml:math>
</disp-formula>
<p>Thus, by combining theoretical calculations and CFD simulations, we have identified the nonlinear hydrodynamic coefficients required for the dynamics model of the robotic fish, thereby fully constructing the mathematical model of the hybrid-driven robotic fish system.</p>
</sec>
</sec>
</sec>
</sec>
<sec id="s5">
<label>5</label>
<title>Model validation and maneuverability analysis of simulation results</title>
<sec id="s5_1">
<label>5.1</label>
<title>Simulation model construction</title>
<p>As shown in <xref ref-type="fig" rid="f11">
<bold>Figure&#xa0;11</bold>
</xref>, based on the motion equations of the hybrid-driven robotic fish derived earlier, a maneuverability simulation model was constructed in the MATLAB/Simulink environment, with its framework structure. The control input signals for the hybrid-driven robotic fish system include the swinging frequency <inline-formula>
<mml:math display="inline" id="im185">
<mml:mi>f</mml:mi>
</mml:math>
</inline-formula> and the swinging offset <inline-formula>
<mml:math display="inline" id="im186">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b8;</mml:mi>
<mml:mrow>
<mml:mtext>offset</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> of the three-joint tail actuator HA3; the rotational speeds <inline-formula>
<mml:math display="inline" id="im187">
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im188">
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and <inline-formula>
<mml:math display="inline" id="im189">
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> of the left and right horizontal propeller thrusters HA1 and HA2, and the heave propeller thruster VA1; and the angles <inline-formula>
<mml:math display="inline" id="im190">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b4;</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula>
<mml:math display="inline" id="im191">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b4;</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> of the left and right pectoral fins VA2 and VA3 relative to the body. The output signals are the position and&#xa0;attitude vector <inline-formula>
<mml:math display="inline" id="im192">
<mml:mi>&#x3b7;</mml:mi>
</mml:math>
</inline-formula> and velocity vector <inline-formula>
<mml:math display="inline" id="im193">
<mml:mi>v</mml:mi>
</mml:math>
</inline-formula> of the robotic fish.</p>
<fig id="f11" position="float">
<label>Figure&#xa0;11</label>
<caption>
<p>Maneuverability simulation model. <bold>(A)</bold> MATLAB/Simulink simulation model; <bold>(B)</bold> System simulation framework.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g011.tif">
<alt-text content-type="machine-generated">Diagram (A) depicts a block flow of a robotic-fish control and animation system, showing control parameter input, robotic-fish model, state estimates, and VR animation outputs. Diagram (B) illustrates a detailed mechanical model with sections for actuator dynamics, robot dynamics, and kinematics, including inputs and outputs for a robotic system.</alt-text>
</graphic>
</fig>
</sec>
<sec id="s5_2">
<label>5.2</label>
<title>Maneuverability performance analysis and experimental verification</title>
<sec id="s5_2_1">
<label>5.2.1</label>
<title>Surge motion speed</title>
<p>The surge motion swimming speed of the robotic fish directly reflects its locomotive capability. To analyze the surge speed and validate the accuracy of the simulation model, we compared the results obtained from CFD simulations, the numerical simulation model established in Simulink, and the measurements from the prototype experiments. We compared the cruising speeds of the robotic fish under both single-propulsion modes and the hybrid-drive mode.</p>
<p>The swimming speed measurement experiments for the robotic fish prototype were conducted in a water tank of fixed dimensions, where the swimming speed was calculated by measuring the time it took for the robotic fish to travel a fixed distance (excluding the distance covered during the initial acceleration phase). The rotation speed range of the propeller thrusters was set between 500 and 3000 rpm. To ensure that the servomotors of the swinging joints were not damaged (due to the large size of the robotic fish, a high swinging frequency would increase the hydrodynamic forces on the joints, causing the servomotors to overload), the tail swinging frequency of the prototype was limited to within 1.5 Hz. Each set of experiments was conducted six times, and the average of the measurement results was taken along with an error analysis.</p>
<p>As shown in <xref ref-type="fig" rid="f12">
<bold>Figure&#xa0;12A</bold>
</xref>, in the pure propeller propulsion mode, the three sets of results show good agreement. However, in the pure tail swinging mode, the CFD results overestimate the cruising speed. From the perspectives of fluid mechanics and energy conservation, the overestimation originates from an energy-budget imbalance caused by &#x201c;degree-of-freedom truncation&#x201d; (<xref ref-type="bibr" rid="B15">Liu et&#xa0;al., 2021</xref>). During straight-line propulsion, the periodic lateral force generated by the tail fin produces not only longitudinal thrust but also coupled yaw and sway motions. These additional degrees of freedom continuously alter the instantaneous angle of attack of the oncoming flow relative to the tail, inducing extra lateral vortex shedding and energy dissipation. In the CFD computations, however, the fish body is constrained to planar surge motion, shutting down the two aforementioned dissipation pathways. Consequently, the mechanical energy that should have been consumed by yaw and sway damping is still counted as &#x201c;effective propulsive work&#x201d;, thereby artificially inflating the propulsive efficiency of the tail fin. However, this does not significantly affect our study, as our focus is on the variation patterns of the hydrodynamic coefficients, rather than the motion state of the robotic fish. Within a limited range, the Simulink simulation and experimental results exhibit good consistency, which to some extent validates the reliability of the established simulation model.</p>
<fig id="f12" position="float">
<label>Figure&#xa0;12</label>
<caption>
<p>Comparison of simulation and experiment results under two single-propulsion modes. <bold>(A)</bold> The cruising surge speeds; <bold>(B)</bold> The instantaneous surge speed of the propeller propulsion mode; <bold>(C)</bold> The instantaneous surge speed of the tail swing propulsion mode.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g012.tif">
<alt-text content-type="machine-generated">A composite image showing:  (A) A graph plotting cruising surge speed versus propeller rotational speed with data from CFD, experiments, and simulations. Three images illustrate propeller propulsion through CFD, experimentation, and simulation, and two images depict tail swinging propulsion via CFD and experimentation.  (B) A graph displaying speed over time for different propeller speeds ranging from 500 to 3000 revolutions per minute.  (C) A graph showing speed over time for various tail swing frequencies from 0.5 to 2.0 Hertz.</alt-text>
</graphic>
</fig>
<p>Using the simulation platform, the horizontal plane instantaneous surge speed of the robotic fish was analyzed under two conditions: when propelled by the horizontal propeller thrusters and when propelled by the swinging tail. By varying the propeller rotational speed and the tail swing frequency, different swimming speeds can be achieved. <xref ref-type="fig" rid="f12">
<bold>Figures&#xa0;12B, C</bold>
</xref> display the instantaneous swimming speed curves at different propeller rotational speeds and tail swing frequencies, respectively, without underwater current disturbances. It can be observed that, under the influence of the propellers, as the rotation speed increases, the maximum surge speed that the robotic fish can achieve gradually increases, and the time required to reach this speed decreases. Within the rotation speed range of 500 to 3000 rpm, the surge speed of the robotic fish can reach 0.23 to 1.6 BL/s. Under the influence of tail swinging, as the tail swing frequency increases, the thrust provided also increases, leading to a higher achievable surge speed and a shorter time to reach this speed. Due to the periodic oscillation of the thrust from the three-joint tail propulsion system, the instantaneous swimming speed of the robotic fish exhibits periodic oscillation. Within the tail swing frequency range of 0.5 to 2 Hz, the surge motion speed of the robotic fish can reach 0.04 to 0.23 BL/s.</p>
<p>During hybrid-driven trials, both Simulink simulations and prototype tests revealed that the robotic fish suffered from poor straight-line stability caused by persistent yaw motion. This issue became most pronounced when high propeller speeds were paired with low tail-beat frequencies. According to the preceding CFD analysis, this occurs because the Strouhal number falls below 0.33, so the tail generates virtually no useful thrust while its lateral sweeps still produce yawing moments. These moments interact with the surge force delivered by the propellers, causing the yaw angle to accumulate and the vehicle to drift off the intended straight path. <xref ref-type="fig" rid="f13">
<bold>Figure&#xa0;13</bold>
</xref> compares the cruising speeds achieved in hybrid mode for tail swing frequencies of 1 Hz and 1.5 Hz within a limited propeller-speed envelope. Simulink predictions and experimental data agree closely, whereas CFD again slightly overestimates the speed. Under conditions that still allow straight-line swimming, a tail swing frequency of 1.5 Hz combined with a propeller speed of 1500 rpm yields approximately 0.63 BL/s.</p>
<fig id="f13" position="float">
<label>Figure&#xa0;13</label>
<caption>
<p>Comparison of simulation and experiment results under hybrid-drive mode.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g013.tif">
<alt-text content-type="machine-generated">The image consists of two graphs and three images showing data and visual comparisons related to cruising surge speed of a fish-like autonomous underwater vehicle. The graphs display cruising speed against propeller rotational speed, comparing CFD, experimental, and simulation data at frequencies of one Hertz and one point five Hertz. The CFD section shows a computational fluid dynamics model, the experiment section depicts a top view of a tank test with the vehicle, and the simulation section shows a 3D model of the vehicle.</alt-text>
</graphic>
</fig>
</sec>
<sec id="s5_2_2">
<label>5.2.2</label>
<title>Minimum turning radiuses</title>
<p>The minimum turning radius of the robotic fish reflects its maneuverability and flexibility. There are four ways to achieve planar turning motion for the robotic fish: 1) Pure tail swinging: The tail swings asymmetrically along the fish&#x2019;s tail, with the horizontal thrusters turned off; 2) Pure propeller propulsion: The two propeller thrusters rotate at different speeds, with no tail swinging; 3) Hybrid drive method A: The tail swings symmetrically, and the horizontal propeller thrusters rotate at different speeds; 4) Hybrid drive method B: The tail swings asymmetrically, and the horizontal propeller thrusters rotate at the same speed. The results of methods 1 and 2 represent the minimum turning radii of the robotic fish in two single modes, while the results of methods 3 and 4 will not be smaller than those of method 2. The maximum tail swing offset of the robotic fish is set to 45&#xb0;, and the maximum differential speed of the two horizontal thrusters is 3000 rpm (the upper limit of the thruster speed). As shown in <xref ref-type="fig" rid="f14">
<bold>Figure&#xa0;14A</bold>
</xref>, in an outer lake, the circular motion of the robotic fish moving with the maximum tail swing offset at different swinging frequencies or with different differential speeds of the horizontal propeller thrusters (with one propeller thruster rotational speed at 0) is tested and analyzed, without underwater current disturbances. The experimental and simulation results are presented in <xref ref-type="fig" rid="f14">
<bold>Figures&#xa0;14B, C</bold>
</xref>. In the pure tail swinging mode, the turning radius of the robotic fish moving with the maximum tail swing offset at different swinging frequencies is very close, with the minimum value being around 2.9 BL at a swinging frequency of 1 Hz. In the pure propeller propulsion mode, the turning radius decreases as the speed difference between the two horizontal thrusters increases, with the minimum value being around 0.6 BL at a speed difference of 3000 rpm. It is evident that the differential rotation of the two horizontal propellers enables the robotic fish to have a smaller turning radius, indicating stronger maneuverability and flexibility.</p>
<fig id="f14" position="float">
<label>Figure&#xa0;14</label>
<caption>
<p>Circular-turn trajectories of the robotic fish. <bold>(A)</bold> Overview of the swimming sequence; <bold>(B)</bold> Turning radius with the maximum tail-swing offset at various beating frequencies; <bold>(C)</bold> Turning radius under different differential thrust settings of the horizontal propellers.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g014.tif">
<alt-text content-type="machine-generated">Panel A shows a sequence of nine images illustrating a light-colored fish's movement through water, labeled one to nine. Panel B is a graph comparing simulation and experimental data on turning radius versus tail-beat frequency, ranging from 0.5 to 2.0 Hertz. Panel C presents a graph comparing simulation and experimental data on turning radius versus propeller rotational speed, ranging from 500 to 3000 revolutions per minute.</alt-text>
</graphic>
</fig>
</sec>
<sec id="s5_2_3">
<label>5.2.3</label>
<title>Motion characteristics in the 3D space</title>
<p>In addition to testing the aforementioned planar motion metrics, the robotic fish we developed also possesses the capability for 3D spatial motion. By utilizing its heave propeller and pectoral fin rotation, it can generate heave forces and moments, thereby enabling its movement in the vertical plane. Due to experimental constraints (lack of underwater filming equipment), we only verified the robotic fish&#x2019;s diving and surfacing capabilities, as shown in <xref ref-type="fig" rid="f15">
<bold>Figure&#xa0;15</bold>
</xref>. </p>
<fig id="f15" position="float">
<label>Figure&#xa0;15</label>
<caption>
<p>The submerged movement of the robotic fish.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g015.tif">
<alt-text content-type="machine-generated">A series of nine images show a yellow object, possibly a fish or a device, attached to a rope in a body of water. The sequence captures the object submerged and creating ripples from positions 1 to 9. Reflections of nearby vegetation are visible on the water's surface.</alt-text>
</graphic>
</fig>
<p>To demonstrate the capability for 3D spatial motion, we have also utilized the Virtual Reality Simulation module in Matlab/Simulink to visualize the motion of the robotic fish, as shown in <xref ref-type="fig" rid="f16">
<bold>Figure&#xa0;16</bold>
</xref>. We have presented several typical motion scenarios of the robotic fish, including 3D helical motion, right-angle motion in the vertical plane, and &#x201c;V&#x201d;-shaped diving and surfacing motion. Specifically, <xref ref-type="fig" rid="f16">
<bold>Figure&#xa0;16A</bold>
</xref> shows the robotic fish moving in the biomimetic propulsion mode, with a simulation duration <inline-formula>
<mml:math display="inline" id="im194">
<mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mn>1</mml:mn>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>180</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> s, and simulation inputs of swinging frequency <italic>f</italic> = 2 Hz, swinging offset <inline-formula>
<mml:math display="inline" id="im195">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b8;</mml:mi>
<mml:mrow>
<mml:mtext>offset</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>45</mml:mn>
<mml:mo>&#xb0;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>, and pectoral fin angles <inline-formula>
<mml:math display="inline" id="im196">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b4;</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>&#x3b4;</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>30</mml:mn>
<mml:mo>&#xb0;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>. <xref ref-type="fig" rid="f16">
<bold>Figure&#xa0;16B</bold>
</xref> illustrates the robotic fish moving in the propeller propulsion mode, with a simulation duration <inline-formula>
<mml:math display="inline" id="im197">
<mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mn>2</mml:mn>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>100</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> s, and simulation inputs for the propeller speeds <inline-formula>
<mml:math display="inline" id="im198">
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>500</mml:mn>
<mml:mi>u</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> rpm, <inline-formula>
<mml:math display="inline" id="im199">
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>500</mml:mn>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>u</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> rpm, where <inline-formula>
<mml:math display="inline" id="im200">
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> is a unit step function with a step time of <inline-formula>
<mml:math display="inline" id="im201">
<mml:mrow>
<mml:mn>0.5</mml:mn>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mn>2</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>. <xref ref-type="fig" rid="f16">
<bold>Figure&#xa0;16C</bold>
</xref> depicts the robotic fish moving in the hybrid-driven mode, with a simulation duration <inline-formula>
<mml:math display="inline" id="im202">
<mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mn>3</mml:mn>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>100</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> s, where the horizontal thrusters provide thrust for straight-line motion, and the pectoral fin rotation provides heave force for vertical diving and surfacing. The simulation inputs are the speeds of the two horizontal propeller thrusters <inline-formula>
<mml:math display="inline" id="im203">
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>500</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> rpm, and the pectoral fin angles <inline-formula>
<mml:math display="inline" id="im204">
<mml:mrow>
<mml:msub>
<mml:mi>&#x3b4;</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>&#x3b4;</mml:mi>
<mml:mrow>
<mml:mtext>VA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>60</mml:mn>
<mml:mo>&#xb0;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>&#x3b4;</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>, where <inline-formula>
<mml:math display="inline" id="im205">
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> is a unit pulse function with a period of <inline-formula>
<mml:math display="inline" id="im206">
<mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mn>3</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and a pulse width of <inline-formula>
<mml:math display="inline" id="im207">
<mml:mrow>
<mml:mn>0.5</mml:mn>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mn>3</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>. By activating different motion actuators of the hybrid-driven robotic fish, various motion states can be achieved, demonstrating the robotic fish&#x2019;s excellent 3D motion performance.</p>
<fig id="f16" position="float">
<label>Figure&#xa0;16</label>
<caption>
<p>The typical motion scenarios. <bold>(A)</bold> Movement in the biomimetic propulsion mode; <bold>(B)</bold> Movement in the propeller propulsion mode; <bold>(C)</bold> Movement in the hybrid-driven mode.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g016.tif">
<alt-text content-type="machine-generated">Diagram and 3D graphs illustrating the path of a robotic fish in three scenarios. (A) Shows a zigzag path near the sea surface with a 3D spiral graph. (B) Displays a vertical descent to the seabed, depicted by a 3D downward path graph. (C) Illustrates a horizontal movement near the mountain, depicted by a 3D graph with a curved trajectory. Each scenario includes labels for the boat, sea level, and seabed.</alt-text>
</graphic>
</fig>
</sec>
</sec>
<sec id="s5_3">
<label>5.3</label>
<title>Uncertainty analysis of hydrodynamic coefficients</title>
<p>Ocean-current disturbances and other stochastic environmental factors introduce parametric uncertainties that perturb the system&#x2019;s hydrodynamic coefficients. To further investigate the influence of these coefficients on the system&#x2019;s dynamic performance under uncertain disturbances, we introduced a time-varying random noise with an amplitude not exceeding &#xb1;10% of the original coefficient, based on these coefficients obtained from CFD simulations. This perturbation of the hydrodynamic parameters aims to quantify the influence of uncertainties on the hydrodynamic coefficients and to further analyze their influence on the system dynamic output. The specific procedures are as follows: (1) Added-mass coefficients: perturbation limits are set as a fixed base value scaled by a prescribed percentage and superimposed on the original coefficients. (2) Damping coefficients: linear and quadratic nominal values are scaled by the same percentage to generate perturbation limits, which are then added to the original coefficients. (3) Propeller thrust coefficient <inline-formula>
<mml:math display="inline" id="im208">
<mml:mrow>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>: constant coefficients (&#x2013;0.4674 and 0.4421) scaled by the prescribed percentage define the perturbation limits, which are then added on the original coefficient. (4) Tail thrust coefficients <inline-formula>
<mml:math display="inline" id="im209">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula>
<mml:math display="inline" id="im210">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>L</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and <inline-formula>
<mml:math display="inline" id="im211">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>M</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>: perturbation limits are set as the current nominal values scaled by the prescribed percentage and added to the original coefficients.</p>
<p>Taking the planar straight-line swimming motion of the robotic fish as an example, the influence of hydrodynamic coefficients perturbation on the surge speed of the robotic fish is analyzed under two single propulsion modes. For the propeller propulsion mode and the tail swinging propulsion mode, the control commands for the actuators are respectively set to <inline-formula>
<mml:math display="inline" id="im212">
<mml:mrow>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mtext>HA</mml:mtext>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>=</mml:mo>
<mml:mn>2000</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> rpm and <inline-formula>
<mml:math display="inline" id="im213">
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>2</mml:mn>
<mml:mtext>Hz</mml:mtext>
</mml:mrow>
</mml:math>
</inline-formula>, with all other parameters set to 0. As shown in <xref ref-type="fig" rid="f17">
<bold>Figures&#xa0;17</bold>
</xref>, <xref ref-type="fig" rid="f18">
<bold>18</bold>
</xref>, within the range of parameter perturbation, the surge speed <inline-formula>
<mml:math display="inline" id="im214">
<mml:mi>u</mml:mi>
</mml:math>
</inline-formula> in the propeller propulsion mode remains essentially consistent with that without parameter perturbation, exhibiting only minor fluctuations. In contrast, under the tail swinging propulsion mode, as the parameter perturbation intensifies, the fluctuation range of the surge speed significantly increases. Meanwhile, this observation indicates that within the same level of parametric perturbation, the variation in surge speed is more pronounced in the tail swinging propulsion mode. Therefore, when environmental disturbances are significant and thrust coefficient perturbation is severe, it is advisable to employ the propeller propulsion mode rather than the tail swinging propulsion mode to ensure the stability of the robotic fish&#x2019;s motion.</p>
<fig id="f17" position="float">
<label>Figure&#xa0;17</label>
<caption>
<p>Influence of perturbations in Radiation-induced force coefficients on surge speed. <bold>(A)</bold> Propeller propulsion mode; <bold>(B)</bold> Tail swinging propulsion mode.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g017.tif">
<alt-text content-type="machine-generated">Two graphs labeled A and B show velocity \(u\) in BL/s over time in seconds with varying percentages (0% to 10%). Graph A shows a steep increase, leveling off near 1 with minor fluctuations highlighted in an inset around 20 to 30 seconds. Graph B shows a similar trend, leveling near 0.27 to 0.3 with distinct oscillations highlighted in the inset from 25 to 30 seconds. Both graphs include a legend indicating the percentage levels.</alt-text>
</graphic>
</fig>
<fig id="f18" position="float">
<label>Figure&#xa0;18</label>
<caption>
<p>Influence of perturbations in thrust coefficients on surge speed. <bold>(A)</bold> Propeller propulsion mode; <bold>(B)</bold> Tail swinging propulsion mode.</p>
</caption>
<graphic mimetype="image" mime-subtype="tiff" xlink:href="fmars-12-1648335-g018.tif">
<alt-text content-type="machine-generated">Two line graphs labeled A and B show velocity \(u\) in body lengths per second (BL/s) over 30 seconds with varying concentration percentages (0% to 10%). Graph A shows a steady rise and plateau with a zoomed-in fluctuating region between 20 and 30 seconds. Graph B shows a similar rise with more pronounced oscillations, particularly visible in the zoomed-in section from 25 to 30 seconds. Both graphs include legend with symbols indicating the concentration levels.</alt-text>
</graphic>
</fig>
</sec>
</sec>
<sec id="s6" sec-type="conclusions">
<label>6</label>
<title>Conclusion</title>
<p>This study conducted mathematical modeling, prototype testing and maneuverability simulation based on the proposed hybrid-driven robotic. The conclusions of the work are as follows.</p>
<list list-type="order">
<list-item>
<p>A hybrid-driven robotic fish equipped with both biomimetic fin and propeller propulsion was designed and manufactured. Considering the effects of added mass forces and fluid damping forces, a coupled mathematical model of hydrodynamics and mechanical dynamics for the hybrid-driven robotic fish was established based on classical rigid body dynamics theory.</p>
</list-item>
<list-item>
<p>A numerical simulation model of the robotic fish was established using 3D modeling and CFD simulation software. Hydrodynamic data fitting method was used to obtain the hydrodynamic damping coefficient of the robotic fish&#x2019;s body, the thrust coefficient of the swing tail, and the thrust coefficient of propeller, thereby supplementing and perfecting the dynamics model of the hybrid-driven robotic fish. It was found that the surge thrust coefficient <inline-formula>
<mml:math display="inline" id="im215">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, sway force coefficient <inline-formula>
<mml:math display="inline" id="im216">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>L</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and yaw moment coefficient <inline-formula>
<mml:math display="inline" id="im217">
<mml:mrow>
<mml:msub>
<mml:mi>C</mml:mi>
<mml:mi>M</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> of the robotic fish&#x2019;s three-joint tail can all be fitted as explicit functions related to the tail swing frequency <italic>f</italic> and the Strouhal number <italic>St</italic> in the time domain. When <italic>St</italic>&lt; 0.33, the tail cannot provide effective positive thrust. The thrust coefficient of propeller <inline-formula>
<mml:math display="inline" id="im218">
<mml:mrow>
<mml:msub>
<mml:mi>K</mml:mi>
<mml:mi>T</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> was approximately linearly negatively correlated with the advance number <italic>J</italic>, consistent with the characteristic curve of the propeller.</p>
</list-item>
<list-item>
<p>By comparing the CFD calculation results, Simulink simulation results, and prototype test results for the multiple motion state of the robotic fish, a MATLAB/Simulink simulation platform for the motion of the hybrid-driven robotic fish was constructed and validated. Based on the simulation platform, the locomotive capabilities and maneuverability of the robotic fish were analyzed. In the propeller propulsion mode, within the horizontal propeller rotation speed range from 500 rpm to 3000 rpm, the straight-line speed of the robotic fish can reach from 0.23 BL/s to 1.6 BL/s, and the minimum turning radius can be 0.6 BL when the speed difference between the two propellers was 3000 rpm. In the tail swing drive mode, within the tail swing frequency range from 0.5 Hz to 2 Hz, the straight-line speed of the robotic fish can reach from 0.04 to 0.23 BL/s, and the minimum turning radius can be 2.9 BL at the tail swing frequency of 1 Hz. Additionally, several typical 3D spatial motion scenarios were designed using the three drive modes of the robotic fish, and virtual reality techniques were employed for visualization, demonstrating the 3D spatial motion capabilities of the hybrid-driven robotic fish.</p>
</list-item>
</list>
<p>Moreover, the influence of perturbations in hydrodynamic coefficients on surge speed was analyzed based on the simulation platform. The results indicated that the propeller mode exhibits markedly superior robustness to parameter perturbations compared with the tail swing mode, making it the preferred configuration for deployment in highly disturbed underwater environments.</p>
<p>This research provides valuable insights into the exploration and design of new types of high-performance and efficient biomimetic underwater robots, primarily addressing the dynamics analysis, hydrodynamic coefficient identification, and open-loop manipulation system simulation modeling issues of the hybrid-driven robotic fish. Furthermore, the rationality and effectiveness of the dynamics model are validated through the simulation analysis and prototype testing of the robotic fish&#x2019;s motion state, laying the groundwork and theoretical foundation for further research on the complex closed-loop system motion control of the hybrid-driven robotic fish.</p>
<p>Building on this foundation, our future work will concentrate on guidance and motion control of the robotic fish: constructing a state observer for real-time motion estimation and feedback generation; dynamically allocating control inputs for the under-actuated system based on guidance laws; and devising mode-switching strategies together with dedicated controllers. The ultimate goal is to achieve high-precision, high-efficiency closed-loop path/trajectory tracking for the hybrid-driven robotic fish in complex environments.</p>
</sec>
</body>
<back>
<sec id="s7" sec-type="data-availability">
<title>Data availability statement</title>
<p>The datasets presented in this study can be found in online repositories. The names of the repository/repositories and accession number(s) can be found below: <uri xlink:href="https://github.com/Baifagang/Hybrid-Driven-Robotic-fish-Simulator">https://github.com/Baifagang/Hybrid-Driven-Robotic-fish-Simulator</uri>.</p>
</sec>
<sec id="s8" sec-type="author-contributions">
<title>Author contributions</title>
<p>FB: Software, Formal Analysis, Visualization, Validation, Data curation, Conceptualization, Writing &#x2013; original draft, Methodology. XS: Methodology, Writing &#x2013; review &amp; editing, Investigation. ZW: Software, Writing &#x2013; review &amp; editing, Validation. XW: Validation, Writing &#x2013; review &amp; editing, Formal Analysis. YL: Writing &#x2013; review &amp; editing, Methodology. KL: Validation, Writing &#x2013; review &amp; editing, Software. GX: Funding acquisition, Writing &#x2013; review &amp; editing, Project administration.</p>
</sec>
<sec id="s9" sec-type="funding-information">
<title>Funding</title>
<p>The author(s) declare financial support was received for the research and/or publication of this article. This work is supported by the National Key Research and Development Program of China (2023YFC2810100), the National Natural Science Foundation of China (52471331).</p>
</sec>
<ack>
<title>Acknowledgments</title>
<p>The authors would like to express their sincere gratitude to the National Key Research and Development Program of China (2023YFC2810100) and the National Natural Science Foundation of China (52471331) for their financial support.</p>
</ack>
<sec id="s10" sec-type="COI-statement">
<title>Conflict of interest</title>
<p>The authors declare that the research was conducted in the absence of any commercial or financial relationships that could be construed as a potential conflict of interest.</p>
</sec>
<sec id="s11" sec-type="ai-statement">
<title>Generative AI statement</title>
<p>The author(s) declare that no Generative AI was used in the creation of this manuscript.</p>
<p>Any alternative text (alt text) provided alongside figures in this article has been generated by Frontiers with the support of artificial intelligence and reasonable efforts have been made to ensure accuracy, including review by the authors wherever possible. If you identify any issues, please contact us.</p>
</sec>
<sec id="s12" sec-type="disclaimer">
<title>Publisher&#x2019;s note</title>
<p>All claims expressed in this article are solely those of the authors and do not necessarily represent those of their affiliated organizations, or those of the publisher, the editors and the reviewers. Any product that may be evaluated in this article, or claim that may be made by its manufacturer, is not guaranteed or endorsed by the publisher.</p>
</sec>
<sec id="s13" sec-type="supplementary-material">
<title>Supplementary material</title>
<p>The Supplementary Material for this article can be found online at: <ext-link ext-link-type="uri" xlink:href="https://www.frontiersin.org/articles/10.3389/fmars.2025.1648335/full#supplementary-material">https://www.frontiersin.org/articles/10.3389/fmars.2025.1648335/full#supplementary-material</ext-link>
</p>
<supplementary-material xlink:href="DataSheet1.docx" id="SF1" mimetype="application/vnd.openxmlformats-officedocument.wordprocessingml.document"/>
<supplementary-material xlink:href="Supplementaryfile1.docx" id="SM1" mimetype="application/vnd.openxmlformats-officedocument.wordprocessingml.document"/>
<supplementary-material xlink:href="Video1.mp4" id="SM2" mimetype="video/mp4"/>
</sec>
<ref-list>
<title>References</title>
<ref id="B1">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Ahmad Mazlan</surname> <given-names>A. N.</given-names>
</name>
</person-group> (<year>2015</year>). <source>A fully actuated tail propulsion system for a biomimetic autonomous underwater vehicle</source> (<publisher-loc>Glasgow, UK</publisher-loc>: <publisher-name>University of Glasgow</publisher-name>). Available online at: <uri xlink:href="https://theses.gla.ac.uk/6343/">https://theses.gla.ac.uk/6343/</uri> (Accessed <access-date>April 3, 2025</access-date>).</citation></ref>
<ref id="B2">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Barrett</surname> <given-names>D.</given-names>
</name>
<name>
<surname>Grosenbaugh</surname> <given-names>M.</given-names>
</name>
<name>
<surname>Triantafyllou</surname> <given-names>M.</given-names>
</name>
</person-group> (<year>1996</year>). &#x201c;<article-title>The optimal control of a flexible hull robotic undersea vehicle propelled by an oscillating foil</article-title>,&#x201d; in <source>Proceedings of symposium on autonomous underwater vehicle technology</source> (<publisher-name>IEEE</publisher-name>, <publisher-loc>USA</publisher-loc>), <fpage>1</fpage>&#x2013;<lpage>9</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1109/AUV.1996.532833</pub-id>
</citation></ref>
<ref id="B3">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Borazjani</surname> <given-names>I.</given-names>
</name>
<name>
<surname>Sotiropoulos</surname> <given-names>F.</given-names>
</name>
</person-group> (<year>2008</year>). <article-title>Numerical investigation of the hydrodynamics of carangiform swimming in the transitional and inertial flow regimes</article-title>. <source>J. Exp. Biol.</source> <volume>211</volume>, <fpage>1541</fpage>&#x2013;<lpage>1558</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1242/jeb.015644</pub-id>, PMID: <pub-id pub-id-type="pmid">18456881</pub-id></citation></ref>
<ref id="B4">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Chen</surname> <given-names>Y.</given-names>
</name>
<name>
<surname>Qiao</surname> <given-names>J.</given-names>
</name>
<name>
<surname>Liu</surname> <given-names>J.</given-names>
</name>
<name>
<surname>Zhao</surname> <given-names>R.</given-names>
</name>
<name>
<surname>An</surname> <given-names>D.</given-names>
</name>
<name>
<surname>Wei</surname> <given-names>Y.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>Three-dimensional path following control system for net cage inspection using bionic robotic fish</article-title>. <source>Inf. Process. Agric.</source> <volume>9</volume>, <fpage>100</fpage>&#x2013;<lpage>111</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1016/j.inpa.2021.12.002</pub-id>
</citation></ref>
<ref id="B5">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Chen</surname> <given-names>D.</given-names>
</name>
<name>
<surname>Wu</surname> <given-names>Z.</given-names>
</name>
<name>
<surname>Meng</surname> <given-names>Y.</given-names>
</name>
<name>
<surname>Tan</surname> <given-names>M.</given-names>
</name>
<name>
<surname>Yu</surname> <given-names>J.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>Development of a high-speed swimming robot with the capability of fish-like leaping</article-title>. <source>IEEE/ASME Trans. Mechatron.</source> <volume>27</volume>, <fpage>3579</fpage>&#x2013;<lpage>3589</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1109/TMECH.2021.3136342</pub-id>
</citation></ref>
<ref id="B6">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Fahrni</surname> <given-names>L.</given-names>
</name>
<name>
<surname>Thies</surname> <given-names>P. R.</given-names>
</name>
<name>
<surname>Johanning</surname> <given-names>L.</given-names>
</name>
<name>
<surname>Cowles</surname> <given-names>J.</given-names>
</name>
</person-group> (<year>2018</year>). &#x201c;<article-title>Scope and feasibility of autonomous robotic subsea intervention systems for offshore inspection, maintenance and repair</article-title>,&#x201d; in <source>Renewable energies offshore proceedings of the 3rd international conference on renewable energies offshore (RENEW 2018)</source> (<publisher-name>CRC Press-Taylor &amp; Francis</publisher-name>, <publisher-loc>London</publisher-loc>), <fpage>771</fpage>&#x2013;<lpage>778</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1201/9780429505324</pub-id>
</citation></ref>
<ref id="B7">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Fossen</surname> <given-names>T. L.</given-names>
</name>
</person-group> (<year>1994</year>). <source>Guidance and control of ocean vehicles</source> (<publisher-loc>New York</publisher-loc>: <publisher-name>Wiley</publisher-name>).</citation></ref>
<ref id="B8">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Gong</surname> <given-names>Q.</given-names>
</name>
<name>
<surname>Zhang</surname> <given-names>W.</given-names>
</name>
<name>
<surname>Su</surname> <given-names>Y.</given-names>
</name>
<name>
<surname>Yang</surname> <given-names>H.</given-names>
</name>
</person-group> (<year>2024</year>). <article-title>Guidance and control of underwater hexapod robot based on adaptive sliding mode strategy</article-title>. <source>J. Bionic Eng.</source> <volume>22</volume>, <fpage>118</fpage>&#x2013;<lpage>132</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1007/s42235-024-00625-0</pub-id>
</citation></ref>
<ref id="B9">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Hu</surname> <given-names>J.</given-names>
</name>
<name>
<surname>Xiao</surname> <given-names>Q.</given-names>
</name>
<name>
<surname>Li</surname> <given-names>R.</given-names>
</name>
</person-group> (<year>2021</year>). <article-title>Numerical simulation of a multi-body system mimicking coupled active and passive movements of fish swimming</article-title>. <source>J. Mar. Sci. Eng.</source> <volume>9</volume>, <elocation-id>334</elocation-id>. doi:&#xa0;<pub-id pub-id-type="doi">10.3390/jmse9030334</pub-id>
</citation></ref>
<ref id="B10">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Huang</surname> <given-names>H.</given-names>
</name>
<name>
<surname>Xian</surname> <given-names>S.</given-names>
</name>
<name>
<surname>Xiong</surname> <given-names>C.</given-names>
</name>
<name>
<surname>Li</surname> <given-names>W.</given-names>
</name>
<name>
<surname>Zhong</surname> <given-names>Y.</given-names>
</name>
</person-group> (<year>2025</year>). <article-title>Design and dynamics modeling of a hybrid drive bionic robotic fish</article-title>. <source>Biomimetic Intell. Robotics</source>, <fpage>100247</fpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1016/j.birob.2025.100247</pub-id>
</citation></ref>
<ref id="B11">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Ji</surname> <given-names>Y.</given-names>
</name>
<name>
<surname>Wei</surname> <given-names>Y.</given-names>
</name>
<name>
<surname>Liu</surname> <given-names>J.</given-names>
</name>
<name>
<surname>An</surname> <given-names>D.</given-names>
</name>
</person-group> (<year>2023</year>). <article-title>Design and realization of a novel hybrid-drive robotic fish for aquaculture water quality monitoring</article-title>. <source>J. Bionic Eng.</source> <volume>20</volume>, <fpage>543</fpage>&#x2013;<lpage>557</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1007/s42235-022-00282-1</pub-id>
</citation></ref>
<ref id="B12">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Li</surname> <given-names>C.</given-names>
</name>
<name>
<surname>Guo</surname> <given-names>S.</given-names>
</name>
<name>
<surname>Guo</surname> <given-names>J.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>Performance evaluation of a hybrid thruster for spherical underwater robots</article-title>. <source>IEEE Trans. Instrum. Meas.</source> <volume>71</volume>, <fpage>1</fpage>&#x2013;<lpage>10</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1109/TIM.2022.3178700</pub-id>
</citation></ref>
<ref id="B13">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Li</surname> <given-names>S.</given-names>
</name>
<name>
<surname>Wu</surname> <given-names>Z.</given-names>
</name>
<name>
<surname>Dai</surname> <given-names>S.</given-names>
</name>
<name>
<surname>Wang</surname> <given-names>J.</given-names>
</name>
<name>
<surname>Tan</surname> <given-names>M.</given-names>
</name>
<name>
<surname>Yu</surname> <given-names>J.</given-names>
</name>
</person-group> (<year>2024</year>). <article-title>Tight-space maneuvering of a hybrid-driven robotic fish using backstepping-based adaptive control</article-title>. <source>IEEE/ASME Trans. Mechatron.</source> <volume>29</volume>, <fpage>3219</fpage>&#x2013;<lpage>3231</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1109/TMECH.2023.3338879</pub-id>
</citation></ref>
<ref id="B14">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Liljeback</surname> <given-names>P.</given-names>
</name>
<name>
<surname>Mills</surname> <given-names>R.</given-names>
</name>
</person-group> (<year>2017</year>). &#x201c;<article-title>Eelume: A flexible and subsea resident IMR vehicle</article-title>,&#x201d; in <source>Oceans 2017-aberdeen</source> (<publisher-name>IEEE</publisher-name>, <publisher-loc>USA</publisher-loc>), <fpage>1</fpage>&#x2013;<lpage>4</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1109/OCEANSE.2017.8084826</pub-id>
</citation></ref>
<ref id="B15">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Liu</surname> <given-names>J.</given-names>
</name>
<name>
<surname>M&#xf6;ller</surname> <given-names>M.</given-names>
</name>
<name>
<surname>Schuttelaars</surname> <given-names>H. M.</given-names>
</name>
</person-group> (<year>2021</year>). <article-title>Balancing truncation and round-off errors in FEM: One-dimensional analysis</article-title>. <source>J. Comput. Appl. Math.</source> <volume>386</volume>, <elocation-id>113219</elocation-id>. doi:&#xa0;<pub-id pub-id-type="doi">10.1016/j.cam.2020.113219</pub-id>
</citation></ref>
<ref id="B16">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Liu</surname> <given-names>K.</given-names>
</name>
<name>
<surname>Wang</surname> <given-names>H.</given-names>
</name>
<name>
<surname>Xu</surname> <given-names>X.</given-names>
</name>
<name>
<surname>Song</surname> <given-names>T.</given-names>
</name>
<name>
<surname>Meng</surname> <given-names>Q.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>Development and trials of a novel deep-sea multi-joint autonomous underwater vehicle</article-title>. <source>Ocean Eng.</source> <volume>265</volume>, <elocation-id>112558</elocation-id>. doi:&#xa0;<pub-id pub-id-type="doi">10.1016/j.oceaneng.2022.112558</pub-id>
</citation></ref>
<ref id="B17">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Liu</surname> <given-names>J.</given-names>
</name>
<name>
<surname>Yu</surname> <given-names>F.</given-names>
</name>
<name>
<surname>He</surname> <given-names>B.</given-names>
</name>
<name>
<surname>Yan</surname> <given-names>T.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>Hydrodynamic numerical simulation and prediction of bionic fish based on computational fluid dynamics and multilayer perceptron</article-title>. <source>Eng. Appl. Comp. Fluid Mech.</source> <volume>16</volume>, <fpage>858</fpage>&#x2013;<lpage>878</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1080/19942060.2022.2052355</pub-id>
</citation></ref>
<ref id="B18">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Ozmen Koca</surname> <given-names>G.</given-names>
</name>
<name>
<surname>Bal</surname> <given-names>C.</given-names>
</name>
<name>
<surname>Korkmaz</surname> <given-names>D.</given-names>
</name>
<name>
<surname>Bingol</surname> <given-names>M. C.</given-names>
</name>
<name>
<surname>Ay</surname> <given-names>M.</given-names>
</name>
<name>
<surname>Akpolat</surname> <given-names>Z. H.</given-names>
</name>
<etal/>
</person-group>. (<year>2018</year>). <article-title>Three-dimensional modeling of a robotic fish based on real carp locomotion</article-title>. <source>Appl. Sci.</source> <volume>8</volume>, <elocation-id>180</elocation-id>. doi:&#xa0;<pub-id pub-id-type="doi">10.3390/app8020180</pub-id>
</citation></ref>
<ref id="B19">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Qiu</surname> <given-names>H.</given-names>
</name>
<name>
<surname>Chen</surname> <given-names>L.</given-names>
</name>
<name>
<surname>Ma</surname> <given-names>X.</given-names>
</name>
<name>
<surname>Bi</surname> <given-names>S.</given-names>
</name>
<name>
<surname>Wang</surname> <given-names>B.</given-names>
</name>
<name>
<surname>Li</surname> <given-names>T.</given-names>
</name>
</person-group> (<year>2023</year>). <article-title>Analysis of heading stability due to interactions between pectoral and caudal fins in robotic boxfish locomotion</article-title>. <source>J. Bionic Eng.</source> <volume>20</volume>, <fpage>390</fpage>&#x2013;<lpage>405</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1007/s42235-022-00271-4</pub-id>
</citation></ref>
<ref id="B20">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Salazar</surname> <given-names>R.</given-names>
</name>
<name>
<surname>Fuentes</surname> <given-names>V.</given-names>
</name>
<name>
<surname>Abdelkefi</surname> <given-names>A.</given-names>
</name>
</person-group> (<year>2018</year>). <article-title>Classification of biological and bioinspired aquatic systems: A review</article-title>. <source>Ocean Eng.</source> <volume>148</volume>, <fpage>75</fpage>&#x2013;<lpage>114</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1016/j.oceaneng.2017.11.012</pub-id>
</citation></ref>
<ref id="B21">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Scaradozzi</surname> <given-names>D.</given-names>
</name>
<name>
<surname>Palmieri</surname> <given-names>G.</given-names>
</name>
<name>
<surname>Costa</surname> <given-names>D.</given-names>
</name>
<name>
<surname>Zingaretti</surname> <given-names>S.</given-names>
</name>
<name>
<surname>Panebianco</surname> <given-names>L.</given-names>
</name>
<name>
<surname>Ciuccoli</surname> <given-names>N.</given-names>
</name>
<etal/>
</person-group>. (<year>2017</year>). <article-title>UNIVPM BRAVe: A hybrid propulsion underwater research vehicle</article-title>. <source>Int. J. Autom. Tech.</source> <volume>11</volume>, <fpage>404</fpage>&#x2013;<lpage>414</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.20965/ijat.2017.p0404</pub-id>
</citation></ref>
<ref id="B22">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Sfakiotakis</surname> <given-names>M.</given-names>
</name>
<name>
<surname>Lane</surname> <given-names>D. M.</given-names>
</name>
<name>
<surname>Davies</surname> <given-names>J. B. C.</given-names>
</name>
</person-group> (<year>2002</year>). <article-title>Review of fish swimming modesfor aquatic locomotion</article-title>. <source>IEEE J. Ocean Eng.</source> <volume>24</volume>, <fpage>237</fpage>&#x2013;<lpage>252</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1109/48.757275</pub-id>
</citation></ref>
<ref id="B23">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Suebsaiprom</surname> <given-names>P.</given-names>
</name>
<name>
<surname>Lin</surname> <given-names>C. L.</given-names>
</name>
</person-group> (<year>2015</year>). <article-title>Maneuverability modeling and trajectory tracking for fish robot</article-title>. <source>Control Eng. Pract.</source> <volume>45</volume>, <fpage>22</fpage>&#x2013;<lpage>36</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1016/j.conengprac.2015.08.010</pub-id>
</citation></ref>
<ref id="B24">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Terracciano</surname> <given-names>D. S.</given-names>
</name>
<name>
<surname>Bazzarello</surname> <given-names>L.</given-names>
</name>
<name>
<surname>Caiti</surname> <given-names>A.</given-names>
</name>
<name>
<surname>Costanzi</surname> <given-names>R.</given-names>
</name>
<name>
<surname>Manzari</surname> <given-names>V.</given-names>
</name>
</person-group> (<year>2020</year>). <article-title>Marine robots for underwater surveillance</article-title>. <source>Curr. Robot Rep.</source> <volume>1</volume>, <fpage>159</fpage>&#x2013;<lpage>167</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1007/s43154-020-00028-z</pub-id>
</citation></ref>
<ref id="B25">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Triantafyllou</surname> <given-names>G. S. M. S.</given-names>
</name>
</person-group> (<year>1993</year>). <article-title>Optimal thrust development inoscillating foils with application to fishpropulsion</article-title>. <source>J. Fluids Struct.</source> <volume>7</volume>, <fpage>205</fpage>&#x2013;<lpage>224</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1006/jfls.1993.1012</pub-id>
</citation></ref>
<ref id="B26">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Versteeg</surname> <given-names>H. K.</given-names>
</name>
<name>
<surname>Malalasekera</surname> <given-names>W.</given-names>
</name>
</person-group> (<year>2007</year>). <article-title>An introduction to computational fluid dynamics</article-title>. <source>Pearson Schweiz Ag</source> <volume>20</volume>, <fpage>400</fpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1016/j.enganabound.2004.05.002</pub-id>
</citation></ref>
<ref id="B27">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Watts</surname> <given-names>C.</given-names>
</name>
<name>
<surname>McGookin</surname> <given-names>E.</given-names>
</name>
<name>
<surname>Macauley</surname> <given-names>M.</given-names>
</name>
</person-group> (<year>2007</year>). &#x201c;<article-title>Modelling and control of a biomimetic underwater vehicle with a tendon drive propulsion system</article-title>,&#x201d; in <source>OCEANS 2007 &#x2013; europe</source> (<publisher-name>IEEE</publisher-name>, <publisher-loc>USA</publisher-loc>), <fpage>1</fpage>&#x2013;<lpage>6</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1109/OCEANSE.2007.4302245</pub-id>
</citation></ref>
<ref id="B28">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Xia</surname> <given-names>X.</given-names>
</name>
<name>
<surname>Hu</surname> <given-names>N.</given-names>
</name>
<name>
<surname>Liu</surname> <given-names>J.</given-names>
</name>
<name>
<surname>Chen</surname> <given-names>G.</given-names>
</name>
<name>
<surname>Yang</surname> <given-names>Q.</given-names>
</name>
<name>
<surname>Chen</surname> <given-names>Y.</given-names>
</name>
</person-group> (<year>2021</year>). <article-title>Development and innovative design research of underwater bionic fish products under hybrid propulsion technology</article-title>. <source>Wireless Commun. Mobile Computing</source> <volume>2021</volume>, <elocation-id>5146992</elocation-id>. doi:&#xa0;<pub-id pub-id-type="doi">10.1155/2021/5146992</pub-id>
</citation></ref>
<ref id="B29">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Xue</surname> <given-names>G.</given-names>
</name>
<name>
<surname>Bai</surname> <given-names>F.</given-names>
</name>
<name>
<surname>Guo</surname> <given-names>L.</given-names>
</name>
<name>
<surname>Ren</surname> <given-names>P.</given-names>
</name>
<name>
<surname>Liu</surname> <given-names>Y.</given-names>
</name>
</person-group> (<year>2023</year>). <article-title>Research on the effects of complex terrain on the hydrodynamic performance of a deep-sea fishlike exploring and sampling robot moving near the sea bottom</article-title>. <source>Front. Mar. Sci.</source> <volume>10</volume>. doi:&#xa0;<pub-id pub-id-type="doi">10.3389/fmars.2023.1091523</pub-id>
</citation></ref>
<ref id="B30">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Xue</surname> <given-names>G.</given-names>
</name>
<name>
<surname>Liu</surname> <given-names>Y.</given-names>
</name>
<name>
<surname>Si</surname> <given-names>W.</given-names>
</name>
<name>
<surname>Xue</surname> <given-names>Y.</given-names>
</name>
<name>
<surname>Guo</surname> <given-names>F.</given-names>
</name>
<name>
<surname>Li</surname> <given-names>Z.</given-names>
</name>
</person-group> (<year>2020</year>). <article-title>Evolvement rule and hydrodynamic effect of fluid field around fish-like model from starting to cruising</article-title>. <source>Eng. Appl. Comp. Fluid Mech.</source> <volume>14</volume>, <fpage>580</fpage>&#x2013;<lpage>592</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1080/19942060.2020.1734095</pub-id>
</citation></ref>
<ref id="B31">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Yu</surname> <given-names>Y.</given-names>
</name>
<name>
<surname>Huang</surname> <given-names>K.</given-names>
</name>
</person-group> (<year>2021</year>). <article-title>Scaling law of fish undulatory propulsion</article-title>. <source>Phys. Fluids</source> <volume>33</volume>, <fpage>061905</fpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1063/5.0053721</pub-id>
</citation></ref>
<ref id="B32">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Yu</surname> <given-names>J.</given-names>
</name>
<name>
<surname>Wang</surname> <given-names>T.</given-names>
</name>
<name>
<surname>Wu</surname> <given-names>Z.</given-names>
</name>
<name>
<surname>Tan</surname> <given-names>M.</given-names>
</name>
</person-group> (<year>2019</year>). <article-title>Design of a miniature underwater angle-of-attack sensor and its application to a self-propelled robotic fish</article-title>. <source>IEEE J. Ocean Eng.</source> <volume>45</volume>, <fpage>1295</fpage>&#x2013;<lpage>1307</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1109/JOE.2019.2940800</pub-id>
</citation></ref>
<ref id="B33">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Yuan</surname> <given-names>J.</given-names>
</name>
<name>
<surname>Wu</surname> <given-names>Z.</given-names>
</name>
<name>
<surname>Yu</surname> <given-names>J.</given-names>
</name>
<name>
<surname>Tan</surname> <given-names>M.</given-names>
</name>
</person-group> (<year>2017</year>). <article-title>Sliding mode observer-based heading control for a gliding robotic dolphin</article-title>. <source>IEEE Trans. Ind. Electron.</source> <volume>64</volume>, <fpage>6815</fpage>&#x2013;<lpage>6824</lpage>. doi:&#xa0;<pub-id pub-id-type="doi">10.1109/TIE.2017.2674606</pub-id>
</citation></ref>
<ref id="B34">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Zhao</surname> <given-names>X.</given-names>
</name>
<name>
<surname>Jin</surname> <given-names>S.</given-names>
</name>
<name>
<surname>Bian</surname> <given-names>G.</given-names>
</name>
<name>
<surname>Cui</surname> <given-names>Y.</given-names>
</name>
<name>
<surname>Wang</surname> <given-names>J.</given-names>
</name>
<name>
<surname>Tang</surname> <given-names>Y.</given-names>
</name>
<etal/>
</person-group>. (<year>2023</year>). <article-title>Technical design and data analysis of autonomous underwater vehicle-based side-scan sonar operations</article-title>. <source>J. Mar. Sci. Eng.</source> <volume>11</volume>, <elocation-id>2089</elocation-id>. doi:&#xa0;<pub-id pub-id-type="doi">10.3390/jmse11112089</pub-id>
</citation></ref>
</ref-list>
</back>
</article>