【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法

news2025/6/10 13:01:18

使用 ROS1-Noetic 和 mavros v1.20.1,

携带经纬度海拔的话题主要有三个:

  • /mavros/global_position/raw/fix
  • /mavros/gpsstatus/gps1/raw
  • /mavros/global_position/global

查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一个 mavlink 消息,他们都在 GPS_RAW_INT 的订阅回调中发布,但是对应不同的源文件,对信息的处理方法略有不同。

/mavros/global_position/raw/fix 的发布在源文件 mavros/mavros/src/plugins/global_position.cpp

raw_fix_pub = gp_nh.advertise<sensor_msgs::NavSatFix>("raw/fix", 10);

/mavros/gpsstatus/gps1/raw 的发布在插件中 mavros/mavros_extras/src/plugins/gps_status.cpp

gps1_raw_pub = gpsstatus_nh.advertise<mavros_msgs::GPSRAW>("gps1/raw", 10);

搜索两个发布者被调用的位置。

raw_fix_pub 主要用来将原始 GPS 数据(未经 EKF 融合)转发到 /mavros/global_position/raw/fix,并对海拔进行了转换,符合 WGS-84。

// mavros/mavros/src/plugins/global_position.cpp

void handle_gps_raw_int(const mavlink::mavlink_message_t *msg, mavlink::common::msg::GPS_RAW_INT &raw_gps)
{
	auto fix = boost::make_shared<sensor_msgs::NavSatFix>();

	fix->header = m_uas->synchronized_header(child_frame_id, raw_gps.time_usec);

	fix->status.service = sensor_msgs::NavSatStatus::SERVICE_GPS;
	if (raw_gps.fix_type > 2)
		fix->status.status = sensor_msgs::NavSatStatus::STATUS_FIX;
	else {
		ROS_WARN_THROTTLE_NAMED(30, "global_position", "GP: No GPS fix");
		fix->status.status = sensor_msgs::NavSatStatus::STATUS_NO_FIX;
	}

	fill_lla(raw_gps, fix);

	float eph = (raw_gps.eph != UINT16_MAX) ? raw_gps.eph / 1E2F : NAN;
	float epv = (raw_gps.epv != UINT16_MAX) ? raw_gps.epv / 1E2F : NAN;

	ftf::EigenMapCovariance3d gps_cov(fix->position_covariance.data());

	// With mavlink v2.0 use accuracies reported by sensor
	if (msg->magic == MAVLINK_STX &&
			raw_gps.h_acc > 0 && raw_gps.v_acc > 0) {
		gps_cov.diagonal() << std::pow(raw_gps.h_acc / 1E3, 2), std::pow(raw_gps.h_acc / 1E3, 2), std::pow(raw_gps.v_acc / 1E3, 2);
		fix->position_covariance_type = sensor_msgs::NavSatFix::COVARIANCE_TYPE_DIAGONAL_KNOWN;
	}
	// With mavlink v1.0 approximate accuracies by DOP
	else if (!std::isnan(eph) && !std::isnan(epv)) {
		gps_cov.diagonal() << std::pow(eph * gps_uere, 2), std::pow(eph * gps_uere, 2), std::pow(epv * gps_uere, 2);
		fix->position_covariance_type = sensor_msgs::NavSatFix::COVARIANCE_TYPE_APPROXIMATED;
	}
	else {
		fill_unknown_cov(fix);
	}

	// store & publish
	m_uas->update_gps_fix_epts(fix, eph, epv, raw_gps.fix_type, raw_gps.satellites_visible);
	raw_fix_pub.publish(fix);

	if (raw_gps.vel != UINT16_MAX &&
				raw_gps.cog != UINT16_MAX) {
		double speed = raw_gps.vel / 1E2;				// m/s
		double course = angles::from_degrees(raw_gps.cog / 1E2);	// rad

		auto vel = boost::make_shared<geometry_msgs::TwistStamped>();

		vel->header.stamp = fix->header.stamp;
		vel->header.frame_id = frame_id;

		// From nmea_navsat_driver
		vel->twist.linear.x = speed * std::sin(course);
		vel->twist.linear.y = speed * std::cos(course);

		raw_vel_pub.publish(vel);
	}

	// publish satellite count
	auto sat_cnt = boost::make_shared<std_msgs::UInt32>();
	sat_cnt->data = raw_gps.satellites_visible;
	raw_sat_pub.publish(sat_cnt);
}

// 涉及子函数
void UAS::update_gps_fix_epts(sensor_msgs::NavSatFix::Ptr &fix,
	float eph, float epv,
	int fix_type, int satellites_visible)
{
	lock_guard lock(mutex);

	gps_fix = fix;
	gps_eph = eph;
	gps_epv = epv;
	gps_fix_type = fix_type;
	gps_satellites_visible = satellites_visible;
}

mavlink 消息定义 https://mavlink.io/zh/messages/common.html#GPS_RAW_INT。

注意这个原始消息携带的信息很多,被拆分转发到了多个 ROS 话题中。

time_usecuint64_tusTimestamp (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.
fix_typeuint8_tGPS_FIX_TYPEGPS fix type.
latint32_tdegE7Latitude (WGS84, EGM96 ellipsoid)
lonint32_tdegE7Longitude (WGS84, EGM96 ellipsoid)
altint32_t毫米Altitude (MSL). Positive for up. Note that virtually all GPS modules provide the MSL altitude in addition to the WGS84 altitude.
ephuint16_t1E-2invalid:UINT16_MAXGPS HDOP horizontal dilution of position (unitless * 100). If unknown, set to: UINT16_MAX
epvuint16_t1E-2invalid:UINT16_MAXGPS VDOP vertical dilution of position (unitless * 100). If unknown, set to: UINT16_MAX
veluint16_t厘米/秒invalid:UINT16_MAXGPS ground speed. If unknown, set to: UINT16_MAX
coguint16_tcdeginvalid:UINT16_MAXCourse over ground (NOT heading, but direction of movement) in degrees * 100, 0.0…359.99 degrees. If unknown, set to: UINT16_MAX
satellites_visibleuint8_tinvalid:UINT8_MAX可见卫星数量。 If unknown, set to UINT8_MAX
alt_ellipsoid ++int32_t毫米Altitude (above WGS84, EGM96 ellipsoid). Positive for up.
h_acc ++uint32_t毫米Position uncertainty.
v_acc ++uint32_t毫米Altitude uncertainty.
vel_acc ++uint32_t毫米/秒Speed uncertainty.
hdg_acc ++uint32_tdegE5Heading / track uncertainty
yaw ++uint16_tcdeginvalid:0Yaw in earth frame from north. Use 0 if this GPS does not provide yaw. Use UINT16_MAX if this GPS is configured to provide yaw and is currently unable to provide it. Use 36000 for north.

/mavros/global_position/raw/fix,消息类型是 sensor_msgs/NavSatFix,定义如下

rosmsg show sensor\_msgs/NavSatFix

uint8 COVARIANCE_TYPE_UNKNOWN=0
uint8 COVARIANCE_TYPE_APPROXIMATED=1
uint8 COVARIANCE_TYPE_DIAGONAL_KNOWN=2
uint8 COVARIANCE_TYPE_KNOWN=3
std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
sensor_msgs/NavSatStatus status
  int8 STATUS_NO_FIX=-1
  int8 STATUS_FIX=0
  int8 STATUS_SBAS_FIX=1
  int8 STATUS_GBAS_FIX=2
  uint16 SERVICE_GPS=1
  uint16 SERVICE_GLONASS=2
  uint16 SERVICE_COMPASS=4
  uint16 SERVICE_GALILEO=8
  int8 status
  uint16 service
float64 latitude
float64 longitude
float64 altitude
float64[9] position_covariance
uint8 position_covariance_type

其中 float64 latitudefloat64 longitudefloat64 altitude 三个字段的赋值过程如下

fill_lla(raw_gps, fix);

template<typename MsgT>
inline void fill_lla(MsgT &msg, sensor_msgs::NavSatFix::Ptr fix)
{
	fix->latitude = msg.lat / 1E7;		// deg
	fix->longitude = msg.lon / 1E7;		// deg
	fix->altitude = msg.alt / 1E3 + m_uas->geoid_to_ellipsoid_height(fix);	// in meters
}

/**
 * @brief Conversion from height above geoid (AMSL)
 * to height above ellipsoid (WGS-84)
 */
template <class T>
inline double geoid_to_ellipsoid_height(T lla)
{
	if (egm96_5)
		return GeographicLib::Geoid::GEOIDTOELLIPSOID * (*egm96_5)(lla->latitude, lla->longitude);
	else
		return 0.0;
}

这里看到经纬度由原始的整型转换到了常用的 degree,且海拔由 mavros 进行了一次转换

  • AMSL(Above Mean Sea Level):即 “海平面高度”,是 GPS 等设备通常输出的高度。
  • Ellipsoid Height:是相对于地球椭球体(如 WGS-84 椭球)的高度,是 GNSS 内部用来计算的位置。
  • 它们之间的差值由地球重力模型(如EGM96)提供,称为大地水准面起伏(geoid undulation)

总之输出的 ROS 话题符合 WGS-84。

此外,原始 mavlink 消息包含了两个非常重要的信息,当前GPS锁定状态(QGC 中的 GPS Lock)和接收的卫星数(QGC 的 GPS Count)。他们对室外实物飞行有着重要意义,作为传感器与飞控融合算法状态是否良好的判断依据。

请添加图片描述

当前接收的卫星数量被转发到了另外的话题 /mavros/global_position/raw/satellites

sat_cnt->data = raw_gps.satellites_visible;
raw_sat_pub.publish(sat_cnt);

// 发布者定义如下
// raw_sat_pub = gp_nh.advertise<std_msgs::UInt32>("raw/satellites", 10);

当前GPS锁定状态,发布到了 /mavros/gpsstatus/gps1/raw。这个话题侧重对 GPS_RAW_INT 类型 mavlink 消息进行直接转发,不做任何处理。因此,是 /mavros/global_position/raw/satellites 的超集,和 /mavros/global_position/raw/fix 相比,同样是转发原始的未 ekf 融合的 GPS 数据,/mavros/gpsstatus/gps1/raw 没有对高度进行转发。

/* -*- callbacks -*- */
/**
 * @brief Publish <a href="https://mavlink.io/en/messages/common.html#GPS_RAW_INT">mavlink GPS_RAW_INT message</a> into the gps1/raw topic.
 */
void handle_gps_raw_int(const mavlink::mavlink_message_t *msg, mavlink::common::msg::GPS_RAW_INT &mav_msg) {
	auto ros_msg = boost::make_shared<mavros_msgs::GPSRAW>();
	ros_msg->header            = m_uas->synchronized_header("/wgs84", mav_msg.time_usec);
	ros_msg->fix_type          = mav_msg.fix_type;
	ros_msg->lat               = mav_msg.lat;
	ros_msg->lon               = mav_msg.lon;
	ros_msg->alt               = mav_msg.alt;
	ros_msg->eph               = mav_msg.eph;
	ros_msg->epv               = mav_msg.epv;
	ros_msg->vel               = mav_msg.vel;
	ros_msg->cog               = mav_msg.cog;
	ros_msg->satellites_visible = mav_msg.satellites_visible;
	ros_msg->alt_ellipsoid     = mav_msg.alt_ellipsoid;
	ros_msg->h_acc             = mav_msg.h_acc;
	ros_msg->v_acc             = mav_msg.v_acc;
	ros_msg->vel_acc           = mav_msg.vel_acc;
	ros_msg->hdg_acc           = mav_msg.hdg_acc;
	ros_msg->dgps_numch        = UINT8_MAX;	// information not available in GPS_RAW_INT mavlink message
	ros_msg->dgps_age          = UINT32_MAX;// information not available in GPS_RAW_INT mavlink message
	ros_msg->yaw               = mav_msg.yaw;

	gps1_raw_pub.publish(ros_msg);
}

/mavros/global_position/global 的发布在源文件 mavros/mavros/src/plugins/global_position.cpp

// mavros/mavros/src/plugins/global_position.cpp

/** @todo Handler for GLOBAL_POSITION_INT_COV */

void handle_global_position_int(const mavlink::mavlink_message_t *msg, mavlink::common::msg::GLOBAL_POSITION_INT &gpos)
{
	auto odom = boost::make_shared<nav_msgs::Odometry>();
	auto fix = boost::make_shared<sensor_msgs::NavSatFix>();
	auto relative_alt = boost::make_shared<std_msgs::Float64>();
	auto compass_heading = boost::make_shared<std_msgs::Float64>();

	auto header = m_uas->synchronized_header(child_frame_id, gpos.time_boot_ms);

	// Global position fix
	fix->header = header;

	fill_lla(gpos, fix);

	// fill GPS status fields using GPS_RAW data
	auto raw_fix = m_uas->get_gps_fix();
	if (raw_fix) {
		fix->status.service = raw_fix->status.service;
		fix->status.status = raw_fix->status.status;
		fix->position_covariance = raw_fix->position_covariance;
		fix->position_covariance_type = raw_fix->position_covariance_type;
	}
	else {
		// no GPS_RAW_INT -> fix status unknown
		fix->status.service = sensor_msgs::NavSatStatus::SERVICE_GPS;
		fix->status.status = sensor_msgs::NavSatStatus::STATUS_NO_FIX;

		// we don't know covariance
		fill_unknown_cov(fix);
	}

	relative_alt->data = gpos.relative_alt / 1E3;	// in meters
	compass_heading->data = (gpos.hdg != UINT16_MAX) ? gpos.hdg / 1E2 : NAN;	// in degrees

	/**
	 * @brief Global position odometry:
	 *
	 * X: spherical coordinate X-axis (meters)
	 * Y: spherical coordinate Y-axis (meters)
	 * Z: spherical coordinate Z-axis (meters)
	 * VX: latitude vel (m/s)
	 * VY: longitude vel (m/s)
	 * VZ: altitude vel (m/s)
	 * Angular rates: unknown
	 * Pose covariance: computed, with fixed diagonal
	 * Velocity covariance: unknown
	 */
	odom->header.stamp = header.stamp;
	odom->header.frame_id = frame_id;
	odom->child_frame_id = child_frame_id;

	// Linear velocity
	tf::vectorEigenToMsg(Eigen::Vector3d(gpos.vy, gpos.vx, gpos.vz) / 1E2,
				odom->twist.twist.linear);

	// Velocity covariance unknown
	ftf::EigenMapCovariance6d vel_cov_out(odom->twist.covariance.data());
	vel_cov_out.fill(0.0);
	vel_cov_out(0) = -1.0;

	// Current fix in ECEF
	Eigen::Vector3d map_point;

	try {
		/**
		 * @brief Conversion from geodetic coordinates (LLA) to ECEF (Earth-Centered, Earth-Fixed)
		 *
		 * Note: "ecef_origin" is the origin of "map" frame, in ECEF, and the local coordinates are
		 * in spherical coordinates, with the orientation in ENU (just like what is applied
		 * on Gazebo)
		 */
		GeographicLib::Geocentric map(GeographicLib::Constants::WGS84_a(),
					GeographicLib::Constants::WGS84_f());

		/**
		 * @brief Checks if the "map" origin is set.
		 * - If not, and the home position is also not received, it sets the current fix as the origin;
		 * - If the home position is received, it sets the "map" origin;
		 * - If the "map" origin is set, then it applies the rotations to the offset between the origin
		 * and the current local geocentric coordinates.
		 */
		// Current fix to ECEF
		map.Forward(fix->latitude, fix->longitude, fix->altitude,
					map_point.x(), map_point.y(), map_point.z());

		// Set the current fix as the "map" origin if it's not set
		if (!is_map_init && fix->status.status >= sensor_msgs::NavSatStatus::STATUS_FIX) {
			map_origin.x() = fix->latitude;
			map_origin.y() = fix->longitude;
			map_origin.z() = fix->altitude;

			ecef_origin = map_point; // Local position is zero
			is_map_init = true;
		}
	}
	catch (const std::exception& e) {
		ROS_INFO_STREAM("GP: Caught exception: " << e.what() << std::endl);
	}

	// Compute the local coordinates in ECEF
	local_ecef = map_point - ecef_origin;
	// Compute the local coordinates in ENU
	tf::pointEigenToMsg(ftf::transform_frame_ecef_enu(local_ecef, map_origin), odom->pose.pose.position);

	/**
	 * @brief By default, we are using the relative altitude instead of the geocentric
	 * altitude, which is relative to the WGS-84 ellipsoid
	 */
	if (use_relative_alt)
		odom->pose.pose.position.z = relative_alt->data;

	odom->pose.pose.orientation = m_uas->get_attitude_orientation_enu();

	// Use ENU covariance to build XYZRPY covariance
	ftf::EigenMapConstCovariance3d gps_cov(fix->position_covariance.data());
	ftf::EigenMapCovariance6d pos_cov_out(odom->pose.covariance.data());
	pos_cov_out.setZero();
	pos_cov_out.block<3, 3>(0, 0) = gps_cov;
	pos_cov_out.block<3, 3>(3, 3).diagonal() <<
						rot_cov,
							rot_cov,
								rot_cov;

	// publish
	gp_fix_pub.publish(fix);
	gp_odom_pub.publish(odom);
	gp_rel_alt_pub.publish(relative_alt);
	gp_hdg_pub.publish(compass_heading);

	// TF
	if (tf_send) {
		geometry_msgs::TransformStamped transform;

		transform.header.stamp = odom->header.stamp;
		transform.header.frame_id = tf_frame_id;
		transform.child_frame_id = tf_child_frame_id;

		// setRotation()
		transform.transform.rotation = odom->pose.pose.orientation;

		// setOrigin()
		transform.transform.translation.x = odom->pose.pose.position.x;
		transform.transform.translation.y = odom->pose.pose.position.y;
		transform.transform.translation.z = odom->pose.pose.position.z;

		m_uas->tf2_broadcaster.sendTransform(transform);
	}
}

同样是通过 fill_lla 赋值,发布过程和 /mavros/global_position/raw/fix 类似,对海拔做了转换。

fill_lla(gpos, fix);

template<typename MsgT>
inline void fill_lla(MsgT &msg, sensor_msgs::NavSatFix::Ptr fix)
{
	fix->latitude = msg.lat / 1E7;		// deg
	fix->longitude = msg.lon / 1E7;		// deg
	fix->altitude = msg.alt / 1E3 + m_uas->geoid_to_ellipsoid_height(fix);	// in meters
}

总结一下:

  • 卫星数和GPS锁定状态可以通过 /mavros/gpsstatus/gps1/raw获取;
  • 未经PX4融合估计的原始的经纬度海拔通过 /mavros/global_position/raw/fix (WGS-84)获取;
  • EKF 融合后的经纬度海拔通过 /mavros/global_position/global
    获取(这个话题的频率实验会比仿真低很多。极端情况,如室内无卫星/GPS传感器异常或者数据跳变导致飞控拒绝融合时可能不会发布此消息)。

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

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

相关文章

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时&#xff0c;遇到编译buildroot失败&#xff0c;提示如下&#xff1a; 提示缺失expect&#xff0c;但是实测相关工具是在的&#xff0c;如下显示&#xff1a; 然后查找借助各个ai工具&#xff0c;重新安装相关的工具&#xff0c;依然无解。 解决&am…

【Java多线程从青铜到王者】单例设计模式(八)

wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本&#xff0c;sleep也是可以指定时间的&#xff0c;也就是说时间一到就会解除阻塞&#xff0c;继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒)&#xff0c;wait能被notify提前唤醒&#xf…

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架

1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…

VSCode 使用CMake 构建 Qt 5 窗口程序

首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli

Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目

应用场景&#xff1a; 1、常规某个机器被钓鱼后门攻击后&#xff0c;我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后&#xff0c;我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…

Qwen系列之Qwen3解读:最强开源模型的细节拆解

文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上

一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema&#xff0c;不需要复杂的查询&#xff0c;只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 &#xff1a;在几秒钟…

表单设计器拖拽对象时添加属性

背景&#xff1a;因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?

在现代前端开发中&#xff0c;Utility-First (功能优先) CSS 框架已经成为主流。其中&#xff0c;Tailwind CSS 无疑是市场的领导者和标杆。然而&#xff0c;一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…

Qt的学习(二)

1. 创建Hello Word 两种方式&#xff0c;实现helloworld&#xff1a; 1.通过图形化的方式&#xff0c;在界面上创建出一个控件&#xff0c;显示helloworld 2.通过纯代码的方式&#xff0c;通过编写代码&#xff0c;在界面上创建控件&#xff0c; 显示hello world&#xff1b; …

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…

鸿蒙Navigation路由导航-基本使用介绍

1. Navigation介绍 Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏、内容区和工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&#xff08;Nav…

CMS内容管理系统的设计与实现:多站点模式的实现

在一套内容管理系统中&#xff0c;其实有很多站点&#xff0c;比如企业门户网站&#xff0c;产品手册&#xff0c;知识帮助手册等&#xff0c;因此会需要多个站点&#xff0c;甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…

ZYNQ学习记录FPGA(二)Verilog语言

一、Verilog简介 1.1 HDL&#xff08;Hardware Description language&#xff09; 在解释HDL之前&#xff0c;先来了解一下数字系统设计的流程&#xff1a;逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端&#xff0c;在这个过程中就需要用到HDL&#xff0c;正文…

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一&#xff0c;是基于哈希表的Map接口非同步实现。它允许使用null键和null值&#xff08;但只能有一个null键&#xff09;&#xff0c;并且不保证映射顺序的恒久不变。与Hashtable相比&#xff0c;Hash…

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space

问题&#xff1a;IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案&#xff1a;将编译的堆内存增加一点 位置&#xff1a;设置setting-》构建菜单build-》编译器Complier

【阅读笔记】MemOS: 大语言模型内存增强生成操作系统

核心速览 研究背景 ​​研究问题​​&#xff1a;这篇文章要解决的问题是当前大型语言模型&#xff08;LLMs&#xff09;在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色&#xff0c;但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成&#xff08;RA…

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录

#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…

五、jmeter脚本参数化

目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …

python基础语法Ⅰ

python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器&#xff0c;来进行一些算术…