尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
gz-sim 水下机器人控制实战:LRAUV 速度、偏航与俯仰的 PD/P 控制器解析
机器人【免费下载链接】gz-simOpen source robotics simulator. The latest version of Gazebo.项目地址https://gitcode.com/gh_mirrors/gz/gz-sim点击查看免费下载本文以 gz-simGazebo Sim仓库中的examples/standalone/lrauv_control示例为核心深入讲解如何为 MBARI Tethys LRAUV长航程自主水下航行器搭建一个解耦的速度—偏航—俯仰控制器从世界文件的系统插件配置到基于 gz-transport 话题的控制器源码C 与 Python 双版本再到完整的构建、运行与输出判读流程。读完本文你将掌握在 gz-sim 中通过cmd_thrust、cmd_pos等标准话题驱动水下航行器、并利用里程计话题闭环反馈的完整实战方案。一、示例概览一台有三个作动器的 LRAUV本示例演示一个针对 LRAUV 的简单闭环控制器。示例车辆模型名为tethys配备三个作动器推进器thruster控制前进速度垂直尾翼舵vertical fins控制偏航角yaw水平尾翼舵horizontal fins控制俯仰角pitch。控制器的目标状态是三个量速度m/s、偏航角rad、俯仰角rad。控制器需要实时调整舵面角度与推进器推力使这三个状态逼近目标值属于典型的多输入多输出MIMO水下航行器控制问题。原文档明确指出一个重要的工程近似在真实系统中这是 MIMO 系统三个作动器相互耦合——改变推进器推力会影响俯仰转动舵面也会影响阻力与速度。但当需要改变的偏航、俯仰角不太剧烈时可以将系统近似为三个独立的单输入单输出SISO回路来分别设计控制器。据此示例采用如下控制律README 原始描述速度通道PD 控制器按 lrauv_control.cc 源码实际实现为比例 积分即 PI 形式见下文第五节的源码对照偏航角通道P 控制器俯仰角通道P 控制器。而闭环所需的状态反馈由OdometryPublisher系统插件提供控制器通过订阅里程计话题获取当前速度、偏航角与俯仰角。二、运行前置条件与整体流程本示例需要分两步运行先启动仿真世界再单独编译并运行控制器可执行程序独立于仿真进程通过 gz-transport 话题通信。前置条件已安装并编译 gz-sim 及其依赖gz-transport、gz-msgs、gz-math 等已配置 Gazebo 工作空间示例 README 假定为~/gazebo_ws/仓库源码位于~/gazebo_ws/src/gz-sim/每个新终端都需要先 source Gazebo 工作空间使gz命令行与相关库可用。第一步启动仿真世界世界文件位于 examples/worlds/lrauv_control_demo.sdf注意它位于examples/worlds/而不是examples/standalone/下。打开一个终端source 工作空间后执行cd ~/gazebo_ws/src/gz-sim/examples/worlds gz sim -r lrauv_control_demo.sdf-r参数表示启动后立即运行不暂停。执行后应弹出一个 Gazebo 窗口LRAUV 静止位于原点附近世界文件将模型pose设为0 0 1 0 0 0见 examples/worlds/lrauv_control_demo.sdf。由于WorldControlGUI 插件中start_paused设为true若希望仿真从暂停状态开始可在界面中点击播放使用-r时则直接运行。第二步编译并运行控制器打开一个新终端source 工作空间进入示例目录并构建cd ~/gazebo_ws/src/gz-sim/examples/standalone/lrauv_control mkdir build; cd build cmake ..; make构建成功后按以下用法运行# 用法./lrauv_control speed_in_metres_per_sec yaw_angle_in_rad pitch_angle_in_rad ./lrauv_control 0.5 0.174 0.174其中0.174rad ≈ 9.97°因此这条命令让 LRAUV 以 0.5 m/s 前进同时转向偏航约 10°、俯仰约 10°。源码头部注释中给出的另一组示例参数为./lrauv_control 0.5 0.78 0.174偏航约 44.7°可见三个参数单位分别是 m/s、rad、rad。运行后车辆应开始运动并沿路径行进同时控制器控制台会周期性打印三个状态各自的目标值、当前值、误差。此外世界文件中的Plot3DGUI 插件标题为 LRAUV path plot跟踪tethys::base_link会在界面中实时绘制车辆轨迹这正是 README 所说 tracing its path along the way 的可视化来源见 examples/worlds/lrauv_control_demo.sdf。三、控制器的典型输出与状态判读运行后控制台每隔约 200 ms 打印一次状态README 中的示例输出循环打印相同的两行格式----------------------- States ( target, current, error) : Speed (m/s) : 0.50000 0.54543 -0.04543 Yaw angle (deg) : 9.96947 11.31291 -1.34344 Pitch angle (deg) : 9.96947 6.39717 3.57229 ----------------------- States ( target, current, error) : Speed (m/s) : 0.50000 0.54543 -0.04543 Yaw angle (deg) : 9.96947 11.31291 -1.34344 Pitch angle (deg) : 9.96947 6.39717 3.57229解读要点目标偏航角0.174 rad打印时被转换为角度显示0.174 * 180 / π ≈ 9.96947°俯仰角同理源码见 lrauv_control.ccerror target - current速度误差 -0.04543 表示当前速度略超目标0.545 vs 0.500偏航误差 -1.34° 表示转向略过俯仰误差 3.57° 表示俯仰角尚未到位控制器仍在收敛过程中输出使用std::fixed与 5 位小数精度格式化std::setprecision(5)方便观测收敛过程。四、世界文件解析支撑闭环仿真的系统插件栈控制器能闭环工作依赖 examples/worlds/lrauv_control_demo.sdf 中配置的整套仿真系统。理解这些插件是掌握示例的关键1. 基础仿真系统plugin filenamegz-sim-physics-system namegz::sim::systems::Physics/ plugin filenamegz-sim-user-commands-system namegz::sim::systems::UserCommands/ plugin filenamegz-sim-scene-broadcaster-system namegz::sim::systems::SceneBroadcaster/ plugin filenamegz-sim-contact-system namegz::sim::systems::Contact/物理引擎为 ODEmax_step_size0.001/max_step_size1 ms 步长、real_time_factor1.0/real_time_factor。2. 水环境浮力与水动力plugin filenamegz-sim-buoyancy-system namegz::sim::systems::Buoyancy uniform_fluid_density1000/uniform_fluid_density /plugin plugin filenamegz-sim-particle-emitter-system namegz::sim::systems::ParticleEmitter/Buoyancy以 1000 kg/m³淡水密度提供均匀浮力ParticleEmitter用于渲染水下粒子效果。3. 模型内嵌插件位于include块内世界通过urihttps://fuel.gazebosim.org/1.0/accurrent/models/MBARI Tethys LRAUV/uri从 Fuel 拉取 Tethys 模型并在 include 块内为模型附加以下插件OdometryPublisher反馈来源为tethys模型发布里程计。从其实现 src/systems/odometry_publisher/OdometryPublisher.cc 可看到默认话题构造规则为/model/model_name/odometry对应本示例订阅的/model/tethys/odometry同时还会发布/model/name/odometry_with_covariance与/model/name/poseTF。发布频率由odom_publish_frequency控制默认 50 Hz见 OdometryPublisher.cc。控制器即从该话题的msgs::Odometry中读取位姿四元数与线速度。JointPositionController舵面执行器两个实例分别控制horizontal_fins_joint与vertical_fins_jointp_gain0.1/p_gain。由 src/systems/joint_position_controller/JointPositionController.cc 可知默认命令话题为/model/model/joint/joint_name/joint_index/cmd_pos恰好对应控制器发布的/model/tethys/joint/vertical_fins_joint/0/cmd_pos与/model/tethys/joint/horizontal_fins_joint/0/cmd_pos索引0表示该关节组中的第 0 号关节。Thruster推进器执行器namespacetethys/namespace、joint_namepropeller_joint/joint_name、thrust_coefficient0.004422/thrust_coefficient、fluid_density1000/fluid_density、propeller_diameter0.2/propeller_diameter、use_angvel_cmd0/use_angvel_cmd即采用推力指令模式而非角速度指令模式。从 src/systems/thruster/Thruster.cc 可确认ForceCmd 模式下默认订阅话题为/model/ns/joint/joint_name/cmd_thrust——正是控制器发布推力的/model/tethys/joint/propeller_joint/cmd_thrust。tutorials 中关于推力—转速关系的说明见 tutorials/underwater_vehicles.md提到该插件接收牛顿单位的力指令并依据 Fossen 教材中的公式换算转速。LiftDrag舵面水动力两组分别为垂直尾翼upward0 1 0/upward与水平尾翼upward0 0 1/upward配置升力系数cla 4.13、阻力系数cda 0.2、失速角alpha_stall 0.17、面积area 0.0244等用于产生舵面转角的升/阻力。Hydrodynamics水动力阻尼作用于base_link配置了附加质量xDotU、yDotV、zDotW、mDotQ、nDotR与非线性阻尼xUabsU、yVabsV、zWabsW、mQabsQ、nRabsR系数使航行器获得贴近真实的水中运动特性。五、控制器源码剖析话题、状态更新与控制律核心实现是 examples/standalone/lrauv_control/lrauv_control.cc约 225 行逻辑清晰可拆解为四部分。1. 目标状态设置与合法性检查Controller::SetTargets(speed, yaw, pitch)接收命令行三个参数。值得注意的是其中有一个物理约束检查lrauv_control.ccif (_speed 0 (_yaw ! 0 || _pitch ! 0)) { std::cout Speed needs to be non zero for non zero pitch and yaw angles std::endl; return; // 拒绝设置 }即速度为零时不允许设定非零姿态角——静止航行器没有前进速度时舵面无法产生有效的操纵力矩这一检查体现了对水动力原理的正确建模。2. 话题发布与订阅gz-transport 通信层控制器创建一个gz::transport::Node共建立 1 个订阅、3 个发布角色话题消息类型用途发布/model/tethys/joint/propeller_joint/cmd_thrustgz.msgs.Double推进器推力指令订阅/model/tethys/odometrygz.msgs.Odometry状态反馈发布/model/tethys/joint/vertical_fins_joint/0/cmd_posgz.msgs.Double垂直舵偏航位置指令发布/model/tethys/joint/horizontal_fins_joint/0/cmd_posgz.msgs.Double水平舵俯仰位置指令话题字符串均通过gz::transport::TopicUtils::AsValidTopic规范化见 lrauv_control.cc。里程计回调将Odometry中的四元数转为gz::math::Quaterniond后取欧拉角q.Euler()其中rpy[2]为偏航、rpy[1]为俯仰同时用线速度三分量的模长velocity.Length()作为当前速度标量lrauv_control.cc。3. 状态更新与误差计算UpdateState(speed, yaw, pitch)在互斥锁保护下刷新当前状态并计算三个误差通道lrauv_control.ccerrorSpeed targetSpeed - speed; errorSpeedIntegral std::min(errorSpeedIntegral errorSpeed, errorSpeedIntegralMax); errorYawAngle targetYawAngle - yawAngle; errorPitchAngle targetPitchAngle - pitchAngle;其中速度误差的积分项被限幅到errorSpeedIntegralMax 10防止积分饱和wind-up。4. 控制律与增益参数控制输出由三个独立函数生成lrauv_control.cc// 速度通道 double SpeedControl() { return errorSpeed * kSpeed errorSpeedIntegral * kISpeed; } // 偏航通道 double YawControl() { return errorYawAngle * kYawAngle; } // 俯仰通道 double PitchControl() { return errorPitchAngle * kPitchAngle; }对应增益定义lrauv_control.cc参数值说明kSpeed-30速度比例增益kISpeed-0.5速度积分增益errorSpeedIntegralMax10速度积分项限幅kYawAngle-0.5偏航比例增益kPitchAngle0.6俯仰比例增益一处值得注意的文档与实现差异README 将速度控制器描述为 PD controller for speed但源码实际采用P I比例-积分形式——缺少微分项且积分带限幅。读者应以源码实现为准并可将速度通道理解为 PI 控制器。这不妨碍整体控制策略P 型角度通道 PI 型速度通道的理解。5. 控制循环与输出主循环每 200 ms 执行一次std::this_thread::sleep_for(std::chrono::milliseconds(200))见 lrauv_control.cc依次发布推力、偏航舵、俯仰舵三条指令随后打印状态表。三个发布器始终处于发布状态即使目标未变也会持续输出保证仿真端执行器不断收到最新指令。6. CMake 构建配置构建文件 examples/standalone/lrauv_control/CMakeLists.txt 展示了独立控制程序所需的依赖链find_package(gz-transport QUIET REQUIRED OPTIONAL_COMPONENTS log) find_package(gz-sim REQUIRED) add_executable(lrauv_control lrauv_control.cc) target_link_libraries(lrauv_control gz-transport::core gz-sim::gz-sim)即该独立程序依赖gz-transport::core话题通信与gz-sim::gz-sim提供 gz::math 等接口。六、Python 版本同一控制器的跨语言实现同目录还提供了一份功能对等的 Python 实现 examples/standalone/lrauv_control/lrauv_control.py适合快速原型验证。两者在结构上完全对应Controller类、增益值、话题名、200 ms 周期均一致。运行方式源码头部注释export PYTHONPATH$PYTHONPATH:path_to_gazebo_ws/install/lib/python python3 lrauv_control.py 0.5 0.78 0.174Python 版通过gz.msgs.double_pb2.Double、gz.msgs.odometry_pb2.Odometry、gz.math、gz.transport等 Python 绑定实现同样的话题收发见 lrauv_control.py姿态角换算使用q.yaw()/q.pitch()控制循环同样休眠 0.2 秒。两个版本可任选其一与仿真端完全兼容。七、适用边界与进一步探索原文档在结尾明确给出适用性警告Note本示例仅用于教学演示控制器在高速或目标角度突变时可能表现不佳。原因正是第一节提到的 SISO 解耦近似——当偏航/俯仰变化剧烈时三通道间的耦合推力—俯仰力矩耦合、舵面阻力变化等不再可忽略P/PI 控制器无法补偿。若要在该场景下获得更好的性能需要考虑 MIMO 控制器或引入前馈补偿。如果你想继续深入这一主题仓库中还有直接相关的资源examples/standalone/multi_lrauv_race/README.md多台 LRAUV 竞速示例展示通过命名空间区分多台同型航行器用伪随机推力/舵指令驱动多机运动可对比单机控制与多机控制的话题组织方式tutorials/underwater_vehicles.md系统讲解水下航行器仿真的完整链路——Thruster 插件含推力—转速公式、fluid_added_mass附加质量、Hydrodynamics 阻尼系数标定、LiftDrag 舵面建模是理解lrauv_control_demo.sdf中每个数值来源的最佳参考资料src/systems/odometry_publisher/OdometryPublisher.cc、src/systems/thruster/Thruster.cc、src/systems/joint_position_controller/JointPositionController.cc三个核心系统插件的实现可帮你精确推导任意模型名/关节名下的话题路径规律从而将本示例的控制框架迁移到你自己的水下航行器模型上。赞分享机器人【免费下载链接】gz-simOpen source robotics simulator. The latest version of Gazebo.项目地址https://gitcode.com/gh_mirrors/gz/gz-sim点击查看免费下载相关推荐PRAXIST 火箭助推器回收姿态控制角色解析attitude_controller_yz 的俯仰/偏航姿态控制器职责与实现PRAXIST 火箭助推器回收姿态控制角色解析attitude_controller_yz 的俯仰/偏航姿态控制器职责与实现 本指南围绕 PRAXIST 开源人工智能AI Agent多智能体Agent 工作流深度研究AI 评测PRAXIST 角色深度解析Rocket Booster Recovery 俯仰/偏航姿态控制器Attitude Controller YZ的设计契约与 Rust 实现PRAXIST 角色深度解析Rocket Booster Recovery 俯仰/偏航姿态控制器Attitude Controller YZ的设计契约与人工智能AI Agent多智能体Agent 工作流深度研究AI 评测PRAXIST 火箭回收任务 Attitude Controller YZ 角色解析SO(3) 俯仰/偏航姿态控制的职责边界与源码实现PRAXIST 火箭回收任务 Attitude Controller YZ 角色解析SO 3 俯仰/偏航姿态控制的职责边界与源码实现 导读 在 PRAXIST人工智能AI Agent多智能体Agent 工作流深度研究AI 评测上一篇告别黑苹果配置噩梦OpCore-Simplify如何让复杂EFI配置变得像点菜一样简单下一篇gsd-core Bracket Phase-ID 约定ADR-612终结 M-NN 连字符重载的里程碑阶段标识语法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

医院病房管理系统数据库课设:核心表设计、事务控制与避坑指南

医院病房管理系统数据库课设:核心表设计、事务控制与避坑指南

简介:这份《医院病房管理系统--数据库课设》面向计算机相关专业学生与数据库初学者,提供一套完整的课程设计参考方案,帮助解决从需求分析到系统落地的全流程问题。资源包共146个文件,约5.04MB,以Java源码与编译后的cla…

📅 2026/10/14 6:50:14
3D Slicer Welcome 模块指南:启动欢迎页与自动更新机制深度解析

3D Slicer Welcome 模块指南:启动欢迎页与自动更新机制深度解析

医疗健康图像处理数据可视化桌面应用3D渲染 【免费下载链接】Slicer Multi-platform, free open source software for visualization and image computing. 项目地址: https://gitcode.com/gh_mirrors/sl/Slicer 点击查看 免费下载 导读 Welcome 模块是 3D Slicer…

📅 2026/10/14 6:50:14
OpenCV2.1 C++Builder封装:老项目图像处理接入与避坑指南

OpenCV2.1 C++Builder封装:老项目图像处理接入与避坑指南

简介:这份资源是面向CBuilder开发者准备的OpenCV 2.1集成示例,作者将OpenCV自带的经典示例改写为VCL版本,方便在CB环境中直接调用图像处理能力。包内包含OpenCV 2.1 for CB所需的lib库文件与include头文件,并附有使用说明&#xf…

📅 2026/10/14 6:50:14
MORE NEWS

更多资讯

📰

Pro/E模型练习100例:建模入门必练的实操路径

简介:《Pro/E模型练习100例》是一套面向Pro/E软件初学者与进阶者的实战训练合集,覆盖旋转、扫描、曲面建模等核心操作,帮助用户从简单几何体到复杂装配逐步提升参数化建模能力。旋转特征适合构建轴类、瓶身等对称实体,扫描特征可设…

📰

红豆地球V1.182 7z包安装部署与问题排查指南

简介:红豆地球V1.182正式版是一款基于GIS技术的地图工具,面向需要全球地理信息查看、查询与分析的个人及企业用户。该版本经过充分测试,稳定可靠,支持地形展示、地点搜索、路线规划及自定义图层等实用功能。资源采用7z格式压缩&am…

📰

电子元器件比价平台:4 个真实比价渠道和方法

元器件比价不能只看单价。同一颗料,不同平台的报价差异可达30%——但低价背后可能藏着翻新料、无检测、无售后的坑。真正靠谱的比价要同时比4样东西:单价、检测能力、账期、售后。比价渠道本身也要选对,用错渠道比出来的价格没有参考价值。一…

📰

手机号归属地离线库:36万号段清洗入库与批量查询实战

简介:全国手机号码段归属地数据库收录了360569条手机号码段记录,以7.48MB的zip压缩包形式打包,共4个文件,包括SQL脚本、CSV数据表和两份txt说明文档。SQL脚本提供建表与插入语句,可在MySQL等数据库内快速创建号码段表并…

📰

外贸独立站如何选SEO服务商?避坑指南

外贸独立站卖家挑选 SEO 服务商,很容易被漂亮的案例截图、营销话术迷惑。判断服务商靠谱与否,不能只看宣传,需要一套可落地的核验标准,从承诺、执行人、案例、技术手法、交付逻辑、资产权限多个维度综合甄别。1. 看承诺&#xff1…

📰

Boost.Asio tcp::iostream:用C++流式编程简化TCP网络通信

1. 核心机制与关键细节拆解1.1 为什么能用“流”来跑网络数据先聊一个很多新手第一次看到boost::asio::ip::tcp::iostream时的疑惑:网络传输明明是基于字节流的收发动作,怎么会和一个操作本地文件的“流”扯上关系?其实这个设计思路的本质&am…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬