基于ROS搭建简易软件框架实现ROV水下目标跟踪(五)--机械模型文件

本文主要是介绍基于ROS搭建简易软件框架实现ROV水下目标跟踪(五)--机械模型文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      项目链接:https://github.com/cabinx/cabin_auv_ws

      水下平台,如ROV,AUV等的机械结构通常会随着配件的变化而变化。比如,改变推进器的布局,添加重量比较大的传感器等。机械结构的变化反过来会影响运动控制。因此,在设计软件架构时,将机械参数在程序中写死是非常不合理的。根据机械模型设计配置文件,供程序加载是比较理想方案。

      机械模型反应推进器布局等,是根据机器人运动需求进行推力分配的关键。在具体解析的基础控制框架的程序之前,我们应需要理解程序框架需要加载的机械模型文件。我们在solidworks等设计软件中设计水下平台,各种机械参数可以通过设计软件很容易得到。

      模型文件对应的存储路径为cabin_controllers/cfg/。不妨以我使用的Bluerov2 Heavy版的机械模型文件为例,文件名为bluerov_heavy_properties.yaml。模型参数是我在网上找的Bluerov2 Heavy版的CAD模型文件在solidworks读取得到的,虽然不太准确,但也能使用。

      实际上理解模型参数文件的核心就是处理好各部分的坐标系与机器人坐标系及世界坐标系的映射关系。

      一、推进器

      我们首先来看T200推进器在空间初始状态相对于世界坐标系O的初始状态:

      设定该推进器的桨叶为CW(clockwise顺时针),即电机驱动桨叶顺时针旋转时提供推力F方向如上图所示,逆时针旋转时提供推力与上图F方向相反。若桨叶为CCW(counter clockwise逆时针),则电机驱动桨叶逆时针旋转时提供的推力F方向如上图,顺时针旋转时则相反。这是我们在计算PWM波控制电机旋转时需要考虑的。

      在模型文件中,我们这样来描述一个推进器:
      1、id:序号;
      2、name:简称;
      3、type:桨叶类型,0为CCW,1为CW;
      4、enable:是否启用;
      5、pose:推进器空间姿态[x,y,z,yaw,pitch],表示推进器由初始状态平移[x,y,z],旋转[yaw,pitch]。

      若干个推进器组成文件中的推进器矩阵thrusters:[]。

      我们再来看Bluerov2 Heavy版的推进器布局,引自ardusub官网(http://www.ardusub.com/introduction/features.html)。

      

      其中,绿色为CW,蓝色为CCW。

      其与程序中的变量名称对应关系为:

      1->VPF;

      2->VSF;

      3->VPA;

      4->VSA;

      5->HPF;

      6->HSF;

      7->HPA;

      8->HAS。

    

      以1号推进器为例:

      id为0;

      name为VPF;

      enable:启用;

      pose:[0.0081, 0.0567, 0.1043, -135.0, 0.0]

                 推进器在空间中相对于世界坐标系的位置为[0.0081m, 0.0567m, 0.1043m];

                 推进器在偏航方向(yaw),即绕z轴旋转了-135度。

二、机器人整体参数    

      mass:机器人质量,(kg);

      center_of_mass:质心在空间中相对于世界坐标系位置,(m);

      inertia: 惯性张量[Ixx,Iyy,Izz],(kg*m^2);

      注:我机械也不太擅长,不太理解惯性张量,故后面程序中与惯性张量有关的公式可能理解得不透彻。

三、传感器空间位置(在我的测试中我没有配置传感器)

      dvl:[x,y,z,yaw],dvl相对世界坐标系姿态,(m,deg);

      imu:[x,y,z],imu相对世界坐标系位置,(m);

四、其它

      depth_fully_submerged:完全没入水中的深度,(m);

      注:当机器人完全没入水中时,需要启动定深,推进器需提供推力抵消浮力的影响。

这篇关于基于ROS搭建简易软件框架实现ROV水下目标跟踪(五)--机械模型文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/319539

相关文章

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核