ROS getting started

news2024/11/17 20:43:24

文章目录

  • 前言
  • 一、认识ROS提供的命令行工具
    • nodes
    • topics
    • services
    • parameters
    • actions
    • rqt_console, rqt_graph
    • 批量启动多个节点
    • recorde and play
    • c++基础pub-sub
  • 1.5 ROS2和fastdds
    • 1 改变订阅模式
    • 2 xml配置
    • 3 指定xml位置
    • 4 talker/listener通过发现服务器发送topic
    • 5 ros2 检视
    • 6 远程fastdds程序与ros节点通讯
  • 二、安装
  • 三、catkin编译系统
    • catkin工作空间
  • 四、colcon构建系统
  • 五、c++发布ROS包
  • - 参数
  • - 源码编译安装需要的ros humble的模块 [从ament_cmake开始]
    • 1. Python ament_package 模块安装
    • 2. ament_cmake安装
    • 根据需要进行安装
  • 参考


前言

ROS在Ubuntu的基础上实现了一套机器人操作系统框架。ROS并非是像Linux那样的操作系统,它只是连接了操作系统和你开发的ROS应用程序,所以它也算是一个中间件,基于ROS的应用程序之间建立起了沟通的桥梁,所以也是运行在Linux上的运行时环境,在这个环境上,机器人的感知、决策、控制算法可以更好的组织和运行。


一、认识ROS提供的命令行工具

启动一个节点,ros中一个节点就是一个可执行文件
ros2 run <package_name> <executable_name>

nodes

实际就是一个进程
ros2 node list
ros2 node info <node_name> # 查看节点的通讯方式pub-sub, cli-serv, action, 及其数据类型

topics

DDS中的topic

每种topic都有ROS内置的topic_type,这里(https://docs.ros.org/en/humble/Concepts/Basic/About-Interfaces.html)说明了如何定义ROS支持的数据类型。

ros2 topic list
ros2 topic list -t  # 查看所有topic及其类型
ros2 topic echo <topic_name>  # 打印topic数据
ros2 topic info <topic_name>  # 显示topic的type,pub num and sub num
ros2 interface show <msg_type> # 显示接口信息
ros2 topic pub <topic_name> <msg_type> '<args>'
ros2 topic hz <topic_name>  # 频率

services

ROS2 的 client-serve 通讯模式,类似HTTP/TCP/IP一样

ros2 service list
ros2 service list -t
ros2 service type <service_name>  # node info <node_name>看的更全
ros2 service find <type_name>     # 查看使用该type的name
ros2 interface show <type_name>   # 显示接口信息
ros2 service call <service_name> <service_type> <arguments> # 向某个服务发送请求

parameters

节点配置信息,可以是环境变量

ros2 param list
ros2 param get <node_name> <parameter_name> 
ros2 param set <node_name> <parameter_name> <value>
ros2 param dump <node_name>                   # 转存节点配置文件
ros2 param load <node_name> <parameter_file>  # 加载配置文件
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>  #启动时加载指定的配置文件(inclue read-only)

actions

Actions是ROS2中的通讯类型之一,用于长时间运行的任务。它们由三部分组成:目标、反馈和结果。
Actions建立在topics和services之上。它们的功能与服务类似,只是可以取消操作。它们还提供稳定的反馈,而不是返回单个相应的服务。
Actions使用client-server模型,“action client”节点将目标发送到“action serve”节点,该节点确认目标并返回反馈流和结果。
在这里插入图片描述
【客户端的第二次请求似乎有些多余?示例代码看上去像是:client发送请求,serv返回相应,serv返回feedback,最后serv返回result】

ros2 action list
rso2 action list -t
ros2 action info <action_name>
ros2 interface show <action_type>
ros2 action send_goal <action_name> <action_type> <values>
ros2 action send_goal /turtle1/rotate_absolute  trutlesim/action/RotateAbsolute "{theta: -1.5}" --feedback

rqt_console, rqt_graph

rqt_console可看日志
rqt_graph可看所有topic

批量启动多个节点

ros2 launch turtlesim multisim.launch.py

recorde and play

rosbag录制与回放

ros2 bag record <topic_name>
ros2 bag record -o <user_dir> <topic1> [topic2 topic3]
ros2 bag record -a  # 记录所有topic
ros2 bag info <bag_file_name>
ros2 bag play <bag_file_name>

c++基础pub-sub

  1. 利用ros提供的工具在~/ros2_ws目录下创建package
    cd ~/ro2_ws/src && ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_pub_sub --dependencies rclcpp [example_interfaces]
  2. 在生成的src目录下添加源文件publisher.cpp和subscriber.cpp
    https://raw.githubusercontent.com/ros2/examples/humble/rclcpp/topics/minimal_publisher/member_function.cpp
    https://raw.githubusercontent.com/ros2/examples/humble/rclcpp/topics/minimal_subscriber/member_function.cpp
  3. 修改CMakeLists.txt文件和package.xml文件
    由于在第1步指明了rclcpp依赖所以cma和xml文件应该已经有了该依赖,只需将其他的依赖添加进去即可
    find_package(std_msgs REQUIRED)
    
    add_executable(publisher src/publisher.cpp)
    ament_target_dependencies(publisher rclcpp std_msgs)
    add_executable(subscriber src/subscriber.cpp)
    ament_target_dependencies(subscriber rclcpp std_msgs)
    
    install(TARGETS
      subscriber
      publisher
      DESTINATION lib/${PROJECT_NAME})
    
    <depend>std_msgs</depend>
    
  4. colcon编译,安装,运行
    cd ~/ro2_ws
    colcon build
    source install/setup.bash
    ros2 run cpp_pub_sub subscriber &
    ros2 run cpp_pub_sub publisher
    

1.5 ROS2和fastdds

https://fast-dds.docs.eprosima.com/en/stable/fastdds/ros2/ros2.html

ros2与Fast-DDS之间的接口:https://github.com/ros2/rmw_fastrtps。 ROS 2只允许配置部分QoS策略,而rmw_fastrtps提供了扩展的配置功能,以充分利用Fast DDS中的功能。

设置环境变量

export RMW_IMPLEMENTATION=rmw_fastrtps_cpp

1 改变订阅模式

ROS2 的rmw_fastrtps默认使用异步发布方式。通过环境变量RMW_FASTRTPS_PUBLICATION_MODE改变模式

  • ASYNCHRONOUS: 异步发布模式。当发布者调用write操作时,数据先拷贝到队列,后台线程(异步线程)收到队列添加通知。并且在实际发送数据之前将线程的控制权返回给用户。后台线程负责使用队列并将数据发送给每个匹配的读取器。
  • SYNCHRONOUS:同步订阅模式,数据由用户线程直接发送,这意味着在写操作期间发生的任何阻塞调用都会阻塞用户线程,从而阻止应用程序继续其操作。值得注意的是,这种模式通常会在较低的延迟下产生更高的吞吐率,因为线程之间既没有通知也没有上下文切换。
  • AUTO: 让Fast DDS选择发布模式。这意味着使用XML文件中设置的发布模式,或者使用Fast DDS中设置的默认值(FastDDS默认为SYNCHRONOUS)

除了ROS 2的QOS策略外,rmw_fastrtps还提供了两个额外的配置项:

rmw_fastrtps提供的额外配置参数描述ROS2 中的默认值
MemoryManagementPolicyFast DDS为发布者和订阅者的历史记录预分配的内存。当这些历史记录填满时,会进行重新分配以保留更多内存PREALLOCATED_WITH_REALLOC_MEMORY_MODE
PublishModeQosPolicy数据是异步发送还是同步发送ASYNCHRONOUS_PUBLISH_MODE

2 xml配置

在ROS2应用中使用FastDDS的某种特性,XML配置文件能够提供广泛的QOS策略配置支持。

  • 如果rmw_QoS_profile_t(c++ object)中的任何QoS设置为*_SYSTEM_DEFAULT(c++value)以外的值,则XML中的相应值将被忽略。
  • 默认情况下,rmw_fastrtps会覆盖MemoryManagementPolicy和PublishModeQosPolicy的值。这意味着XML中为这两个参数配置的值将被忽略。这两个值会默认重写为:PREALLOCATED_WITH_READLLOC_MEMORY_MODE和ASYNCRONOS_PUBLISH_MODE。
  • 通过将环境变量RMW_FASTPS_USE_QOS_FROM_XML设置为1(其默认值为0),可以避免重写MemoryManagementPolicy和PublishModeQosPolicy。这将使rmw_fastrtps使用XML中为MemoryManagementPolicy和PublishModeQosPolicy定义的值。请记住,在XML中设置此环境变量而不设置这些策略会导致使用Fast DDS中的默认值。这些值与前面提到的rmw_fastrtps默认值不同(请参阅MemoryManagementPolicy和PublishModeQosPolicy)。
  • 设置RMW_FASTRTPS_USE_QOS_FROM_XML(环境变量)生效会覆盖任何对RMW_FASTRTPS_PUBLICATION_MODE的任何配置,使用xml的配置,如果xml每配置该项,则使用fastDDS的默认值
  1. fastdds默认值
  2. rmw_fastrtps默认值
  3. 环境变量
  4. xml
  5. RMW_FASTRTPS_USE_QOS_FROM_XML=<0/1>

真的乱
在这里插入图片描述

3 指定xml位置

使用环境变量

export FASTRTPS_DEFAULT_PROFILES_FILE=<path_to_xml_file>
export RMW_FASTRTPS_USE_QOS_FROM_XML=1
ros2 run <package> <application>

可替代的方法:将 XML 文件放在运行的应用程序目录下,并命名为 DEFAULT_FASTRTPS_PROFILES.xml。

4 talker/listener通过发现服务器发送topic

如果过安装了ros2或者fastrtps会有一个Python脚本:fastdds
该工具可用于启动 fastdds的发现服务器

# 查看帮助
fastdds discovery -h 

让ros node通过发现服务器通讯需要设置环境变量

export ROS_DISCOVERY_SERVER=127.0.0.1:11811

5 ros2 检视

如果设置了ROS_DISCOVERY_SERVER,ros2 topic list -t 命令不会打印出相应的topic,需要以SUPER_CLIENT模式连接到发现服务器

下面的xml配置使得每个新的participant都作为SUPER_CLIENT
super_client_configuration_file.xml

<?xml version="1.0" encoding="UTF-8" ?>
<dds>
    <profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
        <participant profile_name="super_client_profile" is_default_profile="true">
            <rtps>
                <builtin>
                    <discovery_config>
                        <discoveryProtocol>SUPER_CLIENT</discoveryProtocol>
                        <discoveryServersList>
                            <RemoteServer prefix="44.53.00.5f.45.50.52.4f.53.49.4d.41">
                                <metatrafficUnicastLocatorList>
                                    <locator>
                                        <udpv4>
                                            <address>192.168.31.18</address>
                                            <port>60001</port>
                                        </udpv4>
                                    </locator>
                                </metatrafficUnicastLocatorList>
                            </RemoteServer>
                        </discoveryServersList>
                    </discovery_config>
                </builtin>
            </rtps>
        </participant>
    </profiles>
</dds>

6 远程fastdds程序与ros节点通讯

Fast-DDS & ros2 ros与fastdds通讯

二、安装

一个完整的 ROS 镜像,包含了 ROS 桌面完整版,其中包括了许多常用的工具、库和软件包。

docker pull osrf/ros:humble-desktop-full

ros官方:
在这里插入图片描述
Open Source Robotics Foundation:
在这里插入图片描述

三、catkin编译系统

在这里插入图片描述

catkin工作空间

在这里插入图片描述

tree参看5.

四、colcon构建系统

在这里插入图片描述
Linux version 6.5.0-27-generic (x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
Docker version 24.0.2, build cb74dfc
osrf/ros humble-desktop-full imageid:26438fe1f0c9
git clone https://github.com/ros2/examples src/examples -b humble
colcon build --symlink-install 在以上环境下,运行该命令系统死机

目录结构:
current_workspace:
build
install
log
src
package1
package2

colcon build  # 构建当前目录current_workspace下的所有package
colcon test
source install/setup.bash  # 构建好的包添加进环境变量
colcon_cd <some_ros_pacakge>  # 切换到某个包的目录
  • cd ~/ros2_ws/src
  • ros2 pkg create --build-type ament_cmake --license Apache-2.0 <pacakge_name> # 创建包的标准流程
  • ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node <pacakge_name>
  • colcon build --packages-select <my_package>
  • rosdep install -i --from-path src --rosdistro humble -y # 检查依赖
  • ros2 pkg create --build-type ament_cmake --license Apache-2.0 <pacakge_name> --dependencies rclcpp example_interfaces

五、c++发布ROS包

  1. 创建ROS工作空间
    首先,创建一个ROS工作空间,用于存放ROS包和节点

    mkdir -p ~/catkin_ws/src
    # 在~/catkin_ws/src目录下创建一个CMakeLists软连接
    # 后面调用catkin编译的时候用?
    cd ~/catkin_ws/src
    catkin_init_workspace
    
  2. 创建ROS包:
    在刚刚创建的src目录下创建一个ROS包

    cd ~/catkin_ws/src
    catkin_create_pkg my_package roscpp std_msgs
    

    这将创建一个名为"my_package"的包,并添加了roscpp和std_msgs作为依赖项。可以根据需要添加其他依赖项。
    在这里插入图片描述
    ~/catkin_ws/src目录下的内容,用户代码应该放入src目录下,白色的CMakeLists.txt是需要调整的内容

  3. 在上图中显示的src目录下添加源代码文件

    #include "ros/ros.h"
    #include "std_msgs/String.h"
    
    int main(int argc, char**argv)
    {
      ros::init(argc, argv, "talker");
      ros::NodeHandle n;
      ros::Publisher chat = n.advertise<std_msgs::String>("this_is_topic", 1000);
      ros::Rate loop_rate(10);  // taking into account the calcu time, better than only sleep
      int count = 0;
      while(ros::ok())
      {
        std_msgs::String msg;
        msg.data.insert(0, "agc", 3);
        for (int i = 0; i < msg.data.size(); ++i)
        {
          ROS_INFO("%d", msg.data[i]);
        }
        chat.publish(msg);  // send data
        ros::spinOnce();
        loop_rate.sleep();
        ++count;
      }
      return 0;
    }
    
  4. 修改白色的CMakeLists.txt
    修改
    #############
    ## Install ##
    #############
    后的内容,使项目能正常编译
    注意target_link_libraries和add_executable

  5. 构建和运行节点
    在~/catkin_ws(工作空间根目录)下运行
    catkin_make
    构建成功后运行:(首先要启动roscore服务)
    source devel/setup.bash
    rosrun my_package 可执行文件名称
    在这里插入图片描述

- 参数

- 源码编译安装需要的ros humble的模块 [从ament_cmake开始]

1. Python ament_package 模块安装

项目地址:https://github.com/ament/ament_package
项目简介:
  包含一个单一的ament Python包,提供了查找和解析package.xml文件的API。

该项目为Python ament_package模块源码,其中包含setup.py文件。

python3 setup.py --help  # 查看帮助
python3 setup.py install
# or
python3 setup.py build # 将模块安装到build目录下,然后再添加

将特定目录(安装的Python模块)添加到 Python 搜索路径的方法:

1.
import sys
sys.path.append("/path/to/acllite")
2.
export PYTHONPATH="$PYTHONPATH:/path/to/lib"

https://blog.csdn.net/Johnor/article/details/135206782

2. ament_cmake安装

https://github.com/ament/ament_cmake/tree/humble
项目简介:
  Ament CMake 是一个用于构建 ROS 2 软件包的工具,它基于 CMake 构建系统,提供了一系列 CMake 宏和函数用于声明依赖项、安装目标文件等,简化了 ROS 2 软件包的构建过程。

依赖:

  • cmake
  • python3
  • pip (用于安装Python模块)
  • python的catkin_pkg模块
  • Python的ament_package模块(地址:https://github.com/ament/ament_package, 步骤1中安装)

相关参考:
https://blog.csdn.net/amuro_ray027/article/details/120201983
https://blog.csdn.net/weixin_34024034/article/details/91800653

  1. cmake ament_cmake_core
    为ament提供所有内置的核心概念,例如环境钩子、资源索引、符号链接安装等
    运行cmake [path/cmakelists.txt] 后会生成cmake_install.cmake文件,该文件用于安装cmake的package
    接着运行make install, 将cmake package复制到/usr/local/share/ament_index/ /usr/local/share/ament_cmake_core
  2. ament_cmake_export_dependencies
    cmake [cmakelists.txt]; make install
  3. ament_cmake
    cmake .. ; make install

根据需要进行安装

如我想安装rosbag2模块,首先需要找到仓库位置https://github.com/ros2/rosbag2,然后切换对应分支。阅读CMakeLists.txt查看该模块需要那些依赖。依次安装依赖

  • find_package(ament_cmake REQUIRED)
  • find_package(ament_index_cpp REQUIRED)
      https://github.com/ament/ament_index/
  • find_package(pluginlib REQUIRED)
  • find_package(rclcpp REQUIRED)
  • find_package(rcpputils REQUIRED)
  • find_package(rcutils REQUIRED)
  • find_package(rmw REQUIRED)
  • find_package(rmw_implementation REQUIRED)
  • find_package(rosbag2_storage REQUIRED)
  • find_package(rosidl_runtime_c REQUIRED)
  • find_package(rosidl_runtime_cpp REQUIRED)
  • find_package(rosidl_typesupport_cpp REQUIRED)
  • find_package(rosidl_typesupport_introspection_cpp REQUIRED)

Ubuntu系统源码安装ros:
http://fishros.org/doc/ros2/humble/Installation/Alternatives/Ubuntu-Development-Setup.html

# rosdep init just fetches that file and writes it into /etc/ros/rosdep/sources.list.d/20-default.list
sudo rosdep init # https://github.com/ros/rosdistro/issues/9721

参考

中国大学MOOC—《机器人操作系统入门》课程讲义

https://docs.ros.org/en/humble/index.html

https://docs.ros2.org/bouncy/api/rclcpp/index.html

http://fishros.org/doc/ros2/humble/index.html

ros2依赖
https://raw.githubusercontent.com/ros2/ros2/release-latest/ros2.repos

ros2bag
https://github.com/ros2/rosbag2

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

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

相关文章

Natutre Methods|单细胞+空间转录,值得去复现的开源单细胞分析pipeline

肺癌是全球第二大最常见的癌症&#xff0c;也是癌症相关死亡的主要原因。肿瘤生态系统具有多种免疫细胞类型。尤其是髓系细胞&#xff0c;髓系细胞普遍存在&#xff0c;并且在促进疾病方面发挥着众所周知的作用。该篇通过单细胞和空间转录组学分析了 25 名未经治疗的腺癌和鳞状…

58页PPT智慧工地整体解决方案(精华版)

智慧工地的核心技术主要包括以下几个方面&#xff1a; 本文篇幅限制&#xff0c;只分享部分内容&#xff0c;喜欢文章请点赞转发评论&#xff0c;下载完整版PPT可以查看文章中图片右下角信息 1. 物联网&#xff08;IoT&#xff09;技术 核心作用&#xff1a;物联网技术是智慧…

贪心+背包

这道题比较坑的就是我们的对于相同截止时间的需要排个序&#xff0c;因为我们这个工作是有时间前后顺序的&#xff0c;我们如果不排序的话我们一些截止时间晚的工作就无法得到最优报酬 #include<bits/stdc.h> using namespace std;#define int long long int t; int n; c…

数据结构:二叉树(堆)的顺序存储

文章目录 1. 树1.1 树的概念和结构1.2 树的相关术语 2. 二叉树2.1 二叉树的概念和结构2.2 二叉树的特点2.3 特殊的二叉树2.3.1 满二叉树2.3.2 完全二叉树 2.4 二叉树的性质 3. 实现顺序结构二叉树3.1 堆的概念和结构3.2 初始化3.3 销毁3.4 插入数据3.5 向上调整算法3.6 删除数据…

Java语言程序设计——篇九(2)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 枚举类型 枚举类型的定义枚举类型的方法实战演练 枚举在switch中的应用实战演练 枚举类的构造方法实战演练 枚举类型的定义 [修饰符] enum 枚举…

自动控制:带死区的PID控制算法

带死区的PID控制算法 在计算机控制系统中&#xff0c;为了避免控制动作过于频繁&#xff0c;消除因频繁动作所引起的振荡&#xff0c;可采用带死区的PID控制。带死区的PID控制通过引入一个死区&#xff0c;使得在误差较小的范围内不进行控制动作&#xff0c;从而减少控制系统的…

深入源码:解析SpotBugs(1)静态代码分析框架

文章目录 引言SpotBugs概述启动附录 引言 SpotBugs是一个开源的Java静态分析工具&#xff0c;旨在帮助开发人员检测Java代码中的潜在缺陷和漏洞。以下是对SpotBugs的详细解释&#xff1a; SpotBugs概述 定义与功能&#xff1a;SpotBugs是FindBugs的继任者。FindBugs是一个广受…

LInux的基础用法

Linux学习1&#xff1a;LInux的基本功能 读写的权限 读写的权限可以写为&#xff1a;r,w,x 九个权限可以分成三组&#xff1a; user&#xff1a;当前文件所属用户的权限 。 group&#xff1a;与当前文件所属用户同一组的用户权限 。 others&#xff1a;其他用户的权限。 使用…

免费【2024】springboot 编程语言在线学习平台的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

昇思MindSpore 应用学习-RNN实现情感分类-CSDN

RNN实现情感分类 AI代码解析 概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入…

深入分析 Android ContentProvider (七)

文章目录 深入分析 Android ContentProvider (七)ContentProvider 的高级使用和最佳实践1. 高级使用场景1.1. 跨应用数据共享示例&#xff1a;跨应用数据共享 1.2. 动态授权示例&#xff1a;动态授权 1.3. 数据观察与通知示例&#xff1a;内容观察者 2. 最佳实践2.1. 设计合理的…

Linux(虚拟机)的介绍

Linux介绍 常见的操作系统 Windows&#xff1a;微软公司开发的一款桌面操作系统&#xff08;闭源系统&#xff09;。版本有dos&#xff0c;win98&#xff0c;win NT&#xff0c;win XP , win7, win vista. win8, win10&#xff0c;win11。服务器操作系统&#xff1a;winserve…

大模型争锋:左手“世界最强” 右手“高性价比”

2020年&#xff0c;OpenAI团队发表论文&#xff0c;正式提出了大模型开发的经验法则Scaling Law&#xff0c;目前它并没有统一的中文名称&#xff0c;大致可以理解为“规模法则”&#xff0c;更通俗地说是“大力出奇迹”。2022年年底&#xff0c;ChatGPT的横空出世验证了“规模…

C++——类和对象(中)

目录 一、类的默认成员函数 二、构造函数 三、析构函数 四、拷贝构造函数 五、运算符重载 1.基本知识 2.赋值运算符重载 3.取地址运算符重载 a.const成员函数 b.取地址运算符重载 一、类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成…

[ECharts] There is a chart instance already initialized on the dom. 已存在图表,渲染重复

报错&#xff1a;已存在图表&#xff0c;渲染重复 解决: 在合适的时机执行 dispose 方法即可 // echarts 全局存入 实例 let myChart: any;// 在你的 initChart 初始化 Echarts 方法中 先执行清理方法 const initChart () > {// 执行清理方法然后初始化if(myChart){cons…

Linux中进程之间的通信

IPC的概念 即进程间的通信 常用方式&#xff1a; 1&#xff0c;管道通信&#xff1a;有名管道&#xff0c;无名管道 2&#xff0c;信号- 系统开销小 3&#xff0c;消息队列-内核的链表 4&#xff0c;信号量-计数器 5&#xff0c;共享内存 6&#xff0c;内存映射 7&…

轻松合并PDF文档:2024年精选工具指南

不知道你有没有做PDF文件的经历&#xff0c;特别是多部门协同的那种。这时候如果有个可以支持pdf合并的工具那简直不要太开心了。独乐乐不如众乐乐&#xff0c;我把我用过的一些PDF合并工具这里介绍一下吧。 1.PDF编辑器福晰在线 直达链接&#xff1a;https://edit.foxitclou…

Java并发编程(下)

volatile的应用 - volatile修饰类属性&#xff08;类变量和实例变量&#xff09;&#xff0c;synchronized修饰类方法、代码块&#xff0c;同时volatile在并发中是**不安全**的 - 作用&#xff1a; - 使共享变量在多线程间可见&#xff0c;如果一个字段被声明成volatile&…

【Linux网络】应用层协议:HTTP 与 HTTPS

本篇博客整理了 TCP/IP 分层模型中应用层的 HTTP 协议和 HTTPS协议&#xff0c;旨在让读者更加深入理解网络协议栈的设计和网络编程。 目录 一、协议是什么 1&#xff09;结构化数据的传输 2&#xff09;序列化和反序列化 补&#xff09;网络版计算器 .1- 协议定制 .2- …

在window将Redis注册为服务

将redis注册为系统服务&#xff0c;开启自启动 安装服务 默认注册完之后会自动启动&#xff0c;在window中的服务看一下&#xff0c;如果启动类型为自动&#xff0c;状态是自动运行则启动完成。如果是手动&#xff0c;需要右键属性调整为自动&#xff0c;在点击启动&#xff0c…