ArduPilot开源飞控之AP_VisualOdom

ArduPilot开源飞控之AP_VisualOdom

  • 1. 源由
  • 2. 类定义
    • 2.1 类与构造函数
    • 2.2 枚举类型
    • 2.3 公共方法
    • 2.4 消息处理
    • 2.5 其他功能
    • 2.6 私有成员
  • 3. 框架设计
    • 3.1 启动代码 AP_VisualOdom::init
    • 3.2 消息处理
      • 3.2.1 AP_VisualOdom::handle_vision_position_delta_msg
      • 3.2.2 AP_VisualOdom::handle_pose_estimate
      • 3.2.3 AP_VisualOdom::handle_vision_speed_estimate
    • 3.3 辅助函数
      • 3.3.1 AP_VisualOdom::enabled
      • 3.3.2 AP_VisualOdom::healthy
      • 3.3.3 AP_VisualOdom::quality
    • 3.4 参数接口
      • 3.4.1 AP_VisualOdom::get_orientation
      • 3.4.2 AP_VisualOdom::get_pos_scale
      • 3.4.3 AP_VisualOdom::get_pos_offset
      • 3.4.4 AP_VisualOdom::get_vel_noise
      • 3.4.5 AP_VisualOdom::get_pos_noise
      • 3.4.6 AP_VisualOdom::get_yaw_noise
      • 3.4.7 AP_VisualOdom::get_delay_ms
      • 3.4.8 AP_VisualOdom::get_quality_min
  • 4. 总结
  • 5. 参考资料

1. 源由

AP_VisualOdom主要是配合视觉定位应用,通常视觉定位应用于室内或者无GPS等辅助定位系统的环境。

2. 类定义

AP_VisualOdom 类用于视觉里程计系统在无人机上的实现。这个类具有多种方法和属性,用于初始化和操作视觉里程计传感器。

这些私有成员变量用于存储类的内部状态,包括传感器类型、位置偏移、方向、缩放比例、延迟时间、噪声等信息,以及一个后端驱动指针 _driver

总体来说,这个类设计用于处理和管理无人机上的视觉里程计传感器,提供了丰富的接口和功能来初始化、操作和查询传感器状态。

2.1 类与构造函数

class AP_VisualOdom
{
public:AP_VisualOdom();static AP_VisualOdom *get_singleton() {return _singleton;}
  • AP_VisualOdom 类是一个包含各种方法和属性的类。
  • AP_VisualOdom 构造函数用于初始化对象。
  • get_singleton 静态方法返回一个单例模式的实例。

2.2 枚举类型

enum class VisualOdom_Type {None = 0,
#if AP_VISUALODOM_MAV_ENABLEDMAV = 1,
#endif
#if AP_VISUALODOM_INTELT265_ENABLEDIntelT265 = 2,VOXL = 3,
#endif
};
  • VisualOdom_Type 枚举定义了几种视觉里程计类型,如 None, MAV, IntelT265VOXL

2.3 公共方法

void init();
bool enabled() const;
bool healthy() const;
enum Rotation get_orientation() const;
float get_pos_scale() const;
const Vector3f &get_pos_offset(void) const;
uint16_t get_delay_ms() const;
float get_vel_noise() const;
float get_pos_noise() const;
float get_yaw_noise() const;
int8_t get_quality_min() const;
int8_t quality() const;

这些方法提供了对视觉里程计传感器的各种操作和查询功能:

  • init:检测并初始化传感器。
  • enabled:返回传感器是否启用。
  • healthy:返回传感器是否处于健康状态(是否接收到数据)。
  • get_orientation:获取用户定义的传感器方向。
  • get_pos_scale:获取应用于位置估计的缩放比例。
  • get_pos_offset:获取相机相对于机体坐标系原点的位置偏移。
  • get_delay_ms:获取传感器的延迟时间(毫秒)。
  • get_vel_noise:获取速度测量噪声。
  • get_pos_noise:获取位置测量噪声。
  • get_yaw_noise:获取航向测量噪声。
  • get_quality_min:获取质量阈值。
  • quality:返回质量测量值。

2.4 消息处理

#if HAL_GCS_ENABLED
void handle_vision_position_delta_msg(const mavlink_message_t &msg);
#endif
void handle_pose_estimate(uint64_t remote_time_us, uint32_t time_ms, float x, float y, float z, float roll, float pitch, float yaw, float posErr, float angErr, uint8_t reset_counter, int8_t quality);
void handle_pose_estimate(uint64_t remote_time_us, uint32_t time_ms, float x, float y, float z, const Quaternion &attitude, float posErr, float angErr, uint8_t reset_counter, int8_t quality);
void handle_vision_speed_estimate(uint64_t remote_time_us, uint32_t time_ms, const Vector3f &vel, uint8_t reset_counter, int8_t quality);

这些方法用于处理视觉里程计传感器的消息:

  • handle_vision_position_delta_msg:处理视觉位置增量消息(仅在 HAL_GCS_ENABLED 时可用)。
  • handle_pose_estimate:处理姿态估计数据。
  • handle_vision_speed_estimate:处理速度估计数据。

2.5 其他功能

void request_align_yaw_to_ahrs();
void align_position_to_ahrs(bool align_xy, bool align_z);
bool pre_arm_check(char *failure_msg, uint8_t failure_msg_len) const;
VisualOdom_Type get_type(void) const {return _type;
}
  • request_align_yaw_to_ahrs:请求将传感器的航向与车辆的姿态参考系统(AHRS/EKF)对齐。
  • align_position_to_ahrs:更新位置偏移以对齐AHRS位置。
  • pre_arm_check:在启动检查时返回 false 表示检查失败,并提供失败消息。
  • get_type:获取传感器类型。

2.6 私有成员

private:static AP_VisualOdom *_singleton;AP_Enum<VisualOdom_Type> _type;AP_Vector3f _pos_offset;AP_Int8 _orientation;AP_Float _pos_scale;AP_Int16 _delay_ms;AP_Float _vel_noise;AP_Float _pos_noise;AP_Float _yaw_noise;AP_Int8 _quality_min;AP_VisualOdom_Backend *_driver;
};

3. 框架设计

3.1 启动代码 AP_VisualOdom::init

传统Ardupilot启动方式。

AP_Vehicle::setup└──> visual_odom.init
AP_VisualOdom::init()
└── switch (VisualOdom_Type(_type.get()))├── case VisualOdom_Type::None:│   └── // do nothing├── #if AP_VISUALODOM_MAV_ENABLED│   ├── case VisualOdom_Type::MAV:│   │   └── _driver = new AP_VisualOdom_MAV(*this);│   └── #endif├── #if AP_VISUALODOM_INTELT265_ENABLED│   ├── case VisualOdom_Type::IntelT265:│   ├── case VisualOdom_Type::VOXL:│   │   └── _driver = new AP_VisualOdom_IntelT265(*this);│   └── #endif└── default:└── // handle default case if necessary

根据不同的传感器类型选择性地实例化不同的后端驱动对象,从而初始化并准备使用视觉里程计系统。

  • VisualOdom_Type::None:如果 _typeNone,则什么也不做。
  • VisualOdom_Type::MAV:如果 _typeMAV,则创建一个 AP_VisualOdom_MAV 的实例并将其赋给 _driver
  • VisualOdom_Type::IntelT265VisualOdom_Type::VOXL:如果 _typeIntelT265VOXL,则创建一个 AP_VisualOdom_IntelT265 的实例并将其赋给 _driver
  • 其他情况:可能需要处理默认情况,具体实现取决于代码中是否有定义。

3.2 消息处理

3.2.1 AP_VisualOdom::handle_vision_position_delta_msg

SCHED_TASK_CLASS(GCS,                  (GCS*)&copter._gcs,          update_receive, 400, 180, 102),└──> GCS::update_receive└──> GCS_MAVLINK::update_receive└──> GCS_MAVLINK::packetReceived└──> GCS_MAVLINK::handle_message  //MAVLINK_MSG_ID_VISION_POSITION_DELTA└──> GCS_MAVLINK::handle_vision_position_delta└──> AP_VisualOdom::handle_vision_position_delta_msg
handle_vision_position_delta_msg(msg)
├── if HAL_GCS_ENABLED
│   ├── if !enabled()
│   │   └── return
│   └── if _driver != nullptr
│       └── _driver->handle_vision_position_delta_msg(msg)
└── (end of method)
  • 如果 HAL_GCS_ENABLED 没有定义,整个方法将被忽略,不会编译和执行。
  • 如果 enabled() 方法返回 false,则立即退出方法,不执行后续的逻辑。
  • 如果 _driver 不为 nullptr,则调用 _driver 对象的 handle_vision_position_delta_msg 方法,将 msg 作为参数传递给它。

这样的设计确保了在满足条件且传感器已启用时,有效地将接收到的视觉位置增量消息传递给相应的后端处理。

3.2.2 AP_VisualOdom::handle_pose_estimate

SCHED_TASK_CLASS(GCS,                  (GCS*)&copter._gcs,          update_receive, 400, 180, 102),└──> GCS::update_receive└──> GCS_MAVLINK::update_receive└──> GCS_MAVLINK::packetReceived└──> GCS_MAVLINK::handle_message //MAVLINK_MSG_ID_VISION_POSITION_ESTIMATE/MAVLINK_MSG_ID_GLOBAL_VISION_POSITION_ESTIMATE/MAVLINK_MSG_ID_VICON_POSITION_ESTIMATE└──> GCS_MAVLINK::handle_vision_position_estimate/handle_global_vision_position_estimate/handle_vicon_position_estimate└──> GCS_MAVLINK::handle_common_vision_position_estimate_data└──> AP_VisualOdom::handle_pose_estimate
handle_pose_estimate(uint64_t remote_time_us, uint32_t time_ms, float x, float y, float z, float roll, float pitch, float yaw, float posErr, float angErr, uint8_t reset_counter, int8_t quality)
│
├── if (!enabled())
│   └── return;
│
└── if (_driver != nullptr)│├── Quaternion attitude│   └── attitude.from_euler(roll, pitch, yaw)│└── _driver->handle_pose_estimate(remote_time_us, time_ms, x, y, z, attitude, posErr, angErr, reset_counter, quality)

这段代码是用于处理姿态估计数据并将其发送给扩展卡尔曼滤波器(EKF)的方法。
目的是将来自视觉里程计传感器的姿态估计数据传送给后端处理,以便进一步的状态估计和导航。

  1. 参数

    • remote_time_us:远程时间戳(微秒)。
    • time_ms:本地时间戳(毫秒)。
    • x, y, z:位置坐标(米)。
    • roll, pitch, yaw:姿态角(弧度)。
    • posErr:位置误差。
    • angErr:角度误差。
    • reset_counter:重置计数器。
    • quality:质量评估(-1 表示失败,0 表示未知,1 最差,100 最佳)。
  2. 功能

    • enabled() 方法检查传感器是否启用,如果未启用则立即返回。
    • 如果 _driver 驱动器不为空,创建一个 Quaternion 对象 attitude,通过 from_euler(roll, pitch, yaw) 方法将欧拉角转换为四元数。
    • 调用 _driver->handle_pose_estimate() 方法,将处理过的姿态估计数据和质量评估传递给后端处理。
  3. API

    • uint64_t remote_time_us, uint32_t time_ms, float x, float y, float z, float roll, float pitch, float yaw, float posErr, float angErr, uint8_t reset_counter, int8_t qualit
    • uint64_t remote_time_us, uint32_t time_ms, float x, float y, float z, const Quaternion &attitude, float posErr, float angErr, uint8_t reset_counter, int8_t quality
// general purpose method to consume position estimate data and send to EKF
// distances in meters, roll, pitch and yaw are in radians
// quality of -1 means failed, 0 means unknown, 1 is worst, 100 is best
void AP_VisualOdom::handle_pose_estimate(uint64_t remote_time_us, uint32_t time_ms, float x, float y, float z, float roll, float pitch, float yaw, float posErr, float angErr, uint8_t reset_counter, int8_t quality)
{// exit immediately if not enabledif (!enabled()) {return;}// call backendif (_driver != nullptr) {// convert attitude to quaternion and call backendQuaternion attitude;attitude.from_euler(roll, pitch, yaw);_driver->handle_pose_estimate(remote_time_us, time_ms, x, y, z, attitude, posErr, angErr, reset_counter, quality);}
}// general purpose method to consume position estimate data and send to EKF
// quality of -1 means failed, 0 means unknown, 1 is worst, 100 is best
void AP_VisualOdom::handle_pose_estimate(uint64_t remote_time_us, uint32_t time_ms, float x, float y, float z, const Quaternion &attitude, float posErr, float angErr, uint8_t reset_counter, int8_t quality)
{// exit immediately if not enabledif (!enabled()) {return;}// call backendif (_driver != nullptr) {_driver->handle_pose_estimate(remote_time_us, time_ms, x, y, z, attitude, posErr, angErr, reset_counter, quality);}
}

3.2.3 AP_VisualOdom::handle_vision_speed_estimate

SCHED_TASK_CLASS(GCS,                  (GCS*)&copter._gcs,          update_receive, 400, 180, 102),└──> GCS::update_receive└──> GCS_MAVLINK::update_receive└──> GCS_MAVLINK::packetReceived└──> GCS_MAVLINK::handle_message  //MAVLINK_MSG_ID_VISION_SPEED_ESTIMATE/MAVLINK_MSG_ID_ODOMETRY└──> GCS_MAVLINK::handle_vision_speed_estimate/handle_odometry└──> AP_VisualOdom::handle_vision_speed_estimate
handle_vision_speed_estimate(remote_time_us, time_ms, vel, reset_counter, quality)
└── if not enabled()└── return
└── if _driver != nullptr└── _driver->handle_vision_speed_estimate(remote_time_us, time_ms, vel, reset_counter, quality)

用于处理视觉里程计传感器的速度估计数据,并将其发送到扩展卡尔曼滤波器(EKF)的通用方法。

  1. 函数签名和说明

    • 函数名:handle_vision_speed_estimate
    • 参数:
      • remote_time_us:远程时间戳(微秒)
      • time_ms:本地时间戳(毫秒)
      • vel:速度估计的三维向量(NED坐标系,单位为米每秒)
      • reset_counter:重置计数器
      • quality:质量评估,-1 表示失败,0 表示未知,1 表示最差,100 表示最佳。
  2. 功能说明

    • 首先,检查视觉里程计是否启用(调用了类的 enabled() 方法)。如果未启用,则立即返回,不执行后续操作。
    • 然后,检查 _driver 指针是否为 nullptr。如果 _driver 不为空,则调用 _driver 对象的 handle_vision_speed_estimate 方法,将速度估计数据传递给后端处理。
  3. 执行流程

    • 如果视觉里程计未启用,函数直接返回,不执行后续任何操作。
    • 如果视觉里程计已启用且 _driver 指针有效,则通过 _driver 对象处理速度估计数据。

3.3 辅助函数

3.3.1 AP_VisualOdom::enabled

通过判断类型设置,确认视觉传感是否被使能。

// return true if sensor is enabled
bool AP_VisualOdom::enabled() const
{return ((_type != VisualOdom_Type::None));
}

3.3.2 AP_VisualOdom::healthy

首先检查传感器是否已启用,然后再检查是否有有效的驱动程序实例来处理传感器数据。
只有在这两个条件都满足时,才会进一步检查传感器的健康状态并返回结果。

healthy()
├── if (!enabled())
│   └── return false
├── if (_driver == nullptr)
│   └── return false
└── return _driver->healthy()

3.3.3 AP_VisualOdom::quality

返回质量测量值(百分比)。

  • 0:Unknown
  • 1:Worst
  • 100:Best
// return quality as a measure from 0 ~ 100
// -1 means failed, 0 means unknown, 1 is worst, 100 is best
int8_t AP_VisualOdom::quality() const
{if (_driver == nullptr) {return 0;}return _driver->quality();
}

3.4 参数接口

3.4.1 AP_VisualOdom::get_orientation

获取用户定义的传感器方向。

    // get user defined orientationenum Rotation get_orientation() const { return (enum Rotation)_orientation.get(); }

3.4.2 AP_VisualOdom::get_pos_scale

获取应用于位置估计的缩放比例。

    // get user defined scaling applied to position estimatesfloat get_pos_scale() const { return _pos_scale; }

3.4.3 AP_VisualOdom::get_pos_offset

获取相机相对于机体坐标系原点的位置偏移。

    // return a 3D vector defining the position offset of the camera in meters relative to the body frame originconst Vector3f &get_pos_offset(void) const { return _pos_offset; }

3.4.4 AP_VisualOdom::get_vel_noise

获取速度测量噪声。

    // return velocity measurement noise in m/sfloat get_vel_noise() const { return _vel_noise; }

3.4.5 AP_VisualOdom::get_pos_noise

获取位置测量噪声。

    // return position measurement noise in mfloat get_pos_noise() const { return _pos_noise; }

3.4.6 AP_VisualOdom::get_yaw_noise

获取航向测量噪声。

    // return yaw measurement noise in radfloat get_yaw_noise() const { return _yaw_noise; }

3.4.7 AP_VisualOdom::get_delay_ms

获取传感器的延迟时间(毫秒)。

    // return the sensor delay in milliseconds (see _DELAY_MS parameter)uint16_t get_delay_ms() const { return MAX(0, _delay_ms); }

3.4.8 AP_VisualOdom::get_quality_min

后端驱动获取配置最小质量阈值。

    // return quality thresholdint8_t get_quality_min() const { return _quality_min; }

4. 总结

AP_VisualOdom视觉定位传感器应用遵循《ArduPilot之开源代码Sensor Drivers设计》。

  • ront-end / back-end分层
  • 消息机制驱动
  • 评估视觉位置、姿态、速度

后续我们继续研讨三个后端程序:

  • AP_VisualOdom_Backend
  • AP_VisualOdom_IntelT265
  • AP_VisualOdom_MAV

5. 参考资料

【1】ArduPilot开源飞控系统之简单介绍
【2】ArduPilot之开源代码Task介绍
【3】ArduPilot飞控启动&运行过程简介
【4】ArduPilot之开源代码Library&Sketches设计
【5】ArduPilot之开源代码Sensor Drivers设计

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

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

相关文章

买的Google账号登录,修改辅助邮箱收不到验证码?可能是个简单的错误

这篇文章分享一个案例&#xff0c;购买了谷歌账号以后如何修改辅助邮箱&#xff0c;修改辅助邮箱的一些要点&#xff0c;以及常见的一个错误。 一、案例回放 这个朋友昨天在我的一个视频下面留言说买了谷歌账号以后&#xff0c;想修改辅助邮箱地址&#xff0c;但是输入了辅助…

中英双语介绍加拿大多伦多(Toronto)

中文版 多伦多概述 多伦多&#xff08;Toronto&#xff09;是加拿大最大的城市&#xff0c;也是北美地区重要的经济、文化和金融中心。以下是对多伦多的详细介绍&#xff0c;包括其经济地位、金融中心、人口、地理位置、高等教育、移民政策、著名景点和居住的名人等方面的信息…

【Git】本地版本控制

Git 是一个分布式版本控制系统&#xff0c;用于跟踪文件的更改&#xff0c;通常用于源代码管理。它的设计目的是为了协同工作和版本管理&#xff0c;让多个开发人员能够高效地合作开发和维护代码。 Git环境配置 在官网可以找到对应下载&#xff1a;Git - Downloads (git-scm.c…

【WebRTC实现点对点视频通话】

介绍 WebRTC (Web Real-Time Communications) 是一个实时通讯技术&#xff0c;也是实时音视频技术的标准和框架。简单来说WebRTC是一个集大成的实时音视频技术集&#xff0c;包含了各种客户端api、音视频编/解码lib、流媒体传输协议、回声消除、安全传输等。对于开发者来说可以…

avcodec_send_packet函数阻塞

用ffmpeg4.1.4开发一个播放器&#xff0c;解码过程如下&#xff0c;在每个函数前设置标志&#xff0c;测试发现程序阻塞在avcodec_send_packet函数。 while(true){av_read_frameavcodec_send_packetavcodec_receive_frameav_packet_unref } 解释如下&#xff1a; avcodec_se…

嵌入式Linux:如何学好嵌入式?

目录 方法步骤 1、 基础知识 2、 学习linux 3、 学习嵌入式linux 4、深入学习 嵌入式书籍推荐 Linux基础 Linux内核 研发方向 硬件基础 方法步骤 1、 基础知识 目的:能看懂硬件工作原理,但重点在嵌入式软件,特别是操作系统级软件。 科目:数字电路、计算机组成原理…

Unity3D游戏 RPG

丛林探险游戏 人物进行探险游戏 拥有登录&#xff0c;首页&#xff0c;3D物体旋转浏览的功能&#xff0c;还能进行种植树等功能

【异常错误】‘NoneType‘ object has no attribute ‘GetSubstructMatches‘

出现的错误信息&#xff1a; AttributeError: Caught AttributeError in DataLoader worker process 0. Original Traceback (most recent call last): File "/home/mapengsen/anaconda3/envs//lib/python3.8/site-packages/torch/utils/data/_utils/worker.py", l…

【matlab 路径规划】基于改进遗传粒子群算法的药店配送路径优化

一 背景介绍 本文分享的是一个基于订单合并的订单分配和路径规划联合优化&#xff0c;主要背景是骑手根据客户需求&#xff0c;从药店取药之后进行配送&#xff0c;配送的过程中考虑路径的长度、客户的服务时间窗、车辆的固定成本等要素&#xff0c;经过建模和优化得到最优的配…

C# WinForm —— 38 SplitContainer介绍

1. 简介 将页面拆分成两个大小可以调整的区域&#xff0c;中间有一个拆分条&#xff0c;可以拖动拆分条来调整左右区域的大小 2. 属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到BoderStyle边框样式&#xff1a;None、FixedSingle、Fixed3DAutoScroll当控件…

力扣 225 用队列实现栈 记录

题目描述 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。 int pop() 移除并返回栈顶元素…

C++ 引用做函数返回值

作用&#xff1a;引用是可以作为函数的返回值存在的 注意&#xff1a;不要返回局部变量引用 用法&#xff1a;函数调用作为左值 示例&#xff1a; 运行结果&#xff1a;

程序员熬夜看欧洲杯被“冻住”,呼吸困难……

2024欧洲杯接近尾声&#xff0c;更是激发球迷兴趣。由于时差关系&#xff0c;很多球迷熬夜看球&#xff0c;啤酒、宵夜成了标配。然而&#xff0c;在这份欢乐背后&#xff0c;也隐藏着健康风险。 日前&#xff0c;浙江杭州29岁的程序员单先生熬夜与朋友看完球赛后开车回家&…

零基础STM32单片机编程入门(九)IIC总线详解及EEPROM实战含源码视频

文章目录 一.概要二.IIC总线基本概念1.总体特征2.通讯流程 三.EEPROM介绍1.M24C08基本介绍2.向M24C08写一个字节时序图3.从M24C08读一个字节时序图 四.GPIO模拟IIC驱动M24C08读写五.CubeMX工程源代码下载六.讲解视频链接地址七.小结 一.概要 IIC(Inter&#xff0d;Integrated …

黑马|最新AI+若依 |初识项目

本章主要内容是&#xff1a; 1.快速搭建了若依前后端项目在本地 2.实现了单表的增删改查快速生成 文章目录 介绍1.若依介绍2.若依的不同版本3.项目运行环境 初始化前后端项目1.下载若依项目2.初始化后端a.把表导入到数据库中b.更改application.yml文件 3.初始化前端a.安装依赖…

基于LoFTR_TRT项目实现LoFTR模型的trt推理与onnx推理,3060显卡下320图像30ms一组图

本博文主要记录了使用LoFTR_TRT项目将LoFTR模型导出为onnx模型&#xff0c;然后将onnx模型转化为trt模型。并分析了LoFTR_TRT与LoFTR的基本代码差异&#xff0c;但从最后图片效果来看是与官网demo基本一致的&#xff0c;具体可以查看上一篇博客记录。最后记录了onnx模型的使用【…

WebAssembly场景及未来

引言 从前面的文章中&#xff0c;我们已经了解了 WebAssembly&#xff08;WASM&#xff09; 的基本知识&#xff0c;演进历程&#xff0c;以及简单的使用方法。通过全面了解了WebAssembly的设计初衷和优势&#xff0c;我们接下来要知道在什么样的场景中我们会使用 WASM 呢&…

在门店里造绿色氧吧!康养行业也这么卷了?

拼啥不如拼健康&#xff0c;现在的人算是活明白了&#xff0c;不但中老年人这样想&#xff0c;年轻人也这样干。你可能不知道&#xff0c;现在众多健康养生门店&#xff0c;逐渐成了年轻人“组团养生”的好去处&#xff0c;也是他们吃喝玩乐之外的新兴消费趋势。 而在看得见的…

原理图设计工作平台:capture和capture CIS的区别在于有没有CIS模块

1环境:design entry CIS 2.参数设置命令options——preference&#xff08;7个选项卡colors/print&#xff0c;grid display&#xff0c;miscellaneous&#xff0c;pan and zoom&#xff0c;select&#xff0c;text editor和board simulation&#xff09; 1)颜色设置colors/p…

应急响应--网站(web)入侵篡改指南

免责声明:本文... 目录 被入侵常见现象: 首要任务&#xff1a; 分析思路&#xff1a; 演示案例: IIS&.NET-注入-基于时间配合日志分析 Apache&PHP-漏洞-基于漏洞配合日志分析 Tomcat&JSP-弱口令-基于后门配合日志分析 (推荐) Webshell 查杀-常规后门&…