【4. ROS的主要通讯方式:Topic话题与Message消息】

news2024/11/18 19:52:36

【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 通讯小结

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

2. 灵活的Topic话题图解

在这里插入图片描述

2.1 话题注意细节

在这里插入图片描述

2.2 外延补充

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

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

在这里插入图片描述

在这里插入图片描述
小结

  1. 确定话题名称和消息类型。
  2. 在代码文件中include消息类型对应的头文件。
  3. 在main函数中通过NodeHandler大管家发布一个话题并得到消息发送对象。
  4. 生成要发送的消息包并进行发送数据的赋值。
  5. 调用消息发送对象的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 小结

  1. 确定话题名称和消息类型。
  2. 在代码文件中include <ros.h>和消息类型对应的头文件。
  3. 在main函数中通过NodeHandler大管家订阅一个话题并设置消
    息接收回调函数。
  4. 定义一个回调函数,对接收到的消息包进行处理。
  5. 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小结

  1. 使用launch文件,可以通过roslaunch指令一次启动多个节点。
  2. 在launch文件中,为节点添加output="screen”属性,可以让节点信息输出在终端中。(ROS_WARN不受该属性控制)
  3. 在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. 总结

学习了c++和python写节点通讯,完美撒花!

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

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

相关文章

自动化工具 WEB 自动化工具

背景 使用自动化测试框架编写用例的时候&#xff0c;维护元素信息以及脚本较为麻烦。对应新手来说&#xff0c;编写脚本的能力有限&#xff0c;使用工具会更容易入手。最重要的是可视化操作让我觉得体验舒服。 演示地址 地址&#xff1a;hippo 账号&#xff1a;test 密码&am…

探索文件世界:用Python创建交互式文件浏览器

目录 引子&#xff1a; 应用场景&#xff1a; 源代码&#xff1a; 源代码说明&#xff1a; 效果如下所示: D:\spiderdocs\previewjpegmdfile.py 引子&#xff1a; 在许多应用程序中&#xff0c;需要方便地查看特定文件夹中的所有图片&#xff0c;例如图库管理器、相册应用…

泛型(一)

泛型&#xff1a;标签&#xff08;类型参数&#xff09; 所谓泛型&#xff0c;就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时&#xff08;例如&#xff0c;继承或实现这个接口&#xff0c;用这个类型…

Python 数据存储 ---->方式

我的个人博客主页&#xff1a;如果’真能转义1️⃣说1️⃣的博客主页 关于Python基本语法学习---->可以参考我的这篇博客&#xff1a;《我在VScode学Python》 数据存储是指在数据加工处理过程中将产生的临时文件或加工结果以某种格式保存。 常用的数据存储格式包括 TXT、Exc…

Java线程池常见面试题详解

线程池 池化技术 池化技术是一种常见的编程技巧, 把一些能够复用的东西&#xff08;比如说数据库连接、线程&#xff09;放到池中&#xff0c;避免重复创建、销毁的开销&#xff0c;在需要时可以重复使用这些预先准备的资源&#xff0c;从而极大提高性能。(提前保存大量资源,…

人生路上就是要不断打破认知边界

2023-4-25分享新知1.多角度看问题&#xff0c;竭尽全力才能找到突破口。结合客户需求解决问题2.新产品&有用的产品对用户提供有价值的产品3.全力就是所有部门都参与开发新产品&#xff0c;好机会就是有时间开发新产品&#xff0c;好产品就是一家企业的底气&#xff0c;产品…

SpringBoot 2.7.X 一套代码适配多种数据库讲解(图文详细)

文章目录 SpringBoot 2.7.X 一套代码适配多种数据库讲解(图文详细)1 简介1.1 概述1.2 环境安装1.3 测试脚本 2 基于Mybatis 方式2.1 添加DatabaseIdProvider配置2.2 在Mybatis的XML中,指定SQL语句的databaseId标签2.3 控制器接口样例2.4 呈现效果 3 基于MP框架Wrapps条件构造器…

AutoGPT也有Web UI了

AutoGPT能够在你的电脑上做任何你想做的事情&#xff0c;并且我们在前面的文章中也介绍了其他的一些类似的应用。 但是AutoGPT最大的一个问题是只能通过命令行界面(CLI)运行&#xff0c;这样就算是专业的技术人员使用起来也很麻烦&#xff0c;想想Stable Diffusion&#xff0c…

关于jeecgboot中遇到的问题及解决方案

1&#xff0c;关于数据权限问题 目的&#xff1a;一个人对应多个部门&#xff0c;部门下可能有子部门&#xff0c;过滤数据权限 解决方案&#xff1a; 方案①&#xff08;不推荐&#xff09;&#xff1a;如果后台是手写的sql&#xff08;没有用到mybatis-plus&#xff09;&…

一文弄懂标识符的规则和instanceof关键字

“世间有吸引法则&#xff0c;在于你有没有价值&#xff0c;价值来于物质资本和精神资本” 标识符的命名规则 标识符的含义&#xff1a;是指在程序中&#xff0c;我们自己定义的内容&#xff0c;例如方法名&#xff0c;变量名或者类名 命名规则&#xff1a;&#xff08;硬性要…

AlgoC++第六课:BP反向传播算法

目录 BP反向传播算法前言1. MNIST2. 感知机2.1 前言2.2 感知机-矩阵表示2.3 感知机-矩阵表示-多个样本2.4 感知机-增加偏置2.5 感知机-多个输出2.6 总结2.7 关于广播 3. BP4. 动量SGD5. BP示例代码总结 BP反向传播算法 前言 手写AI推出的全新面向AI算法的C课程 Algo C&#xf…

PHP、一:概述

1.概念 2.wampsever安装 百度搜索直接下载 下图是解压后目录&#xff0c;所写文件必须写在www文件夹下。 例&#xff1a;www文件夹下新建1.php&#xff0c;phpinfo()查看当前版本等信息。 使用localhost访问 php版本切换&#xff1a; 鼠标左键点击wampserver&#xff0c;切…

git rebase

git rebase rebase 是一个……我觉得很麻烦的指令&#xff0c;不过没办法&#xff0c;公司算是有个软规定必须要使用 rebase。 rebase 的功能和 merge 很像&#xff0c;不过它能够保持一个相对干净的历史&#xff0c;继续举个例子&#xff0c;假设现在有一个新的功能开发好了…

Golang Gin HTTP 请求和参数解析

gin 网络请求与路由处理 我们介绍了Gin框架&#xff0c;并做了Gin框架的安装&#xff0c;完成了第一个Gin工程的创建。 创建Engine 在gin框架中&#xff0c;Engine被定义成为一个结构体&#xff0c;Engine代表gin框架的一个结构体定义&#xff0c;其中包含了路由组、中间件、…

26- OCR 基于PP-OCRv3的液晶屏读数识别

要点&#xff1a; 液晶屏识别示例github 地址 1. 简介 本项目基于PaddleOCR开源套件&#xff0c;以PP-OCRv3检测和识别模型为基础&#xff0c;针对液晶屏读数识别场景进行优化。主要是针对各种仪表进行识别&#xff1a; 2 安装环境 安装Git&#xff1a;Git 详细安装教程 # 首…

YOLOv8 Bug及解决方案汇总

Traceback (most recent call last): File “D:\Anaconda\Scripts\yolo-script.py”, line 33, in sys.exit(load_entry_point(‘ultralytics==8.0.83’, ‘console_scripts’, ‘yolo’)()) self.model, self.save = parse_model(deepcopy(self.yaml), ch=ch, verbose=verbos…

基于 Python 的 Meta AI —— SAM

Segment Anything Model&#xff08;SAM&#xff09;是 Facebook 的一个 AI 模型&#xff0c;旨在推广分割技术。在我们之前的文章中&#xff0c;我们讨论了 SAM 的一般信息&#xff0c;现在让我们深入了解其技术细节。SAM 模型的结构如下图所示&#xff0c;图像经过编码器得到…

【致敬未来的攻城狮计划】— 连续打卡第十三天:FSP固件库开发启动文件详解

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

《Spring MVC》 第八章 拦截器实现权限验证、异常处理

前言 Spring 提供了Interceptor 拦截器&#xff0c;可用于实现权限验证、异常处理等 1、拦截器 对用户请求进行拦截&#xff0c;并在请求进入控制器&#xff08;Controller&#xff09;之前、控制器处理完请求后、甚至是渲染视图后&#xff0c;执行一些指定的操作 1.1、定义…

UGUI中点击判断的原理

首选需要理解 EventSystem 中的代码结构&#xff0c;EventSystem 目录下包含4个子文件夹&#xff0c;分别是 EventData、InputModules&#xff0c;Raycasters 和 UIElements&#xff0c;UIElements 下是 UI Toolkit 相关代码&#xff0c;这里不做研究&#xff0c;主要关注其他三…