当前位置: 首页 > news >正文

【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消息,接下来会介绍机器人的运动操作。完美撒花!

相关文章:

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

【4. ROS的主要通讯方式&#xff1a;Topic话题与Message消息】 1. 前言1.1 王者解释结点通讯&#xff1a;1.2 通讯小结 2. 灵活的Topic话题图解2.1 话题注意细节2.2 外延补充 3. Message消息图解3.1 消息类型3.2 查看标准消息类型std_msgs 4. 使用C实现Publisher发布者4.1 发布…...

【react全家桶学习】react中组件定义及state属性(超详/必看)

函数式组件定义及特点 定义&#xff08;核心就是一个函数&#xff0c;返回虚拟dom&#xff09;&#xff1a; import React from reactexport default function index() {return <div>index</div> }特点&#xff1a; 1、适用于【简单组件】的定义2、是一个函数&a…...

如何以产品经理思维打造一所高品质学校?

学校的建设与管理真不是一件容易事。2023年03月17日&#xff0c;山东菏泽市曹县一家长投诉某中学课业繁重&#xff0c;孩子经常写作业到半夜&#xff1b;2023年4月4日&#xff0c;张先生在华龙网重庆网络问政平台投诉万州区某中学伙食差&#xff0c;指出“发灰的洋葱&#xff0…...

根治Spring中使用Mongo时报错InvalidMongoDbApiUsageException

文章目录 And Or迷惑原因 告别InvalidMongoDbApiUsageException问题简单解决根本解决修改源码 代码(省流&#xff0c;可以直接看这里&#xff09; And Or 很多时候都需要进行逻辑的与或操作&#xff0c;但是spring当中自带的操作并不好用&#xff0c;于是做了相关的改进&#…...

【计算机组成原理】数据的表示和运算·进位计数制

&#x1f6a9; 本文已收录至专栏&#xff1a;计算机基础 我们可以通过显示屏看到各种形式的数据信息&#xff0c;但数据是如何在计算机中表示呢&#xff1f;运算器又是如何实现数据的算数、逻辑运算&#xff1f; 十进制数是最适合我们日常使用的一种计数方式&#xff0c;除此之…...

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 类的 和 运算符&#xff0c;使得 执行实际的加法操作而 调用。相比14.3节和14.4节对这两个运…...

服务器性能调优

硬件 如果是硬件瓶颈就换硬件 &#xff08;包括CPU、内存、网卡&#xff09; 软件 如果是方案架构设计有问题就换方案&#xff0c;比如mysql、redis方案有问题 建议先 top 看下软件瓶颈在哪&#xff0c;CPU、内存、网络&#xff08;netstat&#xff09;&#xff0c;哪个进程占…...

带你深入学习k8s--(三) pod 管理

目录 一、简介 1、什么是pod 2、为什么要有pod 二、pod的分类 0、pod常用命令命令 1、准备镜像 2、自主式pod 3、控制器创建pod 4、扩容pod数量 5、通过service暴露pod&#xff08;负载均衡&#xff0c;自动发起&#xff09; 6、更新应用版本 三、编写yaml文件 四、Pod生命周期…...

前端系列11集-ES6 知识总结

ES Module 优点 静态分析 浏览器和 Node 都支持 浏览器的新 API 能用模块格式提供 不再需要对象作为命名空间 export 用于规定模块的对外接口 输出的接口与其对应的值是动态绑定关系可以取到模块内部实时的值 import 用于输入其他模块提供的功能 具有提升效果&#xff0c;会提升…...

连接分析工具箱 | 利用CATO进行结构和功能连接重建

导读 本研究描述了一个连接分析工具箱(CATO)&#xff0c;用于基于扩散加权成像(DWI)和静息态功能磁共振成像(rs-fMRI)数据来重建大脑结构和功能连接。CATO是一个多模态软件包&#xff0c;使研究人员能够运行从MRI数据到结构和功能连接组图的端到端重建&#xff0c;定制其分析并…...

【目标检测论文阅读笔记】Detection of plane in remote sensing images using super-resolution

Abstract 由于大量的小目标、实例级噪声和云遮挡等因素&#xff0c;遥感图像的目标检测精度低&#xff0c;漏检率或误检率高。本文提出了一种新的基于SRGAN和YOLOV3的目标检测模型&#xff0c;称为SR-YOLO。解决了SRGAN网络 对超参数的敏感性和模态崩溃问题。同时&#xff0c;Y…...

外卖app开发流程全解析

外卖app开发是现代餐饮业的一个必备部分。在这个数字化时代&#xff0c;人们更愿意使用手机应用程序来订购食品。因此&#xff0c;为了满足客户需求&#xff0c;餐饮企业需要开发自己的外卖app。 第一步&#xff1a;确定目标受众 在开始外卖app的开发之前&#xff0c;需要确定…...

BUUCTF jarvisoj_level0

小白垃圾做题笔记而已&#xff0c;不建议阅读。。。 这道题感觉主要就是64位程序ebp8 题目中给出了shellcode 我们直接将返回地址覆盖就好。 在main函数中调用了vulnerable_function()函数。 vulnerable函数是一个漏洞函数&#xff1a;(存在缓溢出)&#xff0c;我们只需要将…...

网络安全之入侵检测

目录 网络安全之入侵检测 入侵检测经典理论 经典检测模型 入侵检测作用与原理 意义 异常检测模型&#xff08;Anomaly Detection&#xff09; 误用检测模型&#xff08;Misuse Detection&#xff09; 经典特征案例 ​编辑自定义签名 ​编辑 签名检查过程 检测生命周期…...

元数据管理

1、业务元数据 描述 ”数据”背后的业务含义主题定义&#xff1a;每段 ETL、表背后的归属业务主题。业务描述&#xff1a;每段代码实现的具体业务逻辑。标准指标&#xff1a;类似于 BI 中的语义层、数仓中的一致性事实&#xff1b;将分析中的指标进行规范化。标准维度&#xf…...

C# WebService的开发以及客户端调用

目录 1、WebService简介 1.1 什么是XML&#xff1f; 1.2 什么是Soap&#xff1f; 1.3 什么是WSDL&#xff1f; 2、WebService与WebApi的区别与优缺点 2.1 WebService与WebApi的区别&#xff1a; 2.2 WebService的优缺点&#xff1a; 2.3 WebApi的优缺点&#xff1a; 3…...

有符号数和无符号数左移和右移

主要是有符号数的左移。 有的说不管符号位&#xff0c;直接左移&#xff0c;所以可以一会正数一会复数 https://bbs.csdn.net/topics/391075092 有的说符号位不动&#xff0c;其他来左移 不明白了。。。。 https://blog.csdn.net/hnjzsyjyj/article/details/119721014 https://…...

Netty小白入门教程

一、概述 1.1 概念 Netty是一个异步的基于事件驱动(即多路复用技术)的网络应用框架&#xff0c;用于快速开发可维护、高性能的网络服务器和客户端。 1.2 地位 Netty在Java网络应用框架中的地位就好比&#xff0c;Spring框架在JavaEE开发中的地位。 以下的框架都使用了Nett…...

【逻辑位移和算数位移】

<< 运算符 && >> 运算符 正数位移 当 x>>n 中 x 为正数时&#xff0c;会将x的所有位右移x位&#xff0c;同时左边高位补0 显而易见&#xff0c;运算结束后&#xff0c;值为1 。 可知右移n位&#xff0c;结果就是 x / 2^n&#xff1a;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 在边选择模式&#xff0c;选中一条边&#xff0c;右键&…...

Java与Python、Node.js在人工智能和区块链应用程序开发中的比较

背景 Java、Python和Node.js都是常用的编程语言,它们在不同领域都有广泛的应用。在人工智能和区块链应用程序开发中,这三种语言都具有各自的优势和劣势。 Java的优势 Java在企业级应用中应用广泛,这得益于其跨平台性、安全性和稳定性等特点。在人工智能和区块链应用程序开…...

【计算机是怎么跑起来的】基础:计算机三大原则

【计算机是怎么跑起来的】基础&#xff1a;计算机三大原则 计算机的三个根本性基础1.计算机是执行输入&#xff0c;运算&#xff0c;输出的机器输入&#xff0c;运算&#xff0c;输出 2. 软件是指令和数据的集合指令数据 3. 计算机的处理方式有时与人们的思维习惯不同对计算机来…...

NXP公司LPC21XX+PID实现稳定温度控制

本例使用的是LPC21XX系列芯片提供的PWM功能实现稳定的温度控制。首先我们获得当前环境温度之后&#xff0c;再用设定的温度与当前温度相减&#xff0c;通过PID算法计算出当前输出脉宽&#xff0c;并将其输出到L298N模块中&#xff0c;使加热丝发热&#xff0c;形成闭环&#xf…...

【CE实战-生化危机4重置版】实现角色瞬移、飞翔

▒ 目录 ▒ 🛫 导读需求开发环境1️⃣ CE扫描内存,定位坐标地址(加密后的地址)2️⃣ 硬件写入断点,定位真实坐标地址内存写入断点,定位到访问地址分析代码...

强烈建议互联网人转战实体和农业,去了就是降维打击!实体太缺人才了,老板也不缺钱!...

大环境不好&#xff0c;互联网人该何去何从&#xff1f; 一位网友提出了一个新思路&#xff1a;强烈建议互联网同学转战实体、农业这些行业。实体真的太缺人才了&#xff0c;目前大部分实体都留下70后、80后在继续奋斗。其实实体老板很多都不缺钱&#xff0c;经过多年积累&…...

如何将 github pages 迁移到 vercel 上托管

如何将 github pages 迁移到 vercel 上托管 前言 早期网站使用 github pages,后来迁移到 coding,最近又放到腾讯云网站静态托管,无论是 coding 的 cos 存储桶,还是静态网站托管 他们都是收费的,那有没有免费的托管商呢,既不影响网站的访问速度还免费,于是,找了一下,还真有,ve…...

2023五一数学建模竞赛(五一赛)选题建议

提示&#xff1a;DS C君认为的难度&#xff1a;C<A<B&#xff0c;开放度&#xff1a;B<A<C 。 A题&#xff1a;无人机定点投放问题 这道题是传统的物理类题目&#xff0c;基本每次建模竞赛都会有。由于这道题目并未给明数据&#xff0c;所以数据获取和搜集资料是…...

Packet Tracer - 配置 RIPv2

Packet Tracer - 配置 RIPv2 目标 第 1 部分&#xff1a;配置 RIPv2 第 2 部分&#xff1a;验证配置 拓扑图 背景信息 尽管在现代网络中极少使用 RIP&#xff0c;但是作为了解基本网络路由的基础则十分有用。 在本活动中&#xff0c;您将使用适当的网络语句和被动接口配置…...

Android类似微信聊天页面教程(Kotlin)四——数据本地化

前提条件 安装并配置好Android Studio Android Studio Electric Eel | 2022.1.1 Patch 2 Build #AI-221.6008.13.2211.9619390, built on February 17, 2023 Runtime version: 11.0.150-b2043.56-9505619 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 11 …...

C/C++基础知识

专栏&#xff1a;C/C 个人主页&#xff1a; C/C基础知识 前言C关键字(C98)命名空间命名空间的定义正常的命名空间的定义如何使用命名空间 命名空间可以嵌套同一个工程中允许存在多个相同名称的命名空间&#xff0c;编译器最后会合成同一个命名空间中(一个工程中的.h文件和test.…...