【开发环境】搭建PX4+ROS2+MAVROS2+Simulink+Optitrack实物联合仿真环境

news2024/9/22 11:26:41

搭建PX4+ROS2+MAVROS2+Simulink+OptiTrack实物联合仿真环境

    • Ubuntu中的安装过程
      • 下载并编译PX4固件代码
      • 安装ROS2
      • 安装VRPN动捕数据转换ROS2话题库
        • 安装VRPN库
        • 拉取vrpn_client_ros2节点代码并配置VRPN server参数
        • 编译软件包
        • 启动vrpn_client_ros2节点
        • 重命名话题名 /vrpn/fly/pose 为 /mavros/vision_pose/pose
      • 安装MAVROS2
      • MAVROS2连接仿真和实机需要的参数配置
        • MAVROS2连接仿真
        • MAVROS2连接实机
      • MAVROS2控制无人机常用命令
    • Windows中的安装过程
      • 安装python3.9
      • 安装Visual Studio 2019
      • 下载mavros_msgs包并编译
      • 安装UAV Toolbox Support Package for PX4 Autopilots硬件支持包
    • 在Simulink中编译ROS2节点并部署在Ubuntu中
      • 关闭Windows防火墙
      • Ubuntu中开启SSH服务
      • 建立Simulink模型
      • 编译并部署ROS2节点
    • 动捕系统配置
      • 数据流设置
      • 创建刚体
    • 实机飞行测试
      • 无人机相关设置
      • 启动vrpn_client_ros2节点
      • 启动MAVROS2
      • 启动ROS2节点InfinityFlightReal

本篇文章介绍如何搭建使用ROS2对PX4固件与Matlab/Simulink进行联合实物仿真的环境,以及如何安装所有所需软件和构建ROS2应用程序。

环境:

MATLAB : R2022b

Ubuntu :20.04 LTS

Windows :Windows 10

ROS :ROS2 Foxy

Python: 3.8.2

Visual Studio :Visual Studio 2019

PX4 :1.13.0

在这里插入图片描述

Ubuntu中的安装过程

下载并编译PX4固件代码

新建文件夹,文件夹名字可以任意取。

mkdir -p px4src_v1.13.0

之后我们使用lscd命令进入这个文件夹。

cd px4src_v1.13.0/

需要下载PX4 1.13版本的固件,请使用以下命令。

git clone -b v1.13.0 https://github.com/PX4/Firmware.git

clone成功之后,你会发现文件夹路径下面多了一个文件夹Firmware,我们使用lscd命令进入Firmware文件夹中。

cd Firmware/

Firmware里面就是PX4的源码,但是它依赖了很多其他的库,所以此时不完整还不能用,我们需要更新他的依赖。

git submodule update --init --recursive

安装ROS2

安装ROS2,推荐用鱼香ROS的一键安装。

鱼香ROS网站上线|一行代码安装ROS/ROS2/解决rosdep问题|小鱼脚本

wget http://fishros.com/install -O fishros && bash fishros

之后按照终端中的提示进行安装即可。

安装ROS2后还需要安装一些依赖环境。

sudo apt install python3-colcon-common-extensions
sudo apt install ros-foxy-eigen3-cmake-module
sudo pip3 install -U empy pyros-genmsg setuptools

安装VRPN动捕数据转换ROS2话题库

安装VRPN库

执行以下命令安装VRPN库。

git clone https://github.com/vrpn/vrpn.git
mkdir -p vrpn/build
cd vrpn/build
cmake ..
make 
sudo make install
拉取vrpn_client_ros2节点代码并配置VRPN server参数

执行以下命令拉取vrpn_client_ros2代码。

git clone https://github.com/efc-robot/vrpn_client_ros2

拉取完成后,编辑代码中的配置文件 vrpn_client_ros2/src/vrpn_listener/config/params.yaml

/vrpn_listener:
     ros__parameters:
        server: 192.168.1.2               # VRPN server在局域网内的IP
        port: 3883                        # VRPN server的服务端口
        frame_id: "world"                 # reference frame参数
        mainloop_frequency: 100.0         # 主循环频率,频率越高,越不容易丢失VRPN数据包,但同时计算负载越大
        refresh_trackers_frequency: 1.0   # 追踪器刷新频率,频率越高,发现新的VRPN tracker的实时性越强
        tracker_mainloop_frequency: 100.0 # 追踪器主循环频率,频率越高,越不容易丢失VRPN数据包,但同时计算负载越大
  • 根据动捕软件的数据发送设置,配置 serverport 参数。
  • 不推荐修改其余配置项,默认即可。
编译软件包

执行以下命令编译vrpn_client_ros2,其中 ${ROS_DISTRO} 替换为实际使用的ROS2版本。

source /opt/ros/${ROS_DISTRO}/setup.bash
cd vrpn_client_ros2/src
colcon build
启动vrpn_client_ros2节点

执行以下命令运行vrpn_client_ros2节点。

cd vrpn_client_ros2/src
source install/setup.bash
ros2 launch vrpn_listener sync_entity_state.launch

在这里插入图片描述

重命名话题名 /vrpn/fly/pose 为 /mavros/vision_pose/pose

编辑代码中的launch文件vrpn_client_ros2/src/vrpn_listener/launch/sync_entity_state.launch

改为以下代码。

<launch>
<arg name="server" default="localhost"/>
<node name="vrpn_listener" pkg="vrpn_listener" exec="vrpn_listener"  output="screen">
    <param from="$(find-pkg-share vrpn_listener)/config/params.yaml"/>
    <remap from="/vrpn/fly/pose" to="/mavros/vision_pose/pose"/>
</node>
</launch>

之后重新编译软件包并运行节点即可。

安装MAVROS2

创建ROS2工作空间。

mkdir -p ~/mavros2_ws/src
cd ~/mavros2_ws

下载MAVLink和MAVROS2源码。

source /opt/ros/foxy/setup.bash
rosinstall_generator --format repos mavlink | tee /tmp/mavlink.repos
rosinstall_generator --format repos --upstream mavros | tee -a /tmp/mavros.repos
vcs import src < /tmp/mavlink.repos
vcs import src < /tmp/mavros.repos
rosdep install --from-paths src --ignore-src -y

安装依赖数据集。

sudo ./src/mavros/mavros/scripts/install_geographiclib_datasets.sh

从github官网下载MAVROS2的ros2分支的最新版本代码,替换mavros2_ws/src文件夹中的mavros文件夹。

MAVROS2

编译工作空间。

source ~/mavros2_ws/install/setup.bash
colcon build

新建一个终端,测试MAVROS2能否正常启动。

source /opt/ros/foxy/setup.bash
source ~/mavros2_ws/install/setup.bash
ros2 launch mavros px4.launch

MAVROS2连接仿真和实机需要的参数配置

默认情况下,PX4使用固定的UDP端口与地面站(如QGroundControl)、机载电脑(如MAVSDK、MAVROS)和仿真器(如Gazebo)进行MAVLink通信。

PX4的UDP端口14550用于与地面站进行通信。地面站侦听此端口上的连接,QGroundControl默认侦听此端口。

PX4的UDP端口14540用于与Offboard模式板外电脑进行通信。Offboard模式板外电脑应侦听此端口上的连接。

MAVROS2连接仿真
source /opt/ros/foxy/setup.bash
source ~/mavros2_ws/install/setup.bash
ros2 launch mavros px4.launch fcu_url:=udp://:14540@127.0.0.1:14555

在这里插入图片描述

MAVROS2连接实机

这里192.168.1.11是无人机上WiFi模块的IP地址。

source /opt/ros/foxy/setup.bash
source ~/mavros2_ws/install/setup.bash
ros2 launch mavros px4.launch fcu_url:=udp://:14550@192.168.1.11:14555

在这里插入图片描述

MAVROS2控制无人机常用命令

查看所有ROS2话题:

ros2 topic list

查看MAVROS2连接状态:

ros2 topic echo /mavros/state

查看ROS2话题发布频率:

ros2 topic hz /mavros/state

解锁:

ros2 service call /mavros/cmd/arming mavros_msgs/srv/CommandBool "{value: True}"

上锁:

ros2 service call /mavros/cmd/arming mavros_msgs/srv/CommandBool "{value: False}"

Windows中的安装过程

为了与Ubuntu中的PX4固件仿真相连接,我们需要在Windows上的Matlab上使用ROS2进行通信。

可以在Matlab官网看到Matlab使用ROS Toolbox工具箱的环境依赖,我的Matlab安装后就自带了ROS Toolbox工具箱。

ROS Toolbox System Requirements

在这里插入图片描述

可以看到Matlab 2022b版本对应的环境为Python 3.9和Visual Studio 2019。

安装python3.9

Python Releases for Windows

安装之后可以在任意终端中查询Python版本。

python --version

安装Visual Studio 2019

Visual Studio 2019 version 16.11 Release Notes

安装时勾选【python开发】和【使用C++的桌面开发】。

在这里插入图片描述

下载mavros_msgs包并编译

在使用Matlab的ROS Toolbox工具箱编译与PX4联合调试的代码,Matlab官方给出的示例是使用ROS2配合microRTPS连接无人机,并发送控制命令来导航模拟无人机。

Control a Simulated UAV Using ROS 2 and PX4 Bridge

但是实际中使用更多的是MAVROS2连接的方法,所以这里选择了编译MAVROS2消息来实现与Matlab的联合调试。

MAVROS2

在官网下载MAVROS2的源码,使用Matlab中的ros2genmsg命令生成ROS2消息。

Generate custom messages from ROS 2 definitions

新建一个PX4-ROS2-Simulink文件夹用来存储工程文件(名字可以任取),在其下新建custom文件夹、others文件夹。

将下载的MAVROS2包的Zip压缩包放在PX4-ROS2-Simulink/others文件夹下。

解压,将其中的mavros_msgs文件夹放在PX4-ROS2-Simulink/custom文件夹下。

下载geographic_msgs消息包,一起放到custom文件夹下进行编译。

打开官网链接进行下载,注意需要下载的是ROS2版本的。

ros-geographic-info/geographic_info

解压后将其中的geographic_msgs文件夹复制到custom文件夹下

将下载的geographic_msgs包的Zip压缩包放在PX4-ROS2-Simulink/others文件夹下。

解压,将其中的geographic_msgs文件夹放在PX4-ROS2-Simulink/custom文件夹下。

最后的结构为下列所示。

PX4-ROS2-Simulink
├─custom
|  ├─geographic_msgs
|  |   ├─include
|  |   ├─msg
|  |   ├─srv
|  |   ├─test
|  |   ├─CHANGELOG.rst
|  |   ├─CMakeLists.txt
|  |   ├─geographic_msgs_mapping_rule.yaml
|  |   ├─mainpage.dox
|  |   └─package.xml
|  └─mavros_msgs
|      ├─include
|      ├─msg
|      ├─srv
|      ├─CHANGELOG.rst
|      ├─CMakeLists.txt
|      ├─mavros_msgs_mapping_rule.yaml
|      └─package.xml
└─others
   └─mavros-ros2.zip

用Matlab打开PX4-ROS2-Simulink文件夹,编译即可。

folderPath = fullfile(pwd,"custom");
ros2genmsg(folderPath);

等待一段时间后会在custom生成一个新文件夹matlab_msg_gen。

这说明mavros_msgs包已经编译成功。

安装UAV Toolbox Support Package for PX4 Autopilots硬件支持包

打开Matlab,点击【附加功能】中的【获取附加功能】。

在这里插入图片描述

搜索并安装UAV Toolbox Support Package for PX4 Autopilots硬件支持包,安装完之后点击右侧的设置按钮。

在这里插入图片描述

点击【Next】-【Install】安装Python 3.8.2,安装完毕后点击【Next】。

在这里插入图片描述

点击文字中的【link】。

在这里插入图片描述

点击【at this link】。

在这里插入图片描述

下载【PX4.Windows.Cygwin.Toolchain.0.8.msi】。

在这里插入图片描述

运行并安装【PX4.Windows.Cygwin.Toolchain.0.8.msi】。

在这里插入图片描述

点击【Verify Installation】。

在这里插入图片描述

之后下载PX4源码并编译,点击【Verify】,程序会自动运行。

在这里插入图片描述

选择【Design Flight Controller in Simulink】。

在这里插入图片描述

如果只仿真的话选择【PX4 Host Target】即可。

在这里插入图片描述

点击【Build Firmware】编译固件。

在这里插入图片描述

编译完成后Matlab命令行界面显示如下。

在这里插入图片描述

编译成功后点击【Next】-【Next】-【Finish】即可。

在这里插入图片描述

在Simulink中编译ROS2节点并部署在Ubuntu中

关闭Windows防火墙

首先需要关闭Windows的Windows Defender防火墙,并允许其他网络用户联机。

打开【控制面板】-【网络和共享中心】找到【更改适配器选项】。

在这里插入图片描述

双击已连接的局域网【WLAN】。

在这里插入图片描述

单机【属性】,在【共享】栏中勾选【允许其他网络用户通过此计算机的Internet连接来联机(N)】。

在这里插入图片描述

确保两台设备在同一网段,并可以互相ping

Ubuntu中开启SSH服务

打开终端,使用命令安装SSH服务。

sudo apt install openssh-server

开启防火墙ssh的服务端口。

sudo ufw allow ssh

一些常用的命令。

systemctl status ssh         #查看ssh服务状态
systemctl stop ssh           #关闭ssh服务
systemctl start ssh          #开启ssh服务
systemctl restart ssh        #重启ssh服务
sudo systemctl enable ssh    #设置开启自启
sudo systemctl disable ssh   #关闭开机自启

建立Simulink模型

在Matlab工作文件夹中新建一个文件夹models用来存放Simulink模型,新建一个模型我这里命名为InfinityFlightReal.slx,双击使用Simulink打开。

在这里插入图片描述

这里使用Pulse Generator模块生成一个10Hz的脉冲信号,作为位置信息发送的频率。

在这里插入图片描述

SendPosition模块内部是使用mavros_msgs包中的mavros/setpoint_position/local话题,该话题定义了位置信息。

mavros_msgs/PositionTarget Message定义

以下是生成位置轨迹的Matlab代码。

function y = fcn(t)

a = 4;%x轴上的范围
b = 6;%y轴上的范围
w = 0.2;%角速度

if t < 5
    position_x = 0;
    position_y = 0;
    position_z = 2;
else
    t = t-5;%去掉轨迹飞行开始前的时间

    position_x = b * sin(w * t) .* cos(w * t);
    position_y = a * sin(w * t);
    position_z = 2;
end

y = [position_x position_y position_z];

编译并部署ROS2节点

这里需要确保Windows电脑和Ubuntu电脑在同一网段,并且可以互相ping通。

在Simulink模型的ROS栏目里,点击【Manage Remote Device】设置Ubuntu所在的设备的相关配置。

在这里插入图片描述

【Device address】设置为Ubuntu电脑的IP地址,【Username】设置为Ubuntu电脑的用户名,【Password】设置为Ubuntu电脑的密码,【ROS 2 folder】选择为ROS2的安装地址,【ROS 2 workspace】选择一个ROS2工作空间,之后可以点击【Test】进行测试。

在这里插入图片描述

测试成功后可以点击Simulink模型栏目中的【Build & Load】中的【Build & Load】,程序会自动编译并将节点部署在Ubuntu中的ROS2工作空间中。

在这里插入图片描述

动捕系统配置

OptiTrack MOTIVE软件手册

在这里插入图片描述

数据流设置

Motive 软件可以通过多种方式将捕捉到的数据实时传输到其他程序,常用的传输方式是 VRPN。可以通过菜单栏【View】-【Data Streaming Pane】对数据传输进行设置。

在这里插入图片描述

这里需要按下图配置VRPN的相关参数,其中【Local Interface】设置为运行Motive软件所在电脑的IP地址。

在这里插入图片描述

创建刚体

将标记点固定在需要进行观测的无人机上,放置在标定好的动捕场地中,在 MOTIVE 软件的 3D 视图中可以看到对应的标记点,如下图所示,无人机上固定有四个标记点。

在这里插入图片描述

框选住刚体模型所有标记点,点击右键选择【Rigid Body】下的【Create From Selected Markers】,完成刚体创建。

在这里插入图片描述

这时 MOTIVE 软件右下角会出现该刚体的属性窗口,可以对该刚体进行重命名。

在这里插入图片描述

实机飞行测试

无人机相关设置

将无人机的模式切换设置为遥控器的某个开关切换,切换需要的三个模式:自稳模式、位置模式和Offboard模式。

确保无人机与Ubuntu电脑在同一局域网,使用QGC地面站可以直接与无人机进行无线连接。

启动vrpn_client_ros2节点

执行以下命令运行vrpn_client_ros2节点。

cd vrpn_client_ros2/src
source install/setup.bash
ros2 launch vrpn_listener sync_entity_state.launch

启动MAVROS2

新建一个终端,启动MAVROS2。

source /opt/ros/foxy/setup.bash
source ~/mavros2_ws/install/setup.bash
ros2 launch mavros px4.launch fcu_url:=udp://:14550@192.168.1.11:14555

启动完vrpn_client_ros2节点和MAVROS2后,无人机就收到了位置信息,正常情况下就可以切换到位置模式了。

启动ROS2节点InfinityFlightReal

新建一个终端,启动ROS2节点InfinityFlightReal。

cd ~/trajectoryfly_ws
source /opt/ros/foxy/setup.bash
source ~/mavros2_ws/install/setup.bash
ros2 run infinityflightreal InfinityFlightReal

先启动ROS2节点InfinityFlightReal再使用遥控器切换到offboard模式,无人机就会沿设定的轨迹飞行了。

在这里插入图片描述


参考资料:

【PX4|Mavros】Ubuntu 20.04 配置 ROS2 下的 PX4 开发环境(包括 ROS2 foxy 和 Mavros2)

How to use mavros2

Optitrack与ROS详细教程以及Motive的使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1921598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫新手实战导航:精选示例项目助你快速上手Python爬虫(含几十个案例源码)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Python爬虫 📒📝 爬虫小案例(附源码)📝 如何利用这些示例项目进行学习?🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 对于Python初学者而言,理论学习固然重要,但若想真正掌握爬虫技术,大量的实际项目训练和…

一篇喂饭级教程Python时序预测常用方法以及代码演示

在时序预测中,常用的方法包括以下几种&#xff1a; A.移动平均法 B.指数平滑法 C.自回归(AR)模型 D.滑动平均(MA)模型 E.自回归滑动平均(ARMA)模型 F.长短期记忆网络(LSTM) 下面我将逐一展示每种方法的代码示例&#xff1a; 1.移动平均法 import numpy as np# 创建时间…

华润万家超市购物卡怎么使用?

前两天整理杂物&#xff0c;翻出来两张华润的礼品卡&#xff0c;好在还没有过期 但是那卡只能在线下使用&#xff0c;而且面值也就一百 让我专门跑一趟华润感觉太不方便了 最后朋友告诉我说&#xff0c;可以在收卡云上面把卡内的余额直接提出来&#xff0c;我两张一百的卡总…

开放式耳机哪款性价比高?这五款超值精品不容错过

喜欢进行户外运动的小伙伴们&#xff0c;应该都很需要一款既可以匹配运动场景&#xff0c;又兼顾音质体验的无线蓝牙耳机吧。而开放式耳机拥有佩戴舒适牢固&#xff0c;不堵塞耳部&#xff0c;不影响外部声音传入耳部的优点&#xff0c;完全可以成为运动健身人士户外运动的好伴…

XCP协议介绍(二)

五、XCP命令简介 5.1 数据包简介 XCP的数据包分为两类&#xff1a;CTO(Command Transfer Object)与DTO(Data Transfer Object) CMD&#xff1a;指的是上位机下发给下位机的一些命令&#xff0c;比如连接命令FF&#xff0c;解锁&#xff0c;获取状态等一些和下位机交互的命令&…

【算法题】小红的区间翻转

题目 解题思路 第一想法&#xff1a;暴力&#xff1f; 第一个想法就是写一个验证翻转的函数&#xff0c;然后暴力遍历两遍 验证翻转的函数是这样写的&#xff0c;先克隆&#xff0c;再翻转对应区间&#xff0c;最后用equals判断 public static boolean isValidFlip(int[] a, …

Nodejs 第八十六章(部署pm2)

Node.js如何部署? 如果要部署Nodejs项目&#xff0c;第一点肯定是需要有台服务器&#xff0c;第二点需要一个部署工具这里使用pm2 PM2 PM2 是一个非常流行的 Node.js 进程管理工具&#xff0c;用于在生产环境中运行和监控 Node.js 应用程序。它提供了多种功能&#xff0c;帮…

[数仓]四、离线数仓(Hive数仓系统-续)

第8章 数仓搭建-DWT层 8.1 访客主题 1)建表语句 DROP TABLE IF EXISTS dwt_visitor_topic; CREATE EXTERNAL TABLE dwt_visitor_topic (`mid_id` STRING COMMENT 设备id,`brand` STRING COMMENT 手机品牌,`model` STRING COMMENT 手机型号,`channel` ARRAY<STRING> C…

Visual Studio远程调试工具

路径&#xff1a;安装路径/Common7/IDE/Remote Debugger/平台/msvsmon.exe。 平台有x86、x64&#xff0c;x64即可调试x86进程也可调试x64进程。 将平台路径下的所有文件拷贝至其他PC&#xff0c;运行msvsmon.exe。 工具栏选择“工具&#xff08;T&#xff09;”选择“选项“&…

基于STM32的RFID公交充值消费系统

1.简介 基于RFID技术的公交卡充值消费系统&#xff0c;以其高效快速、安全可靠、方便快捷、易于管理和环保节能等特点&#xff0c;为用户带来优质的公交出行体验。通过非接触式的数据读写&#xff0c;该系统实现了快速充值和消费&#xff0c;同时采用先进的加密和防碰撞算法确保…

浅谈后置处理器之调试后置处理程序

浅谈后置处理器之调试后置处理程序 “调试后置处理程序”(Debug PostProcessor) 是一个特别的组件&#xff0c;它主要用于帮助测试人员深入理解测试脚本执行过程中的变量和属性状态&#xff0c;便于调试和故障排查。 调试后置处理程序简介 功能概述&#xff1a; 调试后置处…

中科亿海微亮相慕尼黑上海电子展

7月8-10日&#xff0c;备受瞩目的全球电子行业盛会“慕尼黑上海电子展”以空前规模启幕&#xff0c;汇聚了超过1600家参展企业&#xff0c;涵盖了从终端产品制造商到元器件供应商、组装/系统供应商、EMS、ODM/OEM、材料供应商及生产设备供应商的完整产业链。中科亿海微电子科技…

Java将Excel转为图片

1. 支持多个Sheet 2. 支持识别 换行 / 文字居中 / 文字居左 3. 支持识别 背景颜色 / 字体颜色 4. 支持识别 计算公式 原Excel表单 识别后生成的图片 下载地址 : https://download.csdn.net/download/dongyan3595/89535740

Linux C语言基础 day7

目录 思维导图&#xff1a; 学习目标&#xff1a; 学习内容&#xff1a; 1. 数组 1.1 对数组元素的常规操作 1.1.1 逆序 1.1.2 挑选数据 1.1.3 排序 1. 冒泡排序 2. 选择排序 2. 二维数组 2.1 二维数组的概念 2.1.1. 定义格式 2.2.2.初始化 2.2 二维数组的相关操…

深度学习pytorch多机多卡网络配置桥接方法

1 安装pdsh&#xff08;Parallel Distributed Shell&#xff09; sudo apt install pdsh sudo -s # 切换超级用户身份 …

Vscode ssh远程连接Linux服务器登录时密码password无法输入

问题 最近在用Vscode远程连接Linux服务器时&#xff0c;在终端提示输入密码password的时候用键盘输入没有反应。 以为是键盘坏了&#xff0c;然后尝试复制粘贴没有用。 后来找到了原因以及解决方法&#xff0c;感谢原帖作者&#xff08;原贴链接粘在下面&#xff09; 原因 …

Java 多继承与接口

Java 多继承与接口 1、为什么Java不支持多继承&#xff1f;2、使用接口实现多继承2.1 接口的定义与实现 3、接口的优点4、结论 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 多继承是指一个类可以继承多个父类&#xff0c;从而获得多个父类…

RHCE-autofs自动挂载

要求 一、在主机上提供web&#xff0c;dns服务 服务端 IP&#xff1a;172.25.250.131/24 dns&#xff1a;172.25.250.131 [rootlocalhost ~]# cd /etc/httpd/conf.d[rootlocalhost conf.d]# vim vhost.conf [rootlocalhost conf.d]# mkdir /nfs/rhce -p[rootlocalhost conf…

基于企业微信第三方接口开发,移除群成员通知

移除群成员通知 返回示例 {"flag": 0, "receiver": 0, "sender_name": "", "is_room": 1, "server_id": 15318083, "send_time": 1687688952, "sender": 1688855749266556, "referid&…

根据视图矩阵, 恢复相机的世界空间的位置

根据视图矩阵, 恢复相机的世界空间的位置 一、方法1 glsl 实现: // 从本地局部坐标系(相机空间) 到 世界空间的旋转变换 mat3 getLocal2WorldRotation() {mat3 world2localRotation mat3(viewMatrix[0].xyz,viewMatrix[1].xyz,viewMatrix[2].xyz);return inverse(world2loca…