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

【ROS2】MOMO的鱼香ROS2(五)ROS2入门篇——ROS2接口与自定义

ROS2接口与自定义

  • 引言
  • 1 ROS2自带接口
    • 1.1 ROS2通用标准消息包
    • 1.2 ROS2传感器消息包
    • 1.3 ROS2几何相关消息包
  • 2 ROS2接口介绍
    • 2.1 常用CLI命令
    • 2.2 原始数据类型与包装类型
  • 3 自定义接口示例
    • 3.1 接口定义
    • 3.2 自定义接口RCLPY

引言

笔者跟着鱼香ROS的ROS2学习之旅
学习参考:
【ROS2机器人入门到实战】
笔者的学习目录

  1. MOMO的鱼香ROS2(一)ROS2入门篇——从Ubuntu操作系统开启
  2. MOMO的鱼香ROS2(二)ROS2入门篇——ROS2初体验
  3. MOMO的鱼香ROS2(三)ROS2入门篇——ROS2第一个节点
  4. MOMO的鱼香ROS2(四)ROS2入门篇——ROS2节点通信之话题与服务

1 ROS2自带接口

接口其实是一种规范

1.1 ROS2通用标准消息包

ros2 interface package std_msgs
std_msgs/msg/String
std_msgs/msg/ByteMultiArray
std_msgs/msg/UInt16
std_msgs/msg/UInt64
std_msgs/msg/UInt8
std_msgs/msg/Int64MultiArray
std_msgs/msg/UInt32MultiArray
std_msgs/msg/UInt16MultiArray
std_msgs/msg/Float32MultiArray
std_msgs/msg/MultiArrayDimension
std_msgs/msg/Float64MultiArray
std_msgs/msg/Int8
std_msgs/msg/Byte
std_msgs/msg/Bool
std_msgs/msg/Int32
std_msgs/msg/Int16
std_msgs/msg/Float64
std_msgs/msg/Header
std_msgs/msg/Char
std_msgs/msg/Int64
std_msgs/msg/MultiArrayLayout
std_msgs/msg/Int16MultiArray
std_msgs/msg/Float32
std_msgs/msg/UInt64MultiArray
std_msgs/msg/UInt8MultiArray
std_msgs/msg/Int8MultiArray
std_msgs/msg/Int32MultiArray
std_msgs/msg/UInt32
std_msgs/msg/ColorRGBA
std_msgs/msg/Empty

以下是一些 std_msgs 中的常见消息类型:

Header: 包含 ROS 消息的标准头部信息,如时间戳和坐标系。

uint32 seq
time stamp
string frame_id

String: 代表字符串。

string data

Bool: 代表布尔值。

bool data

Int8, Int16, Int32, Int64: 代表有符号整数,分别为 8 位、16 位、32 位和 64 位。

int8 data
int16 data
int32 data
int64 data

UInt8, UInt16, UInt32, UInt64: 代表无符号整数,分别为 8 位、16 位、32 位和 64 位。

uint8 data
uint16 data
uint32 data
uint64 data

Float32, Float64: 代表单精度和双精度浮点数。

float32 data
float64 data

这些消息类型可以广泛应用于 ROS 中的不同节点,用于传递基本的数据信息。例如,一个节点可以发布一个包含测量值的 Float32 消息,而另一个节点可以订阅这个消息以获取测量值。

1.2 ROS2传感器消息包

ros2 interface package sensor_msgs
sensor_msgs/msg/PointCloud
sensor_msgs/msg/CompressedImage
sensor_msgs/msg/Image
sensor_msgs/msg/PointField
sensor_msgs/msg/LaserEcho
sensor_msgs/msg/BatteryState
sensor_msgs/msg/MultiDOFJointState
sensor_msgs/msg/NavSatFix
sensor_msgs/msg/Joy
sensor_msgs/msg/MultiEchoLaserScan
sensor_msgs/msg/LaserScan
sensor_msgs/msg/JoyFeedbackArray
sensor_msgs/msg/MagneticField
sensor_msgs/msg/ChannelFloat32
sensor_msgs/msg/RegionOfInterest
sensor_msgs/msg/NavSatStatus
sensor_msgs/msg/Range
sensor_msgs/msg/Illuminance
sensor_msgs/msg/RelativeHumidity
sensor_msgs/msg/Temperature
sensor_msgs/msg/FluidPressure
sensor_msgs/msg/JointState
sensor_msgs/srv/SetCameraInfo
sensor_msgs/msg/Imu
sensor_msgs/msg/CameraInfo
sensor_msgs/msg/JoyFeedback
sensor_msgs/msg/TimeReference
sensor_msgs/msg/PointCloud2

以下是 sensor_msgs 中的一些常见消息类型:

Image: 用于传递图像数据,包括图像的像素数据、编码格式、时间戳等。

Header header
uint32 height
uint32 width
string encoding
uint8 is_bigendian
uint32 step
uint8[] data

CameraInfo: 包含相机的信息,如相机矩阵、畸变参数等。

Header header
uint32 height
uint32 width
string distortion_model
float64[] D
float64[] K
float64[] R
float64[] P
uint32[] binning_x
uint32[] binning_y
sensor_msgs/RegionOfInterest roi

PointCloud2: 用于传递点云数据,包括点的坐标、颜色等信息。

Header header
bool is_dense
string[] fields
uint8 INT8 = 1
uint8 UINT8 = 2
uint8 INT16 = 3
uint8 UINT16 = 4
uint8 INT32 = 5
uint8 UINT32 = 6
uint8 FLOAT32 = 7
uint8 FLOAT64 = 8
uint8 point_step
uint8[] data
uint32 row_step
uint32 width
uint32 height
sensor_msgs/PointField[] fields
bool is_bigendian
uint32 point_step
uint32 row_step
uint32 data_length
uint8[] data

LaserScan: 用于传递激光扫描数据。

Header header
float32 angle_min
float32 angle_max
float32 angle_increment
float32 time_increment
float32 scan_time
float32 range_min
float32 range_max
float32[] ranges
float32[] intensities

IMU:惯性测量单元的方向、角速度和线性加速度

Header header
geometry_msgs/Quaternion orientation
float64[9] orientation_covariance
geometry_msgs/Vector3 angular_velocity
float64[9] angular_velocity_covariance
geometry_msgs/Vector3 linear_acceleration
float64[9] linear_acceleration_covariance

header: 用于包含时间戳等信息的标准 ROS 消息头。
orientation: 包含四元数表示的方向。
orientation_covariance: 一个长度为 9 的数组,表示方向协方差矩阵。
angular_velocity: 包含角速度信息的三维向量。
angular_velocity_covariance: 一个长度为 9 的数组,表示角速度协方差矩阵。
linear_acceleration: 包含线性加速度信息的三维向量。
linear_acceleration_covariance: 一个长度为 9 的数组,表示线性加速度协方差矩阵。

这些消息类型可以用于在 ROS 系统中传递从各种传感器获得的数据。节点可以发布这些消息,而其他节点则可以订阅它们以获取传感器数据。

1.3 ROS2几何相关消息包

ros2 interface package geometry_msgs
geometry_msgs/msg/Quaternion
geometry_msgs/msg/WrenchStamped
geometry_msgs/msg/Point32
geometry_msgs/msg/Accel
geometry_msgs/msg/Pose
geometry_msgs/msg/Vector3
geometry_msgs/msg/PoseArray
geometry_msgs/msg/PoseWithCovarianceStamped
geometry_msgs/msg/Polygon
geometry_msgs/msg/AccelWithCovarianceStamped
geometry_msgs/msg/AccelStamped
geometry_msgs/msg/PoseWithCovariance
geometry_msgs/msg/TransformStamped
geometry_msgs/msg/PointStamped
geometry_msgs/msg/PolygonStamped
geometry_msgs/msg/Vector3Stamped
geometry_msgs/msg/Inertia
geometry_msgs/msg/Wrench
geometry_msgs/msg/AccelWithCovariance
geometry_msgs/msg/Pose2D
geometry_msgs/msg/InertiaStamped
geometry_msgs/msg/PoseStamped
geometry_msgs/msg/QuaternionStamped
geometry_msgs/msg/Transform
geometry_msgs/msg/Twist
geometry_msgs/msg/TwistStamped
geometry_msgs/msg/TwistWithCovarianceStamped
geometry_msgs/msg/TwistWithCovariance
geometry_msgs/msg/Point

以下是一些常见的 geometry_msgs 中的消息类型:

Point: 代表三维空间中的点。

float64 x
float64 y
float64 z

Quaternion: 代表四元数,通常用于表示旋转。

float64 x
float64 y
float64 z
float64 w

Pose: 代表包含位置和方向的位姿。

Point position
Quaternion orientation

Transform: 代表变换矩阵。

Vector3 translation
Quaternion rotation

这些消息类型可以用于 ROS 中的各种应用,例如机器人运动、感知、导航等。通过使用这些消息,ROS 中的不同节点可以相互通信,共享几何信息,从而实现协同工作。

2 ROS2接口介绍

2.1 常用CLI命令

查看接口列表

ros2 interface list

查看某一个接口详细的内容

ros2 interface show std_msgs/msg/String

2.2 原始数据类型与包装类型

基本数据类型,每一个都可以在后面加上[]将其变成数组形式(从一个变成多个)

bool
byte
char
float32, float64
int8, uint8
int16, uint16
int32, uint32
int64, uint64
string

对数据类型进行剥洋葱

ros2 interface show sensor_msgs/msg/Image

终端显示如下:

# This message contains an uncompressed image
# (0, 0) is at top-left corner of imagestd_msgs/Header header # Header timestamp should be acquisition time of image
uint32 height                # image height, that is, number of rows
uint32 width                 # image width, that is, number of columns
string encoding       # Encoding of pixels -- channel meaning, ordering, size                     
uint8 is_bigendian    # is this data bigendian?
uint32 step           # Full row length in bytes
uint8[] data          # actual matrix data, size is (step * rows)

对非基类的数据数据类型std_msgs/Header header进行剥洋葱

ros2 interface show std_msgs/msg/Header

终端显示如下:

# Two-integer timestamp that is expressed as seconds and nanoseconds.
builtin_interfaces/Time stamp
# Transform frame with which this data is associated.
string frame_id

对非基类的数据数据类型builtin_interfaces/Time进行剥洋葱

ros2 interface show builtin_interfaces/msg/Time

终端显示如下:

int32 sec
uint32 nanosec

最后只剩下基类了

3 自定义接口示例

说明:这部分笔者主要是将鱼香ROS2的示例成功跑通,具体流程如下:
示例链接:

【ROS2机器人入门到实战】ROS2接口介绍
【ROS2机器人入门到实战】自定义接口RCLPY实战

3.1 接口定义

1.创建接口功能包

ros2 pkg create alian_ros2_interfaces --build-type ament_cmake --dependencies rosidl_default_generators geometry_msgs

注意功能包类型必须为:ament_cmake

依赖rosidl_default_generators:用于生成ROS中的消息、服务和行为的代码。ROS中的消息和服务是通过IDL(接口定义语言)描述的,而rosidl_default_generators
则负责将这些IDL文件转换为各种编程语言的实际代码。

具体来说,rosidl_default_generators 支持将ROS接口定义语言(ROS
IDL)文件转换为C、C++等语言的源代码。这包括生成用于发布/订阅消息、提供/调用服务以及执行行为所需的代码。

2.编写接口脚本文件
接着创建文件夹(msg、srv)和文件(RobotPose.msg、RobotStatus.msg、MoveRobot.srv),如下图。

.
├── CMakeLists.txt
├── msg
│   ├── RobotPose.msg
│   └── RobotStatus.msg
├── package.xml
└── srv└── MoveRobot.srv
2 directories, 5 files

RobotPose.msg

uint32 STATUS_MOVEING = 1
uint32 STATUS_STOP = 2
uint32  status
geometry_msgs/Pose pose

RobotStatus.msg

uint32 STATUS_MOVEING = 1
uint32 STATUS_STOP = 1
uint32  status
float32 pose

MoveRobot.srv

# 前进后退的距离
float32 distance
---
# 当前的位置
float32 pose

3.设置配置文件
CMakeLists.txt

find_package(rosidl_default_generators REQUIRED)
find_package(geometry_msgs REQUIRED)
# 添加下面的内容
rosidl_generate_interfaces(${PROJECT_NAME}"msg/RobotPose.msg""msg/RobotStatus.msg""srv/MoveRobot.srv"DEPENDENCIES geometry_msgs
)

package.xml

<buildtool_depend>ament_cmake</buildtool_depend><depend>rosidl_default_generators</depend><depend>geometry_msgs</depend><member_of_group>rosidl_interface_packages</member_of_group> #添加这一行<test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend>

4.编译接口功能包

colcon build --packages-select example_ros2_interfaces

3.2 自定义接口RCLPY

1.创建功能包和节点

cd colcon_ws/  # 自定义的工作空间
ros2 pkg create example_interfaces_rclpy --build-type ament_python --dependencies rclpy example_ros2_interfaces --destination-directory src --node-name example_interfaces_robot_02
touch src/example_interfaces_rclpy/example_interfaces_rclpy/example_interfaces_control_02.py

2. 编写节点脚本
example_interfaces_robot_02.py

#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from example_ros2_interfaces.msg import RobotStatus
import math
from time import sleep
from example_ros2_interfaces.srv import MoveRobotclass Robot():def __init__(self) -> None:self.current_pose_ = 0.0self.target_pose_ = 0.0self.status_ = RobotStatus.STATUS_STOPdef get_status(self):return self.status_def get_current_pose(self):return self.current_pose_def move_distance(self,distance):self.status_ = RobotStatus.STATUS_MOVEING # 更新状态为移动、self.target_pose_ += distance # 更新目标位置while math.fabs(self.target_pose_ - self.current_pose_) > 0.01:step = distance / math.fabs(distance) * math.fabs(self.target_pose_ - self.current_pose_) * 0.1 # 计算一步移动距离self.current_pose_  += step # 移动一步print(f"移动了:{step}当前位置:{self.current_pose_}")sleep(0.5) #休息0.5sself.status_ = RobotStatus.STATUS_STOP # 更新状态为停止return self.current_pose_      class ExampleInterfacesRobot02(Node):def __init__(self,name):super().__init__(name)self.get_logger().info("节点已启动:%s!" % name)self.robot = Robot()self.move_robot_server_ = self.create_service(MoveRobot,"move_robot", self.handle_move_robot) self.robot_status_publisher_ = self.create_publisher(RobotStatus,"robot_status", 10) self.publisher_timer_ = self.create_timer(0.5, self.publisher_timer_callback)def publisher_timer_callback(self):"""定时器回调发布数据函数"""msg = RobotStatus() #构造消息msg.status = self.robot.get_status()msg.pose = self.robot.get_current_pose()self.robot_status_publisher_.publish(msg) # 发布消息self.get_logger().info(f'发布了当前的状态:{msg.status} 位置:{msg.pose}')def handle_move_robot(self,request, response):self.robot.move_distance(request.distance)response.pose = self.robot.get_current_pose()return responsedef main(args=None):rclpy.init(args=args) # 初始化rclpynode = ExampleInterfacesRobot02("example_interfaces_robot_02")  # 新建一个节点rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)rclpy.shutdown() # 关闭rclpy

example_interfaces_control_02.py

#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from example_ros2_interfaces.msg import RobotStatus
from example_ros2_interfaces.srv import MoveRobotclass ExampleInterfacesControl02(Node):def __init__(self,name):super().__init__(name)self.get_logger().info("节点已启动:%s!" % name)self.client_ = self.create_client(MoveRobot,"move_robot") self.robot_status_subscribe_ = self.create_subscription(RobotStatus,"robot_status",self.robot_status_callback,10)def robot_status_callback(self,msg):self.get_logger().info(f"收到状态数据位置:{msg.pose} 状态:{msg.status}")def move_result_callback_(self, result_future):response = result_future.result()self.get_logger().info(f"收到返回结果:{response.pose}")def move_robot(self, distance):while rclpy.ok() and self.client_.wait_for_service(1)==False:self.get_logger().info(f"等待服务端上线....")request = MoveRobot.Request()request.distance = distanceself.get_logger().info(f"请求服务让机器人移动{distance}")self.client_.call_async(request).add_done_callback(self.move_result_callback_)def main(args=None):rclpy.init(args=args) # 初始化rclpynode = ExampleInterfacesControl02("example_interfaces_control_02")  # 新建一个节点node.move_robot(5.0) #移动5米rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)rclpy.shutdown() # 关闭rclpy

3.修改配置文件setup.py

entry_points={'console_scripts': ['example_interfaces_control_02 = example_interfaces_rclpy.example_interfaces_control_02:main','example_interfaces_robot_02 = example_interfaces_rclpy.example_interfaces_robot_02:main'],},

4.编译功能包+运行测试

# 新终端
colcon build --packages-up-to example_interfaces_rclpy
source install/setup.bash
ros2 run example_interfaces_rclpy example_interfaces_robot_02
# 新终端
source install/setup.bash
ros2 run example_interfaces_rclpy example_interfaces_control_02

在这里插入图片描述
上图则说明自定义接口测试成功!!!

相关文章:

【ROS2】MOMO的鱼香ROS2(五)ROS2入门篇——ROS2接口与自定义

ROS2接口与自定义 引言1 ROS2自带接口1.1 ROS2通用标准消息包1.2 ROS2传感器消息包1.3 ROS2几何相关消息包 2 ROS2接口介绍2.1 常用CLI命令2.2 原始数据类型与包装类型 3 自定义接口示例3.1 接口定义3.2 自定义接口RCLPY 引言 笔者跟着鱼香ROS的ROS2学习之旅 学习参考&#xf…...

python c语言 代码动态检查,python c语言语法分析

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python c语言 代码动态检查&#xff0c;python c语言语法分析&#xff0c;今天让我们一起来看看吧&#xff01; Source code download: 本文相关源码 初学编程&#xff0c;应该学习哪一门编程语言&#xff0c;有不少人感…...

C++ DAY6 作业

1.用模板类写顺序表 #include <iostream>using namespace std;#define MAXSIZE 10 template <typename T> class Arr {T *data NULL;int len 0; public://构造函数Arr():data(new T){}Arr(T a,int len):data(new T(a)),len(len){}//析构函数~Arr(){delete data;}…...

华为服务器安装银河麒麟V10操作系统(IBMC安装)

iBMC是华为面向服务器全生命周期的服务器嵌入式管理系统。提供硬件状态监控、部署、节能、安全等系列管理工具&#xff0c;标准化接口构建服务器管理更加完善的生态系统。 服务器BMC IP&#xff1a;192.168.2.100 一、准备工作 1、确保本机和服务器BMC管理口在同一网络 2、银…...

macos下php 5.6 7.0 7.4 8.0 8.3 8.4全版本PHP开发环境安装方法

在macos中如果使用brew 官方默认的core tap 只可以安装官方最新的稳定版PHP, 如果想要安装 php 5.6 或者 php 8.4版本的PHP就需要使用第三方的tap , 这里分享一个比较全面的brew tap shivammathur/php 这个tap里面包含了从php5.6到最新版php8.4的所有可用最新版本PHP, 而且是同…...

Chatgpt为什么像打字机逐字输出?磨洋工,防止数据库被盗

在他后台的数据库里肯定是完整的结果,每次只给你一个单词一个单词的输送,一方面是为了耍酷&#xff0c;好像真的是一个人在那给你说话&#xff0c;另一方面也是防止第三方的抄袭者最快速度盗取采集偷走数据库。防止他们的服务器崩溃&#xff0c;可以多收几个月会员费。 都说搞…...

ubuntu 卸载桌面

要卸载Ubuntu上的桌面环境&#xff0c;您可以按照以下步骤进行操作&#xff1a; 登录到您的Ubuntu系统&#xff0c;并打开终端。 确认您当前正在使用的桌面环境。可以运行以下命令来查看已安装的桌面环境&#xff1a; s /usr/share/xsessions/ 根据您当前使用的桌面环境&…...

Linux文件fd剖析

学习之前&#xff0c;首先要认识什么是文件&#xff1f; 空文件也是要在内存中占据空间的&#xff0c;因为它还有属性数据。文件 属性 内容文件操作 对内容 对属性 或者对内容和属性的操作标定一个文件的时候&#xff0c;必须使用&#xff1a;路径文件名&#xff0c;文件具…...

VMWARE ESXi存储多路径策略修改

一、存储多路径介绍 VMware 路径选择插件 (PSP) 负责选择 I/O 请求的物理路径。插件是 VMware NMP 的子模块。NMP 根据设备类型为每个逻辑设备分配默认 PSP。每个PSP 启用并执行相应的路径选择策略。支持的路径选项有以下3种&#xff1a; VMW_PSP_MRU - 最近使用 它将选择在系…...

结构体详解

结构体&#xff1a; 一系列具有相同类型或不同类型的数据构成的数据集合&#xff0c;也叫结构 结构体可以用来封装一些属性来组成新的类型。 结构体的大小&#xff1a; 结构体的大小不是结构体元素单纯相加。内存对齐&#xff08;若计算机使用32位字长的cpu&#xff0c;对32位的…...

前端开发个人简历范本(2024最新版-附模板)

前端开发工程师个人简历范本> 年龄 25岁 性别 男 毕业院校 XX大学 张三 学历 邮箱 leeywai-tools.cn 本科 专业 计算机科学与技术 个人梗概 拥有扎实的前端开发技能和丰富的实践经验 善于与团队合作&#xff0c;适应能力强&#xff0c;能够快速融入团队并贡献自…...

# 编程语言简史

编程语言简史 文章目录 编程语言简史1. python简史1. python发展历程 2. python适用领域1. 优点&#xff1a;2. 缺点&#xff1a;3. 应用领域&#xff1a; 2. java简史1. java发展历程2. java适用领域 3. C简史1. C发展历程2. C使用领域 4. C简史1. C发展历程2. C适用领域 5. C…...

SpringMVC学习与开发(三)

注&#xff1a;此为笔者学习狂神说SpringMVC的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! 10、ssm整合 问了一下ChatGPT SSM 是一个基于 Java 的开发框架整合&#xff0c;由 Spring、…...

JAVA对象、List、Map和JSON之间的相互转换

JAVA对象、List、Map和JSON之间的相互转换 1.Java中对象和json互转2.Java中list和json互转3.Java中map和json互转 1.Java中对象和json互转 Object obj new Object(); String objJson JSONObject.toJSONString(obj);//java对象转json Object newObj JSONObject.parseObject(…...

图像分割-漫水填充法 floodFill

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 本文的C#版本请访问&#xff1a;图像分割-漫水填充法 floodFill (C#&#xff09;-CSDN博客 FloodFill方法是一种图像处理算法&#…...

Python open函数详解:打开指定文件与 readline和readlines函数:按行读取文件

Python open函数详解&#xff1a;打开指定文件 掌握了各种操作目录字符串或目录的函数之后&#xff0c;接下来可以准备读写文件了。在进行文件读写之前&#xff0c;首先要打开文件。 Python 提供了一个内置的 open() 函数&#xff0c;该函数用于打开指定文件。 open() 函数的…...

Vue 生命周期有哪些?作用是什么?

什么是vue的生命周期 Vue 实例从开始创建、初始化数据、编译模板、挂载Dom和渲染、更新和渲染、卸载等一系列过程&#xff0c;这是 Vue 的生命周期 vue的生命周期的八个钩子函数 beforeCreat() 创建前 在new一个vue实例后&#xff0c;只有一些默认的生命周期钩子和默认事件&a…...

《Vue3 前端构建工具》 Vue-cli 与 Vite 创建项目的插件和配置对比

前言 2024 年 啦&#xff01;Vue2 也于 2023.12.31 寿终正寝 &#xff01; 然而我的 Vue3 升级一再拖延&#xff08;惭愧不已&#xff09;~ 赶起来吧~ 今天用 vue-cli 和 vite 分别创建了 Vue3 项目&#xff0c;具体实现步骤见如下两篇。 《基于 Vue Cli4.x Vue3 TS styl…...

springboot(ssm中山社区医疗综合服务平台 医疗管理系统 Java系统

springboot(ssm中山社区医疗综合服务平台 医疗管理系统 Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#x…...

Qt编写的exe程序上添加程序信息

1、qtcreator编写 在pro文件中添加如下信息 # 版本信息 VERSION 4.0.2.666# 图标 RC_ICONS Images/MyApp.ico# 公司名称 QMAKE_TARGET_COMPANY "Digia"# 产品名称 QMAKE_TARGET_PRODUCT "Qt Creator"# 文件说明 QMAKE_TARGET_DESCRIPTION "Qt …...

(一)CarPlay集成开发之概述与环境篇

系列文章目录 第一章 CarPlay集成开发之概述与环境篇 文章目录 系列文章目录概述开发环境依赖项总结 概述 CarPlay是由苹果公司开发的一款集成在iOS系统中&#xff0c;用于运行在已完成对接该系统的汽车中控台&#xff0c;仪表盘上的车载系统&#xff0c;该系统通过USB或者WI…...

js文件上传 分片上传/断点续传/极速秒传

(极速秒传)利用md5判断上传的文件是否存在 MD5信息摘要算法&#xff0c;一种被广泛使用的密码散列函数&#xff0c;可以产生出一个128位&#xff08;16字节&#xff09;的散列值&#xff08;hash value&#xff09;&#xff0c;用于确保信息传输完整一致。 每一个文件都会生成…...

mysql 通过 binglog 恢复数据

mysql 通过 binglog 恢复数据 测试数据库版本: 8.0.5 查看当前是否开启 进入数据库,查看当前是否开启了 binglog 的相关设置: mysql> show variables like log_bin%; -------------------------------------------------------------- | Variable_name …...

【REST2SQL】01RDB关系型数据库REST初设计

0 概念 REST2SQL实现连接数据库&#xff0c;数据库的表或视图即可提供REST的GET\POST\PUT\DELETE请求&#xff0c;SQL可执行SQLECT\INSERT\UPDATE\DELETE语句。 0.1 RDB Relational Database 即关系型数据库&#xff08;简称 RDB&#xff09;是一种以关系&#xff08;即表格…...

图像识别原理

图像识别是计算机视觉领域中的一个重要任务&#xff0c;其目标是使计算机系统能够理解和解释图像中的信息。以下是图像识别的基本原理&#xff1a; 1. 数据采集&#xff1a;首先&#xff0c;需要获取图像数据。这可以通过摄像头、传感器、扫描仪等设备来实现。图像可以是静态的…...

共识算法介绍

文章目录 共识算法Paxos 算法三种角色一致性提交算法prepare 阶段accept 阶段commit 阶段 CAP 定理BASE 理论Zookeeper 算法实现三类角色三个数据三种模式四种状态消息广播算法Leader选举算法 共识算法 Paxos 算法 Paxos 算法是莱斯利兰伯特(Leslie Lamport)1990 年提出的一种…...

Gen-AI 的知识图和分析(无需图数据库)

如今&#xff0c;图表比以往任何时候都更加相关和有用。由于目前正在发生的人工智能革命&#xff0c;工程师们正在考虑围绕 Gen-AI 的机会&#xff0c;利用具有动态提示、数据基础和屏蔽功能的开放 Gen-AI 解决方案&#xff0c;这进一步促使他们思考知识图谱等有效的解决方案。…...

flutter 安卓使用高德插件黑屏

地址 https://lbs.amap.com/api/android-sdk/guide/create-project/android-studio-create-project 下面介绍的方式是Native配置 sdk&#xff0c;也就是需要手动下载到本地在引入的方式 1、添加 jar 文件&#xff1a; 将下载的地图 SDK 的 jar包复制到工程&#xff08;此处截…...

Java:表单生成excel文档 poi 通用

在用java 写数据库应用的时候, 通常会生成各种报表&#xff0c;而这些报表可能会被导出为各种格式的文件&#xff0c;比如Excel文档&#xff0c;pdf 文档等等. 今天先做了一个生成Excel 文档的例子&#xff0c;主要解决以下问题&#xff1a; 1. 生成 Excel 文档. 2. 自动对生成…...

使用Apache Commons SCXML实现状态机管理

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们程序员在开发过程中&#xff0c;经常会遇到需要管理不同状态和状态之间转换的场景。比如&#xff0c;一个在线购物的订单&#xff0c;它可能有“新建订单”、“已支付”、“配送中”、“已完成”等状态。在这…...

专业的模板建站企业/seo推广公司排名

Bootstrap资源: 兼容性不错的简洁BuiBootstrap后台管理系统模板 [url]http://www.js-css.cn/divcss/admin/bui-bootstrap[/url], 下载 [url]http://www.js-css.cn/a/css/template/admin/2013/1108/1023.html[/url] 值得收藏&#xff01;4个Bootstrap3开发的后台管理模板 [url]h…...

阿里云部署一个自己做的网站/菏泽seo

http://www.bootcss.com/p/chart.js/docs/...

免费开发网站大全/it培训机构有哪些

一、新建项目 二、运行 npm install npm run start 三、多环境切换 踩坑后总结的方法。。 首先看到package.json 前面的参数都是命令。比如“start”的意思就是npm run start&#xff0c;“build”的意思就是npm run build 往里面传的参数中&#xff0c;--config是必须的&…...

在西安市建设工程交易中心网站上/竞价排名是什么意思

date命令 用于显示当前的系统时间或设置系统时间。date [选项] [日期格式]date命令的参数选项及说明 OPTION参数选项-d 时间字符串 显示指定字符串所描述的时间&#xff0c;而非当前时间 -f 时间文件 从日期文件中按行读入时间描述 -r 文件 显示指定文件的最后…...

深一网站建设/十大免费无代码开发软件

早晨起床时间&#xff1a;12:30 晚上休息时间&#xff1a;0:28 今日总结&#xff1a;休息中。...

做网站怎么加水平线/网络推广公司排名

金三银四找工作旺季&#xff0c;又来给大家送干货了。关于Python后端工程师你了解多少&#xff0c;下面告诉你如何面试Python后端工程师&#xff1f; 文章目录一、Python后端技术栈1.1 Python语言基础1.2 Python框架1.3 数据库1.4 Web1.5 系统二、关于面试自我介绍2.1 面试流程…...