通过Socket通信实现局域网下Amov无人机连接与数据传输

1.局域网下的通信

1.1 局域网

厂家提供的方式是通过Homer图数传工具(硬件)构建的amov局域网实现通信连接.

好处是通信距离足够长,支持150m;坏处是"局部",无法访问互联网.

[IMAGE:homer连接]

根据这个原理,我尝试了通过个人局域网(即热点),建立通信连接.

[ 因为无人机本身带有机载电脑,而主机正常也就能连接热点和wifi ]

1.2个人热点[互联网下的局域网]

优点:便捷,且可访问互联网:

个人热点通常使用的确实是 WLAN(无线局域网)技术,它利用了无线技术(如Wi-Fi)来创建一个局域网络;

关键在于个人热点设备本身已经通过移动运营商的网络(如4G、5G)连接了互联网。

个人热点在此过程中扮演了中介的角色:

它将其他设备发出的请求转发给移动运营商的网络,并将响应返回给这些设备

[这意味着对于任何的报错输出你都可以去线上寻找答案(尤其是大模型AI)];

缺点是通信距离短,无人机飞远了数据传输有大延迟 ;

2.远程控制主机

2.1 GUi图形化界面--Nomachine

基于X11协议的远程桌面工具;

2.2 SSH 连接--命令行操控

连接:ssh建立连接需要账号和密码IP

[输入密码];

连接成功(如红框所示):

3.实操 --个人热点下实现ros无人机与PC传输gps经纬度

3.1实现局域网下的通信

开启手机热点,连接设备至少2个(个人PC和amov无人机机载电脑主机)

点击查看其配置(即IP):

知道ip,即可ping 查看是否能够通信;

比如我发现amov的IP地址为192.168.63.a;

1) ping尝试

ping 192.168.163.a

应有输出[代表ping通]:

Reply from 127.0.0.1: bytes=32 time<1ms TTL=128        
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

3.2连接无人机机载电脑(通过ssh)

[2.2 SSH 连接--命令行操控]

命令行下输入:

ssh amov@ 192.168.x.a 
#amov 为账户名 后面为其ip地址

输入密码;

登录成功;

3.3 启动节点[同时顺便连接qgc]

连接qgc流程:进入对应路径-更改脚本-启动脚本;

cd home/amov/p600_experiment/src/p600_experiment/launch_basic

vim p600_gps_onboard.launch

3.3.1将上图红框的ip改为要使用QGC的个人PC主机IP[如此才能实现与qgc的连接]

3.3.2随后执行该.launch脚本以启动节点:

roslaunch p600_gps_onboard.launch

脚本如下:

<!-- 本launch为使用px4_sender进行机载控制时的机载端启动脚本 -->
<launch>
	<!-- 启动MAVROS -->
	<!-- 不同机载电脑,注意修改fcu_url至正确的端口号及波特率 -->
	<node pkg="mavros" type="mavros_node" name="mavros" output="screen">
		<param name="fcu_url" value="/dev/ttyTHS0:921600" />
		<!--param name="gcs_url" value="udp://@192.168.31.46" / -->
		<param name="gcs_url" value="" />
		<param name="target_system_id" value="1" />
		<param name="target_component_id" value="1" />
		<rosparam command="load" file="$(find p600_experiment)/config/mavros_config/px4_pluginlists_gps.yaml" />
		<rosparam command="load" file="$(find p600_experiment)/config/mavros_config/px4_config_gps.yaml" />
	</node>

	<!-- 启动Prometheus代码 -->
	<!-- run the px4_pos_estimator.cpp -->
	<arg name="input_source" default="9"/>
	<arg name="rate_hz" default="30"/>
	<node pkg="prometheus_control" type="px4_pos_estimator" name="px4_pos_estimator" output="screen">
		<!-- 定位数据输入源 0 for vicon, 1 for 激光SLAM, 2 for gazebo ground truth, 3 for T265 -->
		<param name="input_source" value="$(arg input_source)" />
		<param name="rate_hz" value="$(arg rate_hz)" />
	</node>
	
	<!-- run the px4_sender.cpp -->
	<node pkg="prometheus_control" type="px4_sender" name="px4_sender" output="screen">
		<rosparam command="load" file="$(find p600_experiment)/config/prometheus_control_config/px4_sender_outdoor.yaml"/>
	</node>

	<!-- run the ground_station.cpp -->
	<node pkg="prometheus_station" type="ground_station" name="ground_station" output="screen" launch-prefix="gnome-terminal --tab --">	
	</node>

	<!-- run the ground_station_msg.cpp -->
	<node pkg="prometheus_station" type="ground_station_msg" name="ground_station_msg" output="screen" launch-prefix="gnome-terminal --tab --">	
	</node>
</launch>

3.3.3预期输出:

该cmd窗口顶端应该如下:

3.3.4 rostopic list 查看已启动节点:

白框即为涉及到gps的节点:

3.3.5 qgc成功连接:

(红框处应显示为连接成功)

3.3.6关于节点:

在ROS(Robot Operating System)中,节点(Nodes)是实现机器人功能的基本组成单元。

每个节点通常执行一个特定的任务,并且可以通过ROS的通信机制与其他节点进行数据交换。

以下是关于ROS节点的详细介绍以及一个简单的实例:

节点的基本概念:

  1. 节点定义

    • ROS节点是一个执行特定任务的进程,可以理解为ROS应用程序中的一个模块或者组件。
    • 每个节点都是一个独立的进程,可以通过ROS的通信机制与其他节点进行数据交换。
  2. 节点之间的通信

    • ROS节点通过话题(Topics)、服务(Services)、参数服务器(Parameter Server)以及动态重配置(Dynamic Reconfigure)进行通信。
    • 话题:是一种发布者-订阅者模型,节点可以发布(publish)消息到话题或者订阅(subscribe)话题接收消息。
    • 服务:允许节点请求某种特定的计算或操作,其他节点可以提供服务以响应这些请求。
    • 参数服务器:用于存储和获取ROS参数,节点可以动态地获取和修改这些参数。
    • 动态重配置:允许节点在运行时调整其参数,而不需要重启节点。
  3. 节点的编写

    • ROS节点可以使用多种编程语言编写,包括C++和Python。
    • 通常使用ROS提供的官方库(如roscpp和rospy)来编写节点,这些库提供了与ROS通信机制的高级接口。

示例:移动机器人中的ROS节点

假设有一个简单的移动机器人系统,包括以下几个ROS节点:

  1. 传感器数据获取节点

    • 功能:从机器人的传感器(例如激光雷达、相机)获取数据。
    • 通信方式:通过发布者(Publisher)发布激光数据到名为/scan的话题。
    • 实现:可以使用C++编写,订阅激光雷达数据并发布到/scan话题。
  2. 路径规划节点

    • 功能:根据机器人的当前位置和目标位置计算最优路径。
    • 通信方式:订阅机器人当前位置和目标位置的话题,并将路径信息发布到名为/path的话题。
    • 实现:可以使用Python编写,订阅/initial_pose/goal_pose话题,使用路径规划算法(如A*或Dijkstra算法)计算路径,并发布到/path话题。
  3. 运动控制节点

    • 功能:接收路径信息,并控制机器人实现运动。
    • 通信方式:订阅/path话题,控制机器人的底盘或运动执行器。
    • 实现:可以使用C++编写,订阅/path话题,调用运动控制库(如ROS MoveBase等)实现机器人的运动控制。
  4. 用户界面节点

    • 功能:提供交互界面,允许用户设定目标位置或查看机器人状态。
    • 通信方式:通过ROS服务接收用户设定的目标位置,并可以通过话题发布机器人的状态信息。
    • 实现:可以使用Python编写,提供简单的图形用户界面(GUI),通过ROS服务与其他节点进行通信。

3.3.7节点实例(p600_gps_onboard.launch):

<!-- 本launch为使用px4_sender进行机载控制时的机载端启动脚本 -->
<launch>
	<!-- 启动MAVROS -->
	<!-- 不同机载电脑,注意修改fcu_url至正确的端口号及波特率 -->
	<node pkg="mavros" type="mavros_node" name="mavros" output="screen">
		<param name="fcu_url" value="/dev/ttyTHS0:921600" />
		<!--param name="gcs_url" value="udp://@192.168.31.46" / -->
		<param name="gcs_url" value="" />
		<param name="target_system_id" value="1" />
		<param name="target_component_id" value="1" />
		<rosparam command="load" file="$(find p600_experiment)/config/mavros_config/px4_pluginlists_gps.yaml" />
		<rosparam command="load" file="$(find p600_experiment)/config/mavros_config/px4_config_gps.yaml" />
	</node>

	<!-- 启动Prometheus代码 -->
	<!-- run the px4_pos_estimator.cpp -->
	<arg name="input_source" default="9"/>
	<arg name="rate_hz" default="30"/>
	<node pkg="prometheus_control" type="px4_pos_estimator" name="px4_pos_estimator" output="screen">
		<!-- 定位数据输入源 0 for vicon, 1 for 激光SLAM, 2 for gazebo ground truth, 3 for T265 -->
		<param name="input_source" value="$(arg input_source)" />
		<param name="rate_hz" value="$(arg rate_hz)" />
	</node>
	
	<!-- run the px4_sender.cpp -->
	<node pkg="prometheus_control" type="px4_sender" name="px4_sender" output="screen">
		<rosparam command="load" file="$(find p600_experiment)/config/prometheus_control_config/px4_sender_outdoor.yaml"/>
	</node>

	<!-- run the ground_station.cpp -->
	<node pkg="prometheus_station" type="ground_station" name="ground_station" output="screen" launch-prefix="gnome-terminal --tab --">	
	</node>

	<!-- run the ground_station_msg.cpp -->
	<node pkg="prometheus_station" type="ground_station_msg" name="ground_station_msg" output="screen" launch-prefix="gnome-terminal --tab --">	
	</node>
</launch>

这是一个ROS launch文件,用于启动与机载控制相关的节点和程序。让我们逐个节点和参数来详细解释:

1. 启动 MAVROS

<node pkg="mavros" type="mavros_node" name="mavros" output="screen"> 
<param name="fcu_url" value="/dev/ttyTHS0:921600" /> 
<param name="gcs_url" value="" /> 
<param name="target_system_id" value="1" /> 
<param name="target_component_id" value="1" /> 
<rosparam command="load" file="$(find p600_experiment)/config/mavros_config/px4_pluginlists_gps.yaml" /> 
<rosparam command="load" file="$(find p600_experiment)/config/mavros_config/px4_config_gps.yaml" /> 
</node>
  • mavros_node: 这个节点来自 mavros 包,它与 PX4 Autopilot 系统通信,充当 ROS 和飞控单元之间的接口。
  • fcu_url: 指定飞控单元的串口设备及波特率,这里设置为 /dev/ttyTHS0:921600
  • gcs_url: 地面站 URL,如果有需要可以填入对应的值,但在这里是空白的。
  • target_system_id 和 target_component_id: 分别指定飞控单元的系统 ID 和组件 ID。
  • px4_pluginlists_gps.yaml 和 px4_config_gps.yaml: 加载了用于 MAVROS 的配置文件,配置 PX4 插件和参数。

2. 启动 Promethues 代码

<node pkg="prometheus_control" type="px4_pos_estimator" name="px4_pos_estimator" output="screen"> 
<param name="input_source" value="9" /> 
<param name="rate_hz" value="30" /> 
</node>
  • px4_pos_estimator: 这个节点估计无人机的位置,根据参数设置从不同的数据源获取位置数据,这里使用参数 input_source 来指定输入源为 9,可能代表特定的传感器或系统。
  • rate_hz: 设置节点运行的频率为 30Hz。
<node pkg="prometheus_control" type="px4_sender" name="px4_sender" output="screen"> 
<rosparam command="load" file="$(find p600_experiment)/config/prometheus_control_config/px4_sender_outdoor.yaml"/> 
</node>
  • px4_sender: 这个节点负责向 PX4 发送控制命令或数据。通过加载 px4_sender_outdoor.yaml 文件来配置节点所需的参数。

3. 启动地面站相关节点

<node pkg="prometheus_station" type="ground_station" name="ground_station" output="screen" launch-prefix="gnome-terminal --tab --"> 
</node> <node pkg="prometheus_station" type="ground_station_msg" name="ground_station_msg" output="screen" launch-prefix="gnome-terminal --tab --"> 
</node>
  • ground_station: 这个节点可能是一个地面站程序的一部分,用于与无人机或系统进行通信和控制。launch-prefix 设置了在新标签页中启动该节点。
  • ground_station_msg: 这个节点可能是用来处理地面站的消息传递和交互的程序。

3.2 订阅话题

GimbalBasic::GimbalBasic(ros::NodeHandle &nh)
{
    nh.param<std::string>("multicast_udp_ip", multicast_udp_ip, "224.0.0.88");
    this->communication_ = new Communication(nh);
    //【订阅】吊舱状态数据
    this->gimbal_state_sub_ = nh.subscribe("/gimbal/state", 10, &GimbalBasic::stateCb, this);
    //【订阅】跟踪误差
    this->vision_diff_sub_ = nh.subscribe("/gimbal/track", 10, &GimbalBasic::trackCb, this);
    //【发布】框选 点击 目标
    this->window_position_pub_ = nh.advertise<ground_station_bridge::WindowPosition>("/detection/bbox_draw", 1000);
    //【发布】吊舱控制
    this->gimbal_control_pub_ = nh.advertise<ground_station_bridge::GimbalControl>("/gimbal/control", 1000);
}

3.2.1 订阅(sub)话题实例 :

this->gimbal_state_sub_ = nh.subscribe("/gimbal/state", 10, &GimbalBasic::stateCb, this); 
this->vision_diff_sub_ = nh.subscribe("/gimbal/track", 10, &GimbalBasic::trackCb, this);
  • 这两行代码分别用来订阅两个不同的ROS话题。
  • gimbal_state_sub_ 订阅 /gimbal/state 话题,每次缓存10个消息,当有新消息时调用 GimbalBasic::stateCb 成员函数处理。
  • vision_diff_sub_ 订阅 /gimbal/track 话题,同样每次缓存10个消息,当有新消息时调用 GimbalBasic::trackCb 成员函数处理。
  • &GimbalBasic::stateCb 和 &GimbalBasic::trackCb 是成员函数指针,指向处理收到消息的回调函数。

3.2.2 查看所有话题:

rostopic list 是一个命令行工具命令,用于列出当前ROS系统中所有可用的话题(topics);

3.2.3 命令行终端获得gps话题的输出:

e.g.

rostopic echo /mavros/gpsstatus/gps1/raw

预期输出:

关于话题:

话题(topics)是一种基础的通信机制,用于在ROS节点之间传递消息。话题是一种发布者-订阅者(publisher-subscriber)模型的实现,允许节点(ROS程序)以异步的方式进行通信。以下是关于ROS话题的一些重要信息和特性:

1. 定义和命名

  • 话题名称: 每个话题都有一个唯一的名称,用于在整个ROS系统中标识该话题。话题名称以斜杠 / 开头,例如 /odom/scan 等。
  • 消息类型: 每个话题传递的消息具有特定的数据类型,如传感器数据、控制命令等。消息类型由 ROS 消息定义文件(.msg 文件)定义,并且在编译时生成。

2. 通信模式

  • 发布者(Publishers): 发布者节点向话题发布消息。多个节点可以同时发布到同一个话题。
  • 订阅者(Subscribers): 订阅者节点从话题订阅消息。多个节点可以同时订阅同一个话题。

3. 异步通信

  • ROS话题的通信是异步的,即发布者和订阅者之间不需要直接建立连接。发布者发布消息后,所有订阅该话题的节点都能接收到这些消息,而不需要发布者和订阅者同时在线。

3.3 通过socket传回[+内容筛选]

socket代码如下:

server:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import socket

# 设置服务器的 IP 地址和端口号
SERVER_IP ='192.168.79.60' #'10.128.72.152'#'192.168.1.134'#'192.168.231.77'
SERVER_PORT = 8082

# 创建一个 TCP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务器
client_socket.connect((SERVER_IP, SERVER_PORT))

# 设置超时时间为 5 秒
client_socket.settimeout(10)

while True:
    # # 发送 "rostopic echo" 命令给服务器
    # message = "rostopic echo"
    # client_socket.sendall(message.encode())
    # 手动输入消息
    message = input("请输入要发送的消息 ('q' to quit): ")
    if message == 'q':
        break
    # 发送消息给服务器
    client_socket.sendall(message.encode())
    # 接收服务器的响应
    try:
        response = client_socket.recv(4096)  # 增加缓冲区大小以确保完整接收响应
        if response:
            response_str = response.decode('gbk')
            print("从服务器收到的响应:", response_str)

            # 截取以“lat:”开头的行
            lat_lines = [line for line in response_str.split('\n') if line.startswith('lat:')]
            print("截取的 lat 行:")
            if lat_lines:
                for line in lat_lines:
                    print(line)
            else:
                print("没有找到以 'lat:' 开头的行")

            # 截取以“lon:”开头的行
            lon_lines = [line for line in response_str.split('\n') if line.startswith('lon:')]
            print("截取的 lon 行:")
            if lon_lines:
                for line in lon_lines:
                    print(line)
            else:
                print("没有找到以 'lon:' 开头的行")
        else:
            print("服务器没有响应")
    except socket.timeout:
        print("操作超时,请重试")



# 关闭连接
client_socket.close()
client[实现基本的实时输入通信]:
import socket

# 设置服务器的 IP 地址和端口号
SERVER_IP ='10.128.74.238'    #'192.168.1.123'
SERVER_PORT = 8080  # 端口号与服务器端口号一致

# 创建一个 UDP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while True:
    # 输入要发送的数据
    message = input("请输入要发送到服务器的消息(输入 'exit' 退出): \n GPS:")
    if message == 'exit':
        break

    # 发送数据
    client_socket.sendto(message.encode(), (SERVER_IP, SERVER_PORT))

    # 接收服务器的响应
    data, server_address = client_socket.recvfrom(1024)
    print(f"收到来自服务器 {server_address} 的响应:", data.decode())

# 关闭连接
client_socket.close()

3.4 传给本地数据库

[待补充]..

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

生信算法8 - HGVS转换与氨基酸字母表

HGVS 概念 HGVS 人类基因组变异协会(Human Genome Variation Society)提出的转录本编号&#xff0c;cDNA 参考序列(以前缀“c.”表示)、氨基酸参考序列(以前缀“p.”表示)。cDNA 中一种碱基被另一种碱基取代&#xff0c;以“>”进行表示&#xff0c;如&#xff1a;c.2186A&…

14-Kafka-Day03

第 5 章 Kafka 消费者 5.1 Kafka 消费方式 5.2 Kafka 消费者工作流程 5.2.1 消费者总体工作流程 一个消费者组中的多个消费者&#xff0c;可以看作一个整体&#xff0c;一个组内的多个消费者是不可能去消费同一个分区的数据的&#xff0c;要不然就消费重复了。 5.2.2 消费者…

达梦8 兼容MySQL语法支持非分组项作为查询列

MySQL 数据库迁移到达梦后&#xff0c;部分GROUP BY语句执行失败&#xff0c;报错如下&#xff1a; 问题原因&#xff1a; 对于Oracle数据库&#xff0c;使用GROUP BY时&#xff0c;SELECT中的非聚合列必须出现在GROUP BY后面&#xff0c;否则就会报上面的错误&#xff0c;达梦…

C++项目——负载均衡在线OJ

前言 学习了这么久的C/C与Linux&#xff0c;终于到了做项目的时候&#xff0c;想想还是有点小激动&#xff0c;哈哈哈哈哈。我们的目标是做一个跟leetcode、牛客类似的在线OJ系统&#xff0c;功能阉割了一些&#xff0c;比如说登录、论坛、求职等等。主要实现了提交题目与判定…

[问题记录]Qt使用QPainter在QImage、QBitmap、QPixmap上面绘图时出现杂色

目录 1. 问题现象 2. 问题原因 3. 解决方案 1. 问题现象 使用QPainter&#xff0c;在QImage上绘图&#xff0c;能明显看到顶部有杂色&#xff0c;在QBitmap上则更明显&#xff0c;唯一在QPicture上绘图没出现该问题。 代码 void Widget::paintImage() {QPainter painter;Q…

拉普拉斯矩阵对称归一化理解,通过一个简单的例子进行说明

拉普拉斯矩阵&#xff08;Laplacian Matrix&#xff09;是一个与图相关的矩阵&#xff0c;通常用于图分析、机器学习和信号处理等领域。它是由图的邻接矩阵或关联矩阵计算得出的。 对于一个无向图 G ( V , E ) G(V,E) G(V,E)&#xff0c;它的拉普拉斯矩阵 L L L 可以表示为…

07-appium常用操作

一、press_keycode 1&#xff09;方法说明 press_keycode方法是appium的键盘相关函数&#xff0c;可以实现键盘的相关操作&#xff0c;比如返回、按键、音量调节等等。也可以使用keyevent方法&#xff0c;功能与press_keycode方法类似。 # KeyCode&#xff1a;各种操作对应的…

web中间件漏洞-Resin漏洞-密码爆破、上传war

web中间件漏洞-Resin漏洞-密码爆破、上传webshell 使用爆破结果resin/resin进入后台&#xff0c;选择deploy。想部署webshell,得使用SSL方式请求&#xff0c;访问https://192.168.1.2:8443/resin-admin/index.php?qdeploy&s0(注&#xff1a;如果使用最新的火狐浏览器或者谷…

ElasticSearch学习笔记(二)文档操作、RestHighLevelClient的使用

文章目录 前言3 文档操作3.1 新增文档3.2 查询文档3.3 修改文档3.3.1 全量修改3.3.2 增量修改 3.4 删除文档 4 RestAPI4.1 创建数据库和表4.2 创建项目4.3 mapping映射分析4.4 初始化客户端4.5 创建索引库4.6 判断索引库是否存在4.7 删除索引库 5 RestClient操作文档5.1 准备工…

【大数据】—“西游记“全集文本数据挖掘分析实战教程

项目背景介绍 四大名著&#xff0c;又称四大小说&#xff0c;是汉语文学中经典作品。这四部著作历久不衰&#xff0c;其中的故事、场景&#xff0c;已经深深地影响了国人的思想观念、价值取向。四部著作都有很高的艺术水平&#xff0c;细致的刻画和所蕴含的思想都为历代读者所…

XGBOOST案例

最近我在Kaggle上找到一个跟XGBOOST相关的代码&#xff0c;这有助于我们去实战性的学习。 这段代码旨在使用XGBoost和TPU进行大规模的分子绑定预测。 比赛项目&#xff1a;NeurIPS 2024 - Predict New Medicines with BELKA | Kaggle 训练样本代码&#xff1a; 上图是我们已…

新火种AI|英伟达市值超越微软!AI技术如何重塑科技股价值?

作者&#xff1a;一号 编辑&#xff1a;美美 AI&#xff0c;正带着美股狂奔。 2024年&#xff0c;英伟达&#xff08;NVIDIA&#xff09;以其在人工智能&#xff08;AI&#xff09;领域的卓越表现&#xff0c;市值首次超越了科技巨头微软&#xff0c;成为全球市值最高的公司…

如何优雅的使用Github Action服务来将Hexo部署到Github Pages

文章目录 参考文章前提条件1. 初始化Hexo2. 初始化仓库3. 创建Token4. 修改_config.yml5. 配置Github Action工作流6. 推送验证7. 配置Github Pages8. 修改Hexo主题样式10. 添加文章遇到了一些问题和方案1. 网站没有样式问题2. 图片不显示 参考文章 Bilibili视频教程-9分钟零成…

Cocos引擎加密方案解析

据2023年数据显示&#xff0c;Cocos引擎全球游戏市场的占有率约为20%&#xff0c;国内手游占有率约为40%&#xff0c;在国内手游市场中&#xff0c;不少热门游戏均为Cocos引擎研发&#xff0c;如《捕鱼达人》、《梦幻西游》、《剑与远征》等。 而在近年来国内火热的小游戏赛道…

XGBoost算法详解

XGBoost算法详解 XGBoost&#xff08;Extreme Gradient Boosting&#xff09;是一种高效的梯度提升决策树&#xff08;GBDT&#xff09;实现&#xff0c;因其高性能和灵活性在机器学习竞赛中广泛使用。本文将详细介绍XGBoost算法的原理&#xff0c;并展示其在实际数据集上的应…

IO-LiNK简介

什么是IO-Link&#xff1f; IO-Link&#xff08; IEC 61131-9 &#xff09;是一种开放式标准串行通信协议&#xff0c;允许支持 IO-Link 的传感器、设备进行双向数据交换&#xff0c;并连接到主站。 IO-Link 主站可以通过各种网络&#xff0c;如现场总线进行传输。每个 IO-L…

北方高温来袭!动力煤却不涨反跌的原因分析

内容提要 北方高温而南方降雨偏多的格局或将继续&#xff0c;整体水力发电量增长可能继续明显增长&#xff0c;但火电增幅可能继续缩小。5月重点火电厂的发电量和耗煤量增速均呈现负增长&#xff0c;耗煤量月度同比下降7%&#xff0c;而重点水电同比大增近40%。我国电力行业绿…

蓝牙模块在智能城市构建中的创新应用

随着科技的飞速发展&#xff0c;智能城市的概念已经逐渐从理论走向实践。物联网技术作为智能城市构建的核心驱动力&#xff0c;正在推动着城市基础设施、交通管理、环境监测等领域的深刻变革。蓝牙模块&#xff0c;作为物联网技术的重要组成部分&#xff0c;以其低功耗、低成本…

档案数字化建设要点

目前&#xff0c;档案信息数字化的现状是档案标准化、规范化滞后和应用软件多乱&#xff0c;这些都严重影响了系统整体水平的提高。档案信息自动化的内涵包括档案工作的各个方面和各个环节&#xff0c;其中首要的是档案业务要规范&#xff0c;档案标准要建立健全和真正实施。档…

springboot弘德图书馆座位预约管理系统-计算机毕业设计源码07028

摘 要 在面对当今培育人才计划的压力&#xff0c;人们需要汲取更多的不同领域的知识来不断扩充自己的知识层面&#xff0c;因此他们对学习的欲望不断扩大&#xff0c;图书馆作为我们的学习宝地&#xff0c;有着不可替代的地位。但是在信息化时代&#xff0c;传统模式下的图书馆…