ROS2 Jazzy实战:用rclpy打造智能机器人通信系统(附完整代码)
ROS2 Jazzy实战用rclpy打造智能机器人通信系统附完整代码如果你正在为机器人项目寻找一个灵活、高效且易于上手的通信框架ROS2 Jazzy搭配其Python客户端库rclpy无疑是一个极具吸引力的选择。不同于早期ROS版本ROS2在实时性、跨平台和分布式架构上有了质的飞跃而Jazzy作为其长期支持版本为开发者提供了稳定的基石。rclpy则让Python开发者能够轻松驾驭ROS2强大的通信能力快速构建从概念验证到实际部署的机器人应用。这篇文章不是简单的概念介绍而是从一个真实的“智能移动机器人”场景出发手把手带你搭建一个融合了话题通信、服务调用、参数配置等核心模块的完整通信系统。我们将从零开始编写可运行的代码并深入探讨如何将这些模块组合起来解决实际开发中遇到的数据流管理、模块解耦和系统监控等问题。无论你是刚接触ROS2的新手还是希望将Python高效开发与机器人系统深度融合的工程师这里都有你需要的实战干货。1. 环境搭建与项目初始化在开始编码之前一个清晰、可复现的开发环境是高效工作的前提。ROS2 Jazzy支持Ubuntu、Windows和macOS这里我们以Ubuntu 22.04为例。确保你的系统已经安装了ROS2 Jazzy Jalisco桌面版。安装完成后打开终端验证安装是否成功source /opt/ros/jazzy/setup.bash ros2 --version你应该能看到类似ros2 version 8.0.0的输出。接下来我们创建一个独立的工作空间来管理我们的项目这是一种最佳实践可以避免污染系统级的ROS2环境。mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src我们将在这个工作空间中创建我们的机器人通信包。使用ROS2的构建工具colcon和包创建命令ros2 pkg create --build-type ament_python intelligent_robot_comms --dependencies rclpy std_msgs geometry_msgs sensor_msgs这个命令创建了一个名为intelligent_robot_comms的Python包并自动声明了对rclpy和一些常用消息类型如std_msgs,geometry_msgs的依赖。让我们看看生成的关键文件结构intelligent_robot_comms/ ├── package.xml ├── setup.py ├── setup.cfg └── intelligent_robot_comms/ └── __init__.pypackage.xml和setup.py是包的元数据文件定义了包的名称、版本、依赖和入口点。我们后续编写的所有节点脚本都将放在intelligent_robot_comms/目录下。为了立即验证环境我们可以先编译这个空包cd ~/ros2_ws colcon build --packages-select intelligent_robot_comms source install/setup.bash如果编译过程没有报错恭喜你ROS2 Jazzy开发环境已经准备就绪。这个工作空间将成为我们构建智能机器人通信系统的大本营。2. 核心通信模式话题与服务的深度应用机器人系统本质上是多个独立模块节点的集合这些模块通过高效的通信机制协同工作。ROS2提供了两种最核心的通信模式话题和服务。理解它们的区别和适用场景是设计健壮系统的关键。话题是一种基于发布/订阅模型的异步、一对多通信机制。它非常适合传输持续性的数据流比如传感器数据激光雷达点云、摄像头图像、机器人状态里程计、电池电量和控制指令速度命令。发布者将数据发送到指定的话题而订阅者可以随时订阅该话题来接收数据双方无需知道彼此的存在。提示话题通信是单向的、数据流驱动的。设计时应确保消息类型定义清晰且发布频率与数据特性匹配例如IMU数据需要高频而地图更新则可以低频。服务则是一种请求/响应模式的同步、一对一通信机制。它适用于需要明确执行结果和反馈的操作例如请求一个路径规划、触发一个标定程序、或查询系统状态。客户端发送一个请求并阻塞等待服务器处理并返回响应。为了直观对比我们来看一个表格特性话题 (Topic)服务 (Service)通信模型发布/订阅 (一对多)请求/响应 (一对一)同步性异步同步客户端等待响应数据流持续、流式一次性、事务性典型应用传感器数据、状态发布任务执行、参数配置、计算请求QoS策略丰富可配置可靠性、持久性相对固定通常要求可靠在我们的智能机器人场景中我们将同时运用这两种模式。例如一个SensorHub节点以高频发布激光和里程计数据话题而一个Navigation节点在需要计算新路径时会调用PathPlanner节点提供的规划服务。让我们先实现一个基础的话题通信例子。在intelligent_robot_comms目录下创建文件sensor_publisher.py#!/usr/bin/env python3 import rclpy from rclpy.node import Node from sensor_msgs.msg import LaserScan import random class SensorPublisher(Node): def __init__(self): super().__init__(sensor_publisher) # 创建一个发布者消息类型为LaserScan话题名为‘scan’队列长度为10 self.publisher_ self.create_publisher(LaserScan, scan, 10) # 创建一个定时器每0.1秒10Hz触发一次回调函数 self.timer self.create_timer(0.1, self.timer_callback) self.get_logger().info(激光传感器模拟节点已启动正在发布 /scan 话题...) def timer_callback(self): msg LaserScan() msg.header.stamp self.get_clock().now().to_msg() msg.header.frame_id laser_frame msg.angle_min -3.14 / 2 msg.angle_max 3.14 / 2 msg.angle_increment 3.14 / 180 msg.range_min 0.1 msg.range_max 10.0 # 模拟360个距离读数 msg.ranges [random.uniform(0.5, 5.0) for _ in range(360)] self.publisher_.publish(msg) # 避免过度打印日志每发布10次打印一次 if self.count % 10 0: self.get_logger().debug(f发布激光数据时间戳: {msg.header.stamp.sec}.{msg.header.stamp.nanosec}) self.count 1 def main(argsNone): rclpy.init(argsargs) node SensorPublisher() try: rclpy.spin(node) except KeyboardInterrupt: node.get_logger().info(节点被用户中断) finally: node.destroy_node() rclpy.shutdown() if __name__ __main__: main()对应的我们创建一个订阅者节点navigation_subscriber.py#!/usr/bin/env python3 import rclpy from rclpy.node import Node from sensor_msgs.msg import LaserScan class NavigationSubscriber(Node): def __init__(self): super().__init__(navigation_subscriber) # 创建订阅者订阅‘scan’话题收到消息后调用listener_callback self.subscription self.create_subscription( LaserScan, scan, self.listener_callback, 10) # 此行防止subscription变量被垃圾回收重要 self.subscription self.get_logger().info(导航节点已启动正在订阅 /scan 话题...) def listener_callback(self, msg): # 简单的处理找到最近的一次扫描距离 if msg.ranges: min_distance min(msg.ranges) self.get_logger().info(f收到激光数据最近障碍物距离: {min_distance:.2f} 米) def main(argsNone): rclpy.init(argsargs) node NavigationSubscriber() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()在setup.py中注册这两个节点为可执行文件后编译并运行。打开两个终端分别执行# 终端1运行发布者 ros2 run intelligent_robot_comms sensor_publisher # 终端2运行订阅者 ros2 run intelligent_robot_comms navigation_subscriber你将看到订阅者终端不断打印出最近障碍物的距离这就是最基本的话题通信。服务通信的实现也类似但模式是请求-响应。我们将在下一节构建更复杂的组合系统。3. 构建复合节点状态机与条件触发在实际的机器人系统中节点往往不是单一功能的。一个节点可能同时扮演多种角色它既订阅某些话题来感知环境也发布处理结果同时还对外提供配置或控制服务。这种复合节点是构建复杂行为的基础。我们将创建一个RobotController节点它综合运用话题和服务实现一个简单的“安全巡逻-紧急停止”状态机。这个节点的逻辑是常态巡逻定期发布速度指令话题/cmd_vel让机器人移动。环境监控订阅激光数据话题/scan判断前方是否有障碍物。紧急干预如果障碍物太近自动停止机器人并对外提供一个/emergency_stop服务允许外部系统查询或确认急停状态。恢复控制提供一个/resume_patrol服务允许在清除障碍后远程恢复巡逻。首先定义我们需要的消息和服务类型。在包目录下创建一个msg和srv文件夹如果不存在但为了简化我们直接使用ROS2标准接口。创建robot_controller.py#!/usr/bin/env python3 import rclpy from rclpy.node import Node from geometry_msgs.msg import Twist from sensor_msgs.msg import LaserScan from std_srvs.srv import SetBool import time class RobotController(Node): def __init__(self): super().__init__(robot_controller) # 发布者速度指令 self.cmd_vel_pub self.create_publisher(Twist, cmd_vel, 10) # 订阅者激光数据 self.scan_sub self.create_subscription( LaserScan, scan, self.scan_callback, 10) self.scan_sub # 服务紧急停止状态查询 self.emergency_srv self.create_service( SetBool, emergency_stop, self.emergency_callback) # 服务恢复巡逻 self.resume_srv self.create_service( SetBool, resume_patrol, self.resume_callback) # 定时器巡逻控制循环 self.timer self.create_timer(0.5, self.control_loop) # 2Hz控制循环 # 内部状态 self.is_in_emergency False self.last_obstacle_distance float(inf) self.patrol_phase 0 self.get_logger().info(机器人控制器节点启动。初始状态巡逻中。) def scan_callback(self, msg): 处理激光数据检测前方障碍 if not msg.ranges: return # 简单处理只看正前方一小部分角度例如-15度到15度 mid_index len(msg.ranges) // 2 front_scan msg.ranges[mid_index-15:mid_index15] valid_distances [d for d in front_scan if msg.range_min d msg.range_max] if valid_distances: self.last_obstacle_distance min(valid_distances) # 如果障碍物距离小于安全阈值如0.5米触发急停 if self.last_obstacle_distance 0.5 and not self.is_in_emergency: self.get_logger().warn(f检测到前方障碍物距离: {self.last_obstacle_distance:.2f}米触发急停。) self.is_in_emergency True self._publish_zero_vel() # 立即发布零速度 def control_loop(self): 主控制循环根据状态发布速度指令 if self.is_in_emergency: # 急停状态不发布移动指令控制循环跳过 return # 简单的巡逻模式前进2秒原地旋转1秒 msg Twist() if self.patrol_phase 4: # 前进阶段 (0.5s * 4 2s) msg.linear.x 0.2 # 0.2 m/s self.get_logger().debug(巡逻状态前进) else: # 旋转阶段 (0.5s * 2 1s) msg.angular.z 0.5 # 0.5 rad/s self.get_logger().debug(巡逻状态旋转) self.cmd_vel_pub.publish(msg) self.patrol_phase (self.patrol_phase 1) % 6 # 6个周期3秒循环 def _publish_zero_vel(self): 发布零速度指令使机器人停止 stop_msg Twist() self.cmd_vel_pub.publish(stop_msg) self.get_logger().info(已发布零速度指令。) def emergency_callback(self, request, response): 处理/emergency_stop服务请求 # request.data通常用于设置状态这里我们忽略只返回当前状态 response.success True response.message f当前急停状态: {self.is_in_emergency} self.get_logger().info(f查询急停状态服务被调用返回: {response.message}) return response def resume_callback(self, request, response): 处理/resume_patrol服务请求 if not request.data: response.success False response.message 请求参数data必须为True以恢复巡逻 return response if self.is_in_emergency and self.last_obstacle_distance 0.5: self.is_in_emergency False self.patrol_phase 0 response.success True response.message 急停已解除恢复巡逻模式。 self.get_logger().info(response.message) else: response.success False if self.is_in_emergency: response.message 无法恢复前方障碍物仍未清除。 else: response.message 当前未处于急停状态。 return response def main(argsNone): rclpy.init(argsargs) controller RobotController() try: rclpy.spin(controller) except KeyboardInterrupt: controller.get_logger().info(控制器节点关闭。) finally: controller.destroy_node() rclpy.shutdown() if __name__ __main__: main()这个节点展示了如何在一个类中集成多种通信模式。scan_callback是异步的一旦有激光数据就立即处理control_loop是周期性的负责生成巡逻指令两个服务回调函数emergency_callback和resume_callback则是按需响应外部请求。这种结构使得节点能够同时处理实时数据流和离散命令是机器人控制器的典型架构。4. 系统集成与高级特性参数、Launch文件与QoS当我们的系统拥有多个相互协作的节点时手动在多个终端中启动它们既繁琐又容易出错。ROS2的Launch系统就是为了解决这个问题而生的。我们可以编写一个Launch文件一次性启动整个机器人通信系统。在包目录下创建launch/文件夹并在其中新建robot_comms.launch.py文件from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( packageintelligent_robot_comms, executablesensor_publisher, namelaser_simulator, outputscreen, parameters[{frame_id: base_laser}] ), Node( packageintelligent_robot_comms, executablerobot_controller, namemain_controller, outputscreen, # 可以通过参数覆盖默认安全距离 parameters[{safe_distance: 0.6}] ), Node( packageintelligent_robot_comms, executablenavigation_subscriber, namenav_module, outputscreen, remappings[ # 如果话题名需要重映射可以在这里配置 (scan, filtered_scan) ] ), ])注意到我们在节点配置中使用了parameters和remappings。参数允许我们在节点启动时动态配置其行为而无需修改代码。在我们的RobotController中可以修改__init__方法来读取参数self.declare_parameter(safe_distance, 0.5) # 声明参数默认值0.5米 self.safe_distance self.get_parameter(safe_distance).get_parameter_value().double_value然后在scan_callback中使用self.safe_distance代替硬编码的0.5。这样通过Launch文件或命令行我们就可以轻松调整安全阈值。话题重映射则提供了极大的灵活性它允许我们在不修改节点源代码的情况下改变其订阅或发布的话题名称。这对于集成来自不同团队或第三方提供的节点特别有用。另一个高级特性是服务质量。ROS2的通信层基于DDS提供了强大的QoS策略配置允许你精细控制通信的可靠性、持久性和历史深度。例如对于至关重要的紧急停止指令你可能需要可靠传输和持久化存储即使订阅者后启动也能收到最后一条指令from rclpy.qos import QoSProfile, QoSReliabilityPolicy, QoSDurabilityPolicy reliable_qos QoSProfile( depth10, reliabilityQoSReliabilityPolicy.RELIABLE, # 可靠传输 durabilityQoSDurabilityPolicy.TRANSIENT_LOCAL # 持久化 ) self.emergency_pub self.create_publisher(Twist, emergency_cmd_vel, reliable_qos)而对于高频的传感器数据为了追求低延迟可能会选择尽力而为的传输best_effort_qos QoSProfile( depth5, reliabilityQoSReliabilityPolicy.BEST_EFFORT # 尽力而为 ) self.scan_sub self.create_subscription(LaserScan, scan, self.scan_callback, best_effort_qos)QoS策略的匹配是ROS2通信成功的关键。发布者和订阅者必须具有兼容的QoS配置否则它们可能无法建立连接。一个常见的坑是默认的QoS配置在不同类型的通信中可能不同手动指定QoS策略是构建健壮生产系统的推荐做法。最后别忘了我们之前创建的服务。我们可以使用命令行工具来测试整个系统。启动Launch文件后打开另一个终端查询控制器的状态# 查询急停服务状态 ros2 service call /emergency_stop std_srvs/srv/SetBool {data: false} # 尝试恢复巡逻假设障碍已清除 ros2 service call /resume_patrol std_srvs/srv/SetBool {data: true}同时使用ros2 topic list和ros2 topic echo /cmd_vel可以实时查看系统的话题和流动的数据。这种可观测性对于调试复杂的多节点系统至关重要。5. 实战构建一个完整的智能机器人Demo现在让我们把所有模块组合起来构建一个模拟的智能机器人演示系统。这个Demo将包含以下节点环境模拟器模拟激光传感器和虚拟障碍物。核心控制器就是我们上面开发的RobotController负责决策和运动控制。可视化监控节点订阅关键话题并以更友好的格式如控制台图形展示机器人状态。远程控制客户端一个简单的脚本通过服务调用来手动触发急停或恢复。我们将创建一个新的节点visualization_node.py它不参与控制只负责监控和展示#!/usr/bin/env python3 import rclpy from rclpy.node import Node from geometry_msgs.msg import Twist from sensor_msgs.msg import LaserScan import sys class VisualizationNode(Node): def __init__(self): super().__init__(visualization_node) self.cmd_vel_sub self.create_subscription(Twist, cmd_vel, self.cmd_vel_callback, 10) self.scan_sub self.create_subscription(LaserScan, scan, self.scan_callback, 10) self.cmd_vel_sub self.scan_sub self.get_logger().info(可视化监控节点启动。按CtrlC退出。) print(\n *50) print(智能机器人系统监控面板) print(*50) def cmd_vel_callback(self, msg): # 清空上一行并打印速度信息简单模拟刷新 sys.stdout.write(\r * 60 \r) sys.stdout.write(f[控制指令] 线速度: {msg.linear.x:.2f} m/s, 角速度: {msg.angular.z:.2f} rad/s) sys.stdout.flush() def scan_callback(self, msg): if msg.ranges: front_dist msg.ranges[len(msg.ranges)//2] # 在速度信息下方打印障碍物距离 sys.stdout.write(f [传感器] 正前方障碍物: {front_dist:.2f} m\n) # 可以在这里添加简单的ASCII艺术表示 if front_dist 1.0: sys.stdout.write(警告 # * int(10*(1.0-front_dist)) \n) def main(argsNone): rclpy.init(argsargs) node VisualizationNode() try: rclpy.spin(node) except KeyboardInterrupt: print(\n\n监控节点关闭。) finally: node.destroy_node() rclpy.shutdown() if __name__ __main__: main()同时我们编写一个简单的远程控制脚本remote_client.py它作为一个独立的节点提供命令行界面来调用服务#!/usr/bin/env python3 import rclpy from rclpy.node import Node from std_srvs.srv import SetBool import threading class RemoteClient(Node): def __init__(self): super().__init__(remote_client) self.resume_client self.create_client(SetBool, resume_patrol) while not self.resume_client.wait_for_service(timeout_sec1.0): self.get_logger().info(恢复巡逻服务未就绪等待中...) self.get_logger().info(远程客户端就绪。输入 \r\ 恢复巡逻输入 \q\ 退出。) self._run_cli() def _call_resume_service(self): req SetBool.Request() req.data True future self.resume_client.call_async(req) future.add_done_callback(self._service_response_callback) def _service_response_callback(self, future): try: response future.result() self.get_logger().info(f服务响应: {response.message}) except Exception as e: self.get_logger().error(f服务调用失败: {e}) def _run_cli(self): 简单的命令行交互 import termios, tty, sys def getch(): fd sys.stdin.fileno() old_settings termios.tcgetattr(fd) try: tty.setraw(sys.stdin.fileno()) ch sys.stdin.read(1) finally: termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) return ch print(远程控制客户端 (按 r 恢复巡逻q 退出)) while rclpy.ok(): key getch() if key r: self.get_logger().info(发送恢复巡逻指令...) self._call_resume_service() elif key q: self.get_logger().info(退出远程控制。) break def main(argsNone): rclpy.init(argsargs) client RemoteClient() # 由于_run_cli是阻塞的我们需要在单独的线程中spin节点 spin_thread threading.Thread(targetrclpy.spin, args(client,)) spin_thread.start() # _run_cli在主线程运行 client._run_cli() rclpy.shutdown() spin_thread.join() if __name__ __main__: main()更新Launch文件将这两个新节点也包含进去。现在在项目根目录下编译并运行cd ~/ros2_ws colcon build --packages-select intelligent_robot_comms source install/setup.bash ros2 launch intelligent_robot_comms robot_comms.launch.py你将看到所有节点启动。打开另一个终端运行可视化节点ros2 run intelligent_robot_comms visualization_node可以看到实时的速度指令和传感器数据。再开一个终端运行远程客户端ros2 run intelligent_robot_comms remote_client当模拟的激光传感器检测到障碍物触发急停后你可以在客户端按‘r’键尝试恢复巡逻。这个Demo虽然基于模拟但完整呈现了一个典型机器人软件栈的通信骨架感知、决策、控制、监控、人机交互。通过rclpy我们用Python快速实现了这个原型其清晰的模块化设计让你可以轻松替换其中任何一个部分。例如将激光模拟器换成真实的激光雷达驱动节点将控制指令发布到真实的机器人底盘一个真实的自主移动机器人系统就初具雏形了。

相关新闻

微信小程序地图开发实战:手把手教你实现电子围栏(圆形+多边形)

微信小程序地图开发实战:手把手教你实现电子围栏(圆形+多边形)

微信小程序地图开发实战:手把手教你实现电子围栏(圆形多边形) 最近在做一个社区配送的小程序项目,客户提了个需求,要在后台地图上圈出几个固定的配送范围,配送员一旦进入这个区域就自动触发通知。这不就是典…

2026/7/4 14:10:22 阅读更多 →
机器人轨迹优化实战:5分钟用Python实现Minimum-jerk平滑路径

机器人轨迹优化实战:5分钟用Python实现Minimum-jerk平滑路径

机器人轨迹优化实战:5分钟用Python实现Minimum-jerk平滑路径 如果你正在为机器人或自动化设备设计运动控制方案,大概率遇到过这样的困境:路径规划算法给出了一系列精确的路径点,但直接让机器人“硬着头皮”去走,结果往…

2026/7/4 4:38:39 阅读更多 →
STM32F407ZGT6驱动TM1650数码管全攻略:从硬件连接到按键控制

STM32F407ZGT6驱动TM1650数码管全攻略:从硬件连接到按键控制

STM32F407ZGT6驱动TM1650数码管全攻略:从硬件连接到按键控制 最近在做一个智能仪表的小项目,需要用到四位数码管来显示实时数据,同时还得支持几个按键进行参数调整。市面上常见的方案要么是直接用单片机IO口驱动,占用引脚太多&…

2026/7/3 3:31:19 阅读更多 →

最新新闻

ONVIF摄像头接入项目实战记录

ONVIF摄像头接入项目实战记录

在多厂商监控设备共存的AI视频分析项目落地过程中,异构视频源的标准化接入往往是耗时最多的环节。本文基于工业级AI视频分析平台的研发与交付实践,系统性地阐述如何通过ONVIF协议实现摄像头的自动化设备发现、能力协商与取流地址获取。本文旨在为负责视频…

2026/7/4 14:10:00 阅读更多 →
构建高质量操作指南数据集与大模型优化实践

构建高质量操作指南数据集与大模型优化实践

1. 项目背景与核心价值 去年我在处理一个企业知识库项目时,发现现有AI助手在"教人做事"类任务上表现糟糕——要么漏掉关键步骤,要么逻辑混乱。这促使我启动了一个大规模研究:从全网抓取98万份操作指南类网页,清洗后得到…

2026/7/4 14:07:59 阅读更多 →
基于改进YOLOv8的电子废物智能分拣系统开发

基于改进YOLOv8的电子废物智能分拣系统开发

## 1. 项目背景与核心价值电子废物(E-waste)已成为全球增长最快的固体废弃物类型。根据国际电信联盟数据,2023年全球电子废物总量突破6000万吨,但正规回收率不足20%。这个现象背后隐藏着两个关键问题: 1. 有害物质&…

2026/7/4 14:05:58 阅读更多 →
一键下载中小学电子课本:告别网络依赖的智能工具

一键下载中小学电子课本:告别网络依赖的智能工具

一键下载中小学电子课本:告别网络依赖的智能工具 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。 项目地址: htt…

2026/7/4 14:05:58 阅读更多 →
2025主流开源AI UI选型指南:OpenWebUI、Ollama WebUI等四大工具实测

2025主流开源AI UI选型指南:OpenWebUI、Ollama WebUI等四大工具实测

1. 项目概述:当AI能力不再被代码门槛锁死“No Code, No Limits”不是一句营销口号,而是我过去18个月在十几个真实业务场景里反复验证的一条技术路径——从为本地社区诊所搭建症状初筛助手,到帮独立设计师快速生成品牌视觉草稿,再到…

2026/7/4 14:05:58 阅读更多 →
Spring Security OAuth2实战:手把手搭建认证服务器与资源服务器(JWT+密码模式)

Spring Security OAuth2实战:手把手搭建认证服务器与资源服务器(JWT+密码模式)

引言 在现代微服务架构中,安全认证与授权是绕不开的话题。OAuth2 作为业界标准的授权协议,能够帮助我们实现第三方应用授权、单点登录以及资源保护。Spring Security 提供了对 OAuth2 的一流支持,使得开发者可以快速构建符合标准的认证与资源…

2026/7/4 14:03:58 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻