sitl_gazebo,px4模型matlab接口分析,gazebo与matlab联合仿真

2023-05-16

最近在使用matlab建立四旋翼控制程序,奈何没有好的可视化仿真软件,便想起px4的gazebo仿真环境,使用matlab连接px4底层通信模型,实现matlab在软件层面的可视化仿真。

Gazebo插件分析

参考gazebo插件开发手册,可以了解其开发的流程,之后也只关注gazebo插件入口函数

    public: virtual void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf)
    {
      // 这里大抵是Gazebo插件的入口函数,插件的修改也是在这个部分修改
      std::cerr << "\nThe velodyne plugin is attach to model[" <<
        _model->GetName() << "]\n";
    }

其他部分暂时也无需去更改,使用px4默认的方式就行。

Gazebo 中Ros的使用

在Gazebo插件中,首先需要订阅Gazebo自身发布的话题,而要实现仿真器内部件与外部的对接,还需要插件Ros话题,在px4中使用Mavlink直接与simulator模块通信,可以直接发送pwm信号至电机电调模型,驱动其转动,而在传感器方面,虽然可以使用mavlink协议读取,但考虑到matlab相关模块局限性,这里选择了使用Ros读取。
Gazebo话题的订阅发布于Ros话题订阅发布类似,也可参考px4相关源码,以下是ros话题的订阅发布方式:
ros节点初始化,也可以省略,一般默认使用已初始化的节点

if (!ros::isInitialized())
{
  int argc = 0;
  char **argv = NULL;
  ros::init(argc, argv, "gazebo_client",
      ros::init_options::NoSigintHandler);
}
// Create our ROS node. This acts in a similar manner to
// the Gazebo node
this->rosNode.reset(new ros::NodeHandle("gazebo_client"));

创建ros话题并发布

其次是创建并发布话题

// Create a named topic, publish to it.
  mag_pub = this->rosNode->advertise<geometry_msgs::Vector3>("/" +model_->GetName() + "/mag",20);
  gps_ros_pub = this->rosNode->advertise<geometry_msgs::Twist>("/" +model_->GetName() + "/gps",1);
  bar_ros_pub=this->rosNode->advertise<geometry_msgs::Vector3>("/" +model_->GetName() + "/bar",20);

以上代码发布格式可以根据自身情况确定,这里为了方便如此定义
其次添加发布模块

    mag_.x =   mag_msg->magnetic_field().x();
    mag_.y =   mag_msg->magnetic_field().y();
    mag_.z =   mag_msg->magnetic_field().z();
   mag_pub.publish(mag_);

此处作用为将gazebo话题的消息转播为ros话题消息,方便matlab的读取。
对于四旋翼的控制,其控制主要依靠磁力计,gps,气压计,剩余两种传感器数据发送方式类似,不再叙述。

mavlink控制转播

虽然可以使用mavlink直接控制模型的电机电调,但由于matlab在mavlink封装方面的局限性,这里选择使用python转播信号。
关于电机控制mavlink消息定义如下,命令代号93,按需求填写其内容即可

HIL_ACTUATOR_CONTROLS ( #93 )
[Message] Sent from autopilot to simulation. Hardware in the loop control outputs (replacement for HIL_CONTROLS)
Field Name Type Units Values Description
time_usec uint64_t us Timestamp (UNIX Epoch time or time since system boot). The receiving end can infer timestamp format (since 1.1.1970 or since system boot) by checking for the magnitude of the number.
controls float[16] Control outputs -1 … 1. Channel assignment depends on the simulated hardware.
mode uint8_t MAV_MODE_FLAG System mode. Includes arming state.
flags uint64_t Flags as bitfield, 1: indicate simulation using lockstep.

from pymavlink import mavutil
connection=mavutil.mavlink_connection(('tcp:0.0.0.0:4560'))
connection.mav.hil_actuator_controls_send(int(time.time()*1e6),channel_values,255,1)

其中channel_values为16维float32数组,关于ros转播话题发布不再赘述。
完成以上转播后即可开始matlab的配置。

matlab配置

在这里插入图片描述
组内搭建的四旋翼控制系统如图所示。
接下来接入ros传感器
imu数据接入
mag数据接入
pwm信号输出
在这里插入图片描述
完成以上配置后,即可开始matlab与gazebo的联合仿真了。

联合仿真

通过model_state还原无人机位置状态
在这里插入图片描述
通过matlab运行仿真程序,并分析数据
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sitl_gazebo,px4模型matlab接口分析,gazebo与matlab联合仿真 的相关文章

  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • 将数据提示堆栈放在轴标签顶部,并在轴位置发生更改后更新轴标签

    此问题仅适用于 unix matlab Windows 用户将无法重现该问题 我在尝试创建位于 y 轴标签顶部的数据提示时遇到问题 下图很能说明问题 正如您所看到的 在 ylabel 附近创建的数据提示将到达 ylabel 文本的底部 而期
  • 动态调整自定义刻度数

    Taking SO 的一个例子 https stackoverflow com a 7139485 97160 我想根据当前视图调整轴刻度 这是默认行为 除非设置自定义的刻度数 下图展示了由此产生的行为 左侧是默认行为 右侧是带有自定义刻度
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • Matlab 一个图上有多个图例 2014b

    我想在一个地块上有多个传说 该解决方案在 2014b 版本之前完美运行 我试图弄清楚如何使用手柄优雅地制作它 但到目前为止还没有成功 欢迎任何想法 2013b 的示例 x 1 50 y1 sin x 2 y2 cos x 2 f figur
  • 如何使用Matlab将数据保存到Excel表格中?

    我想将数据以表格形式保存在 Excel 工作表中 它应该看起来像 Name Age R no Gpa Adnan 24 18 3 55 Ahmad 22 12 3 44 Usman 23 22 3 00 每次当我执行我的文件时类数据 m 下
  • 如何在Matlab中打印带有千位分隔符的整数?

    我想使用逗号作为千位分隔符将数字转换为字符串 就像是 x 120501231 21 str sprintf 0 0f x 但随着效果 str 120 501 231 21 如果内置fprintf sprintf做不到 我想可以使用正则表达式
  • FMINCON 的替代方案

    除了 fmincon 之外还有其他更快 更高效的求解器吗 我正在使用 fmincon 来解决特定问题 但对于中等大小的向量变量来说 我的内存不足 我也没有任何超级计算机或云计算选项可供使用 我知道任何替代解决方案仍然会耗尽内存 但我只是想看
  • 通过多次合并相同的行向量来构建矩阵

    有没有一个matlab函数可以让我执行以下操作 x 1 2 2 3 然后基于x我想建立矩阵m 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 3 您正在寻找REPMAT http www mathworks com help t
  • MATLAB - 通过垂直连接子矩阵重新排列矩阵

    我在执行以下任务时遇到问题 假设一个 3x6 矩阵 A 0 2787 0 2948 0 4635 0 8388 0 0627 0 0435 0 6917 0 1185 0 3660 0 1867 0 2383 0 7577 0 6179 0
  • 如何选择面积最大的对象?

    我用过bwconvhull检测图像的某个部分 正如您在图像中看到的那样 有许多具有特定质心的对象 我想做的是检测面积最大的物体 左起第一个大物体 并忽略其他物体 我应该遵循哪种方法 我将非常感谢您的帮助 以下是代码 由于我仍在努力 所以写得
  • 2D 网格的纹理贴图

    我有一组点 x y meshgrid 1 N 1 M 在常规二维上定义 N x M网格 我还有另一组要点 u v 这是原始网格的一些变形 即 u v f x y 但是我没有实际的f导致变形 如何将纹理映射到由定义的 变形 网格u v 即 给
  • 像matlab一样在python中连接数组而不知道输出数组的大小

    我正在尝试在 python 中连接数组 类似于 matlab array1 zeros 3 500 array2 ones 3 700 array array1 array2 我在 python 中做了以下操作 array1 np zero
  • MATLAB parfor 和 C++ 类 mex 包装器(需要复制构造函数?)

    我正在尝试使用概述的方法将 C 类包装在 matlab mex 包装器中here http www mathworks com matlabcentral newsreader view thread 278243 基本上 我有一个初始化
  • 考虑预分配速度[重复]

    这个问题在这里已经有答案了 我正在做以下事情 for i 1 m index 0 for j 1 n index index values i j 2 j 1 if j 1 symbol chip chip values index 1 e
  • 在矩阵中找到叉的最快方法

    定义 A i j 1 是十字的中点 如果元素A i 1 j 1A i 1 j 1A i j 1 1A i j 1 1 这些元素和中点一起形成矩阵 A 中的十字 其中 A 至少是一个 3 3 矩阵 并且i j 0 假设上图是 8 8 矩阵 A
  • MATLAB:图像角坐标和引用元胞数组

    我在比较不同元胞数组中的元素时遇到一些问题 这个问题的背景是我正在使用bwboundariesMATLAB 中的函数可追踪图像的轮廓 该图像是结构横截面 我试图找出整个部分是否具有连续性 即 只有一个轮廓由bwboundaries命令 完成
  • 图像处理方面的空间和时间表征有什么区别?

    我是学习图像处理的初学者 我对空间和时间表征的概念有点困惑 那么 对于空间表征来说 是不是像一张二维地图 包含了一些关于地图的统计信息呢 就时间特征而言 值是相对于时间的吗 这意味着什么以及我们为何关心 谢谢 当您在不同时间拍摄一系列图像时
  • 如何在matlab中使矩阵图平滑

    就像上图一样 怎样才能让画面更流畅呢 或者缩小y轴的范围 数据来自二维矩阵 然后我用plot data 请随意提出任何想法 平滑线条的一种方法涉及样本点之间数据的非线性插值 当你这样做时plot x y o http www mathwor

随机推荐