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

  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. 总结

本节学习了ROS机器人的主要通讯方式,尝试C++和python两种语言编写Topic话题与Message消息,接下来会介绍机器人的运动操作。完美撒花!

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

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

相关文章

Sametime 12.0.1 FP1发布以及Notes中的SwiftFile使用

大家好&#xff0c;才是真的好。 上周&#xff0c;HCL推出了Sametime 12.0.1FP1FP1更新包程序&#xff0c;包含不少新功能以及很多修复程序。虽然Sametime组件现在不需要运行在Domino服务器上&#xff0c;但毕竟Sametime通常会使用Domino目录或Domino中的LDAP目录服务&#xf…

Maven 如何下载依赖包的源码包

使用Maven下载依赖包的时候&#xff0c; 默认是不会下载源码包的&#xff0c;但是有时候&#xff0c; 需要Debug代码&#xff0c;或是看看依赖项的源码的写法&#xff0c; 就需要下载源码包了。 这里以 Apache 的 commons-text 为例&#xff0c; 在Maven中添加如下依赖配置&am…

HCIA-RS实验-ENSP设备的基础配置

本文主要简单地介绍ENSP设备的基础配置&#xff0c;帮助读者快速上手使用ENSP。可以掌握一些基础的配置方案&#xff0c;更改名称&#xff0c;系统时间&#xff0c;系统地区、密码登录等信息 以下是该文章的拓扑图&#xff1b;现将这2台设备启动&#xff1b;后续双击即可进入命…

Openswan安装和简单配置

Openswan安装和简单配置 安装环境&#xff1a; 操作系统&#xff1a;Ubuntu20.0.4TLS 用户权限&#xff1a;root下载Openswan: wget https://github.com/xelerance/Openswan/archive/refs/tags/v3.0.0.zip安装Openswan: 解压Openswan&#xff1a;&#xff08;PS&#xff1a…

Arduino学习笔记4

一.声控灯实验 1.源代码 int led2;//定义板子上数字2口控制小灯 int flag0;//定义一个变量记录小灯是亮起还是熄灭 int shengyin3;//定义声音传感器的控制口void setup() {pinMode(led,OUTPUT);//定义小灯为输出模式pinMode(shengyin,INPUT);//定义声音控制口为输入模式 } vo…

基于天牛须(BAS)与NSGA-Ⅱ混合算法的交直流混合微电网多场景多目标优化调度(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

SentiBank Dector上手指南

​ 官网链接&#xff1a;https://www.ee.columbia.edu/ln/dvmm/vso/download/sentibank.html SentiBank Detector可以抽取图片中的形容词-名词对&#xff0c;之前一直看到&#xff0c;这次复现模型才第一次用到&#xff0c;上手的时候有点手足无措&#xff0c;因为官网在如何使…

Python入门教程+项目实战-11.4节: 元组与列表的区别

目录 11.4.1 元组与列表的区别 11.4.2 可变数据类型 11.4.3 元组与列表的区别 11.4.4 知识要点 11.4.5 系统学习python 11.4.1 不可变数据类型 不可变数据类型是指不可以对该数据类型进行修改&#xff0c;即只读的数据类型。迄今为止学过的不可变数据类型有字符串&#x…

我做了个GPT3键盘,用了两个月发现它有点傻

自 ChatGPT 出世&#xff0c;各类文本类AI产品层出不穷。甚至接连几日&#xff0c;Producthunt 上新品过半都是AI相关。 这其中部分原因是 OpenAI 公司开放的 GPT3 1API 接口十分易用。只要一个简单的文本请求&#xff0c;就能将现有产品加入AI功能。例如&#xff0c;Notion、…

提取文本的摘要snownlp模块

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 提取文本的摘要 snownlp模块 [太阳]选择题 关于以下python代码说法错误的一项是&#xff1f; from snownlp import SnowNLP myText """ChatGPT的出现标志着人类科技发…

【flask】三种路由和各自的比较配置文件所有的字母必须大写if __name__的作用核心对象循环引用的几种解决方式--难Flask的经典错误上下文管理器

三种路由 方法1&#xff1a;装饰器 python C#, java 都可以用这种方式 from flask import Flask app Flask(__name__)app.route(/hello) def hello():return Hello world!app.run(debugTrue)方法2: 注册路由 php python from flask import Flask app Flask(__name__)//app…

【JavaWeb】jQuery(上)

本章内容 1.jQuery Hello world 2.jQuery 选择器 3.jQuery 过滤器 4.jQuery 元素筛选 1、jQuery 介绍 什么是 jQuery ? jQuery&#xff0c;顾名思义&#xff0c;也就是 JavaScript 和查询&#xff08;Query&#xff09;&#xff0c;它就是辅助 JavaScript 开发的 js 类…

Linux 文件内容相关命令使用汇总

Linux操作系统有很多强大的文件内容相关命令&#xff0c;这些命令可以让您查看、分析和编辑文件。其中&#xff0c;最基本和常用的命令包括cat、more、less和head/tail等。除了这些基本命令之外&#xff0c;grep和find命令也是文件搜索和过滤方面的有力工具。 前言 我们这篇主…

根据 vue-grid-layout 动态设置Echarts尺寸大小

文章目录 前言一、vue-grid-layout 是什么&#xff1f;二、正文1.引入vue-grid-layout2.myEcharts组件3. Utils中的debounce防抖函数 总结 前言 此文背景是根据 vue-grid-layout 动态拖拽组件大小里面包含 Echarts 组件情景&#xff0c;也可以单独把监听动态设置Echarts 尺寸抽…

【神经网络】tensorflow实验7--回归问题

1. 实验目的 ①掌握一元线性回归模型的实现方法 ②掌握多元线性回归模型的实现方法 ③掌握三维数据可视化方法 2. 实验内容 ①使用TensorFlow建立一元线性回归模型&#xff0c;使用商品房销售数据训练模型&#xff0c;并使用训练好的模型预测房价 ②使用TensorFlow建立多元线…

企业级VUE前端项目各目录文件的作用

概述 本文项目是基于Vue CLI3构建工具&#xff08;基于 webpack)生成的脚手架项目。Vue CLI 现已处于维护模式&#xff0c;VUE官方推荐使用 create-vue&#xff08;基于 Vite&#xff09;构建工具。 vue-cli2.0与3.0在目录结构方面&#xff0c;有明显的不同,vue-cli3.0移除了…

什么是 MVVM?MVVM和 MVC 有什么区别?什么又是 MVP ?

目录标题 一、什么是MVVM&#xff1f;二、MVC是什么&#xff1f;三、MVVM和MVC的区别&#xff1f;四、什么是MVP&#xff1f; 一、什么是MVVM&#xff1f; MVVM是 Model-View-ViewModel的缩写&#xff0c;即模型-视图-视图模型。MVVM 是一种设计思想。 模型&#xff08;Model…

国内首款多节点/无需密钥/无需登录的ChatGPT客户端开源项目

在这个AI浪潮推动下&#xff0c;涌现了一大批“参差不齐”的GPT产品&#xff0c;有的一直在更新迭代&#xff0c;有的不断升级乃至付费订阅&#xff0c;有的中途停止运营。在这个AI产品也需要优胜劣汰的时代下&#xff0c;谁能够“谁主沉浮&#xff0c;且看今朝&#xff01;”&…

目标检测之损失函数

损失函数的作用为度量神经网络预测信息与期望信息&#xff08;标签&#xff09;的距离&#xff0c;预测信息越接近期望信息&#xff0c;损失函数值越小。 在目标检测领域&#xff0c;常见的损失分为分类损失和回归损失。 L1损失 L1 Loss也称为平均绝对值误差&#xff08;MAE&…

跨域融合风口下,又一外资巨头Tier 1+本土供应商“组团”来袭

头部企业正在加速“融合”。 汽车智能化升级对产品创新与多元化需求下&#xff0c;来自技术升级、降本、开发周期缩短等等一系列因素影响&#xff0c;中外供应商们都在积极思变和寻求破局。 随着全球智能汽车产业步入域集中和域融合的新阶段&#xff0c;过去的以硬件&#xf…