【4. ROS的主要通讯方式:Topic话题与Message消息】
【4. ROS的主要通讯方式:Topic话题与Message消息】
- 1. 前言
- 1.1 王者解释结点通讯:
- 1.2 通讯小结
- 2. 灵活的Topic话题图解
- 2.1 话题注意细节
- 2.2 外延补充
- 3. Message消息图解
- 3.1 消息类型
- 3.2 查看标准消息类型`std_msgs`
- 4. 使用C++实现Publisher发布者
- 4.1 发布者的实现
- 4.2 消息分析
- 4.3 `chao_node.cpp`源程序
- 4.4 运行调试chao_node节点
- 5. 复制节点yao_node
- 5.1 修改C++源代码
- 5.2 修改CMakeLists.tet文件
- 5.3 运行调试yao_node节点
- 6. 使用C++实现Subscriber订阅者
- 6.1 创建订阅者节点
- 6.2 消息分析
- 6.3 添加chao_node节点的订阅
- 6.4 修改CMakeLists.tet文件
- 6.5 运行调试ma_node
- 6.6 调整和优化
- 6.7 添加yao_node节点的订阅
- 6.8 rqt_graph查看节点消息流
- 6.9 小结
- 7. 使用launch文件启动多个ROS节点
- 7.1 使用launch文件启动节点
- 7.2 编写运行launch文件
- 7.3 调试launch文件
- 7.4 launch小结
- 8. 使用Python编写Publisher发布者节点
- 8.1 订阅者节点的Python实现
- 8.2 编写chao_node.py代码
- 8.3 py文件添加可执行的权限
- 8.4 运行调试chao_node.py
- 8.5 编写yao_node.py代码
- 8.6 运行调试yao_node.py
- 9. 使用Python实现Subscriber订阅者
- 9.1 创建订阅者节点
- 9.2 编写ma_node.py代码
- 9.3 py文件添加可执行的权限
- 9.4 运行调试ma_node
- 9.5 添加yao_node节点的订阅
- 9.6 编写launch启动文件
- 9.7 运行调试
- 9.8 rqt_graph查看节点消息流
- 10. 总结

1. 前言
本教程是B站阿杰视频的笔记
视频地址:https://www.bilibili.com/video/BV1qa41137ED

1.1 王者解释结点通讯:
- 话题topic
- 发布者publisher
- 订阅者subsciber

1.2 通讯小结
- 话题Topic是节点间进行持续通讯的一种形式。
- 话题通讯的两个节点通过话题的名称建立起话题通讯连接。3.话题中通讯的数据,叫做消息Message。
- 消息Message通常会按照一定的频率持续不断的发送,以保证消息数据的实时性。
- 消息的发送方叫做话题的发布者Pubplisher。
- 消息的接收方叫做话题的订阅者Subsciber。
2. 灵活的Topic话题图解

2.1 话题注意细节

2.2 外延补充
- —个ROS节点网络中,可以同时存在多个话题。
- 一个话题可以有多个发布者也可以有多个订阅者。
- 一个节点可以对多个话题进行订阅,也可以发布多个话题。
- 不同的传感器消息通常会拥有各自独立话题名称,每个话题只有一个发布者。
- 机器人速度指令话题通常会有多个发布者,但是同一时间只能有一个发言人。
3. Message消息图解

3.1 消息类型
ROS Index官网:https://index.ros.org/

搜索std_msgs

找到匹配的版本

3.2 查看标准消息类型std_msgs
选择Website,进入https://wiki.ros.org/std_msgs

下翻到 2.ROS Message Types

消息是嵌套的,由简单到复杂,类似C++的结构体
4. 使用C++实现Publisher发布者

这一期我们将按照这个场景来构建话题的发布者,一共有2个发布者,根据需求创建ssr_pkg包的chao_node和yao_node订阅节点
4.1 发布者的实现
打开之前创建的ssr_pkg,教程参照: 【初学ROS,年轻人的第一个Node节点】用VScode打开chao_node.cpp

4.2 消息分析
去ROS Index查找对应消息类型,进入https://wiki.ros.org/std_msgs,下翻到 2.ROS Message Types

超哥说的那句话不就是一个字符串吗



4.3 chao_node.cpp源程序
#include <ros/ros.h>
#include <std_msgs/String.h>
int main(int argc,char *argv[])
{ros::init(argc,argv,"chao_node" );printf("我的枪去而复返,你的生命有去无回!\n");ros::NodeHandle nh;ros::Publisher pub = nh.advertise<std_msgs ::String>("kuai_shang_che_kai_hei_qun", 10);ros::Rate loop_rate(10);while( ros::ok()){printf("我要开始刷屏了!\n");std_msgs::String msg;msg.data ="国服马超,带飞";pub.publish(msg);loop_rate.sleep();}return 0;
}
ctrl+s快捷保存
ctrl+shift+b快捷编译
4.4 运行调试chao_node节点
打开两个终端,分别运行两行代码
roscore
rosrun ssr_pkg chao_node
rostopic工具
rostopic list
rostopic echo /kuai_shang_che_kai_hei_qun
echo -e "\u56FD\u670D\u9A6C\u8D85\uFF0C\u5E26\u98DE"
rostopic hz /kuai_shang_che_kai_hei_qun


小结
- 确定话题名称和消息类型。
- 在代码文件中include消息类型对应的头文件。
- 在main函数中通过NodeHandler大管家发布一个话题并得到消息发送对象。
- 生成要发送的消息包并进行发送数据的赋值。
- 调用消息发送对象的publish()函数将消息包发送到话题当中。

5. 复制节点yao_node
从chao_node.cpp复制到节点yao_node.cpp

5.1 修改C++源代码
#include <ros/ros.h>
#include <std_msgs/String.h>
int main(int argc,char *argv[])
{ros::init(argc,argv,"yao_node" );printf("过去生于未来!\n");ros::NodeHandle nh;ros::Publisher pub = nh.advertise<std_msgs ::String>("gie_gie_dai_wo", 10);ros::Rate loop_rate(10);while( ros::ok()){printf("我要开始刷屏了!\n");std_msgs::String msg;msg.data ="求上车+++";pub.publish(msg);loop_rate.sleep();}return 0;
}
ctrl+s快捷保存
ctrl+shift+b快捷编译
5.2 修改CMakeLists.tet文件
增加yao_node节点配置

add_executable(chao_node src/chao_node.cpp)
target_link_libraries (chao_node${catkin_LIBRARIES}
)
add_executable(yao_node src/yao_node.cpp)
target_link_libraries(yao_node${catkin_LIBRARIES}
)
5.3 运行调试yao_node节点
运行新节点前,需要保留下面两个终端
roscore
rosrun ssr_pkg chao_node
rosrun ssr_pkg yao_node
采用rostopic查看消息
rostopic工具
rostopic list
rostopic echo /gie_gie_dai_wo
echo -e "\u56FD\u670D\u9A6C\u8D85\uFF0C\u5E26\u98DE"
rostopic hz /gie_gie_dai_wo

6. 使用C++实现Subscriber订阅者
根据需求创建atr_pkg包的ma_node订阅节点

6.1 创建订阅者节点
创建Package软件包
- 创建在~/catkin_ws/src文件夹里
- catkin_create_pkg<包名><依赖项列表>
catkin_creat_pkg atr_pkg rospy roscpp std_msgs

新建src文件夹的ma_node.cpp文件

6.2 消息分析

6.3 添加chao_node节点的订阅
修改ma_node代码
#include <ros/ros.h>
#include <std_msgs/String.h>
void chao_callback(std_msgs::String msg)
{printf(msg.data.c_str());printf("\n");
}
int main(int argc,char *argv[])ros::init(argc,argv,"ma_node" );ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("kuai_shang_che_kai_hei_qun",10,chao_callback);while ( ros::ok()){ros::spinOnce();}
return 0;
6.4 修改CMakeLists.tet文件
增加ma_node节点配置

add_executable(ma_node src/ma_node.cpp)
target_link_libraries(ma_node${catkin_LIBRARIES}
)
ctrl+s快捷保存
ctrl+shift+b快捷编译
6.5 运行调试ma_node
打开3个终端,分别运行3行代码
roscore
rosrun ssr_pkg chao_node
rosrun atr_pkg ma_node


6.6 调整和优化
修改ma_node节点,添加chao_node节点的订阅
ma_node.cpp源程序
#include <ros/ros.h>
#include <std_msgs/String.h>
void chao_callback(std_msgs::String msg)
{ROS_INFO(msg.data.c_str());}
int main(int argc,char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"ma_node" );ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("kuai_shang_che_kai_hei_qun",10,chao_callback);while ( ros::ok()){ros::spinOnce();}return 0;
}

打印如下

[]时间戳表示【格林尼治时间1970年1月1日0时0分0秒】距离现在多少秒。
6.7 添加yao_node节点的订阅
修改ma_node节点,添加yao_node节点的订阅
ma_node.cpp源程序
#include <ros/ros.h>
#include <std_msgs/String.h>
void chao_callback(std_msgs::String msg)
{ROS_INFO(msg.data.c_str());
}
void yao_callback(std_msgs::String msg)
{ROS_WARN(msg.data.c_str());
}
int main(int argc,char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"ma_node" );ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("kuai_shang_che_kai_hei_qun",10,chao_callback);ros::Subscriber sub_2 = nh.subscribe("gie_gie_dai_wo",10,yao_callback);while ( ros::ok()){ros::spinOnce();}return 0;
}

打开4个终端,分别运行4行代码
roscore
rosrun ssr_pkg chao_node
rosrun ssr_pkg yao_node
rosrun atr_pkg ma_node

6.8 rqt_graph查看节点消息流


6.9 小结
- 确定话题名称和消息类型。
- 在代码文件中include <ros.h>和消息类型对应的头文件。
- 在main函数中通过NodeHandler大管家订阅一个话题并设置消
息接收回调函数。 - 定义一个回调函数,对接收到的消息包进行处理。
- main函数中需要执行ros::spinOnce(),让回调函数能够响应接收到的消息包。

7. 使用launch文件启动多个ROS节点
7.1 使用launch文件启动节点
该文件类型是XML语法,类似http文本。

批量启动ros节点文件






7.2 编写运行launch文件
新建launch文件夹的kai_hei.launch文件


kai_he.launch源码
launch><node pkg="ssr_pkg" type="yao_node" name="yao_node" /><node pkg="ssr_pkg" type="chao_node" name=" chao_node" /><node pkg="atr_pkg" type="ma_node" name="ma_node" output="screen"/>
</launch>

7.3 调试launch文件
运行下面指令,启动launch的三个节点
roslaunch atr_pkg kai_hei.launch


采用rqt_graph命令查看节点流图

修改kai_he.launch源码,添加launch-prefix=" gnome-terminal -e",开一个新终端运行显示chao_node节点
launch><node pkg="ssr_pkg" type="yao_node" name="yao_node" /><node pkg="ssr_pkg" type="chao_node" name=" chao_node" launch-prefix=" gnome-terminal -e"/><node pkg="atr_pkg" type="ma_node" name="ma_node" output="screen"/>
</launch>

运行下面指令,启动launch的三个节点
roslaunch atr_pkg kai_hei.launch

7.4 launch小结
- 使用launch文件,可以通过roslaunch指令一次启动多个节点。
- 在launch文件中,为节点添加
output="screen”属性,可以让节点信息输出在终端中。(ROS_WARN不受该属性控制) - 在launch文件中,为节点添加
launch-prefix="gnome-terminal -e"属性,可以让节点单独运行在一个独立终端中。

8. 使用Python编写Publisher发布者节点
8.1 订阅者节点的Python实现

ctrl+alt+t打开终端,只需一次编译
创建python包
cd catkin_ws/src/
catkin_create_pkg ssr_pkg rospy std_msgs
cd ..
catkin_make

VScode打开,创建scripts

创建chao_node.py
8.2 编写chao_node.py代码
先引入python包,设置中文utf-8显示
- ros>=20.04,采用python3
- ros<20.04,采用python

对比学习C++发布节点


NodeHandle变为rospy
chao_node.py源码
#!/usr/bin/env python3
#coding=utf-8
import rospy
from std_msgs.msg import String
if _name__ == "_main_":rospy.init_node ( " chao_node ")rospy.logwarn("我的枪去而复返,你的生命有去无回!")pub = rospy.Publisher( "kuai_shang_che_kai_hei_qun" ,String , queue_size=10)rate = rospy. Rate( 10)while not rospy.is_shutdown():rospy.loginfo("我要开始刷屏了")msg = String()msg.data =“国服马超,带飞"pub.publish(msg)rate.sleep(

8.3 py文件添加可执行的权限

在所在文件夹打开终端
chmod +x chao_node.py
8.4 运行调试chao_node.py
打开两个终端分别运行两条指令
roscore
rosrun ssr_pkg chao_node.py

rostopic工具
rostopic list
rostopic echo /kuai_shang_che_kai_hei_qun
echo -e "\u56FD\u670D\u9A6C\u8D85\uFF0C\u5E26\u98DE"

python前面经过第一次编译,后期不需要编译可以直接运行,也不需要CMake文件配置
8.5 编写yao_node.py代码
直接复制chao_node.py改为yao_node.py,权限也会一起传递

yao_node.py源码
#!/usr/bin/env python3
#coding=utf-8
import rospy
from std_msgs.msg import String
if _name__ = "__main_":rospy.init_node ( "yao_node")rospy.logwarn("过去生于未来! ")pub = rospy. Publisher( "gie_gie_dai_wo" ,String , queue_size=10)rate = rospy.Rate(10)while not rospy.is_shutdown():rospy.loginfo("我要开始刷屏了")msg = String()msg.data = "求上车+++"pub.publish(msg)rate.sleep()
8.6 运行调试yao_node.py
打开两个终端分别运行两条指令
roscore
rosrun ssr_pkg yao_node.py

rostopic工具
rostopic list
rostopic echo /gie_gie_dai_wo
echo -e "\u56FD\u670D\u9A6C\u8D85\uFF0C\u5E26\u98DE"

9. 使用Python实现Subscriber订阅者
根据需求创建atr_pkg包的ma_node订阅节点

9.1 创建订阅者节点
创建Package软件包
- 创建在~/catkin_ws/src文件夹里
- catkin_create_pkg<包名><依赖项列表>
cd catkin_ws/src/
catkin_creat_pkg atr_pkg rospy std_msgs
cd ..
catkin_make

VScode打开,创建scripts文件夹,创建ma_node.py

9.2 编写ma_node.py代码
先引入python包,设置中文utf-8显示
- ros>=20.04,采用python3
- ros<20.04,采用python

对比学习C++发布节点


NodeHandle变为rospy
修改ma_node代码
#!/usr/bin/env python3
#coding=utf-8
import rospy
from std_msgs.msg import String
def chao_callback(msg):rospy. loginfo(msg.data)
ifname== "_main_":rospy.init_node ( "ma_node" )sub = rospy.Subscriber("kuai_shang_che_kai_hei_qun" ,String , chao_callback,queue_size=10)rospy.spin ()

9.3 py文件添加可执行的权限

在所在文件夹打开终端
chmod +x ma_node.py
9.4 运行调试ma_node
打开3个终端,分别运行3行代码
roscore
rosrun ssr_pkg chao_node.py
rosrun atr_pkg ma_node

9.5 添加yao_node节点的订阅
修改ma_node节点,添加yao_node节点的订阅
ma_node.py源程序
#!/usr/bin/env python3
#coding=utf-8
import rospy
from std_msgs.msg import String
def chao_callback(msg):rospy. loginfo(msg.data)
def yao_callback(msg):rospy. logwarn(msg.data)
ifname== "_main_":rospy.init_node ( "ma_node" )sub = rospy.Subscriber("kuai_shang_che_kai_hei_qun" ,String , chao_callback,queue_size=10)sub_2 = rospy.Subscriber("gie_gie_dai_wo" ,String , yao_callback,queue_size=10)rospy.spin ()

9.6 编写launch启动文件
新建launch文件夹的kai_hei.launch文件

kai_he.launch源码
launch><node pkg="ssr_pkg" type="yao_node.py" name="yao_node" /><node pkg="ssr_pkg" type="chao_node.py" name=" chao_node" /><node pkg="atr_pkg" type="ma_node.py" name="ma_node" launch-prefix=" gnome-terminal -e"/>
</launch>
9.7 运行调试
打开2个终端,分别运行2行代码
roscore
roslaunch atr_pkg kai_hei.launch

9.8 rqt_graph查看节点消息流
打开一个终端,输入
rqt_graph

10. 总结
本节学习了ROS机器人的主要通讯方式,尝试C++和python两种语言编写Topic话题与Message消息,接下来会介绍机器人的运动操作。完美撒花!
相关文章:
【4. ROS的主要通讯方式:Topic话题与Message消息】
【4. ROS的主要通讯方式:Topic话题与Message消息】 1. 前言1.1 王者解释结点通讯:1.2 通讯小结 2. 灵活的Topic话题图解2.1 话题注意细节2.2 外延补充 3. Message消息图解3.1 消息类型3.2 查看标准消息类型std_msgs 4. 使用C实现Publisher发布者4.1 发布…...
【react全家桶学习】react中组件定义及state属性(超详/必看)
函数式组件定义及特点 定义(核心就是一个函数,返回虚拟dom): import React from reactexport default function index() {return <div>index</div> }特点: 1、适用于【简单组件】的定义2、是一个函数&a…...
如何以产品经理思维打造一所高品质学校?
学校的建设与管理真不是一件容易事。2023年03月17日,山东菏泽市曹县一家长投诉某中学课业繁重,孩子经常写作业到半夜;2023年4月4日,张先生在华龙网重庆网络问政平台投诉万州区某中学伙食差,指出“发灰的洋葱࿰…...
根治Spring中使用Mongo时报错InvalidMongoDbApiUsageException
文章目录 And Or迷惑原因 告别InvalidMongoDbApiUsageException问题简单解决根本解决修改源码 代码(省流,可以直接看这里) And Or 很多时候都需要进行逻辑的与或操作,但是spring当中自带的操作并不好用,于是做了相关的改进&#…...
【计算机组成原理】数据的表示和运算·进位计数制
🚩 本文已收录至专栏:计算机基础 我们可以通过显示屏看到各种形式的数据信息,但数据是如何在计算机中表示呢?运算器又是如何实现数据的算数、逻辑运算? 十进制数是最适合我们日常使用的一种计数方式,除此之…...
C++ Primer第五版_第十四章习题答案(21~30)
文章目录 练习14.21练习14.22头文件CPP文件 练习14.23头文件CPP文件 练习14.24头文件CPP文件 练习14.25练习14.26练习14.27练习14.28练习14.29练习14.30 练习14.21 编写 Sales_data 类的 和 运算符,使得 执行实际的加法操作而 调用。相比14.3节和14.4节对这两个运…...
服务器性能调优
硬件 如果是硬件瓶颈就换硬件 (包括CPU、内存、网卡) 软件 如果是方案架构设计有问题就换方案,比如mysql、redis方案有问题 建议先 top 看下软件瓶颈在哪,CPU、内存、网络(netstat),哪个进程占…...
带你深入学习k8s--(三) pod 管理
目录 一、简介 1、什么是pod 2、为什么要有pod 二、pod的分类 0、pod常用命令命令 1、准备镜像 2、自主式pod 3、控制器创建pod 4、扩容pod数量 5、通过service暴露pod(负载均衡,自动发起) 6、更新应用版本 三、编写yaml文件 四、Pod生命周期…...
前端系列11集-ES6 知识总结
ES Module 优点 静态分析 浏览器和 Node 都支持 浏览器的新 API 能用模块格式提供 不再需要对象作为命名空间 export 用于规定模块的对外接口 输出的接口与其对应的值是动态绑定关系可以取到模块内部实时的值 import 用于输入其他模块提供的功能 具有提升效果,会提升…...
连接分析工具箱 | 利用CATO进行结构和功能连接重建
导读 本研究描述了一个连接分析工具箱(CATO),用于基于扩散加权成像(DWI)和静息态功能磁共振成像(rs-fMRI)数据来重建大脑结构和功能连接。CATO是一个多模态软件包,使研究人员能够运行从MRI数据到结构和功能连接组图的端到端重建,定制其分析并…...
【目标检测论文阅读笔记】Detection of plane in remote sensing images using super-resolution
Abstract 由于大量的小目标、实例级噪声和云遮挡等因素,遥感图像的目标检测精度低,漏检率或误检率高。本文提出了一种新的基于SRGAN和YOLOV3的目标检测模型,称为SR-YOLO。解决了SRGAN网络 对超参数的敏感性和模态崩溃问题。同时,Y…...
外卖app开发流程全解析
外卖app开发是现代餐饮业的一个必备部分。在这个数字化时代,人们更愿意使用手机应用程序来订购食品。因此,为了满足客户需求,餐饮企业需要开发自己的外卖app。 第一步:确定目标受众 在开始外卖app的开发之前,需要确定…...
BUUCTF jarvisoj_level0
小白垃圾做题笔记而已,不建议阅读。。。 这道题感觉主要就是64位程序ebp8 题目中给出了shellcode 我们直接将返回地址覆盖就好。 在main函数中调用了vulnerable_function()函数。 vulnerable函数是一个漏洞函数:(存在缓溢出),我们只需要将…...
网络安全之入侵检测
目录 网络安全之入侵检测 入侵检测经典理论 经典检测模型 入侵检测作用与原理 意义 异常检测模型(Anomaly Detection) 误用检测模型(Misuse Detection) 经典特征案例 编辑自定义签名 编辑 签名检查过程 检测生命周期…...
元数据管理
1、业务元数据 描述 ”数据”背后的业务含义主题定义:每段 ETL、表背后的归属业务主题。业务描述:每段代码实现的具体业务逻辑。标准指标:类似于 BI 中的语义层、数仓中的一致性事实;将分析中的指标进行规范化。标准维度…...
C# WebService的开发以及客户端调用
目录 1、WebService简介 1.1 什么是XML? 1.2 什么是Soap? 1.3 什么是WSDL? 2、WebService与WebApi的区别与优缺点 2.1 WebService与WebApi的区别: 2.2 WebService的优缺点: 2.3 WebApi的优缺点: 3…...
有符号数和无符号数左移和右移
主要是有符号数的左移。 有的说不管符号位,直接左移,所以可以一会正数一会复数 https://bbs.csdn.net/topics/391075092 有的说符号位不动,其他来左移 不明白了。。。。 https://blog.csdn.net/hnjzsyjyj/article/details/119721014 https://…...
Netty小白入门教程
一、概述 1.1 概念 Netty是一个异步的基于事件驱动(即多路复用技术)的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。 1.2 地位 Netty在Java网络应用框架中的地位就好比,Spring框架在JavaEE开发中的地位。 以下的框架都使用了Nett…...
【逻辑位移和算数位移】
<< 运算符 && >> 运算符 正数位移 当 x>>n 中 x 为正数时,会将x的所有位右移x位,同时左边高位补0 显而易见,运算结束后,值为1 。 可知右移n位,结果就是 x / 2^n:7 / 2 ^2 1;…...
Blender3.5 边的操作
目录 1. 边操作1.1 边的细分 Subdivide1.2 边的滑移 Edge Slide1.3 边的删除1.4 边的溶解 Dissolve1.5 边线倒角 Bevel1.6 循环边 Loop Edges1.7 并排边 Ring Edges1.8 桥接循环边 1. 边操作 1.1 边的细分 Subdivide 在边选择模式,选中一条边,右键&…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
