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

【Moveit2官方教程】使用 MoveIt Task Constructor (MTC) 框架来定义和执行一个机器人任务

#include <rclcpp/rclcpp.hpp>  // ROS 2 的核心库
#include <moveit/planning_scene/planning_scene.h>  // MoveIt 规划场景相关的头文件
#include <moveit/planning_scene_interface/planning_scene_interface.h>  // MoveIt 规划场景接口
#include <moveit/task_constructor/task.h>  // MTC 任务的头文件
#include <moveit/task_constructor/solvers.h>  // MTC 求解器相关的头文件
#include <moveit/task_constructor/stages.h>  // MTC 阶段定义的头文件
#if __has_include(<tf2_geometry_msgs/tf2_geometry_msgs.hpp>)
#include <tf2_geometry_msgs/tf2_geometry_msgs.hpp>  // 包含用于处理几何消息的 TF2 转换
#else
#include <tf2_geometry_msgs/tf2_geometry_msgs.h>
#endif
#if __has_include(<tf2_eigen/tf2_eigen.hpp>)
#include <tf2_eigen/tf2_eigen.hpp>  // 包含用于处理 Eigen 矩阵的 TF2 转换
#else
#include <tf2_eigen/tf2_eigen.h>
#endifstatic const rclcpp::Logger LOGGER = rclcpp::get_logger("mtc_tutorial");  // 定义日志器,用于输出调试信息
namespace mtc = moveit::task_constructor;  // 为 moveit::task_constructor 创建别名 mtc// 定义 MTC 任务节点类
class MTCTaskNode
{
public:MTCTaskNode(const rclcpp::NodeOptions& options);  // 构造函数rclcpp::node_interfaces::NodeBaseInterface::SharedPtr getNodeBaseInterface();  // 获取节点基础接口void doTask();  // 执行任务的函数void setupPlanningScene();  // 设置规划场景的函数
private:mtc::Task createTask();  // 创建任务的函数mtc::Task task_;  // MTC 任务对象rclcpp::Node::SharedPtr node_;  // ROS 2 节点对象
};// 获取节点基础接口的实现
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr MTCTaskNode::getNodeBaseInterface()
{return node_->get_node_base_interface();
}// 构造函数的实现,创建节点对象
MTCTaskNode::MTCTaskNode(const rclcpp::NodeOptions& options): node_{ std::make_shared<rclcpp::Node>("mtc_node", options) }  // 初始化节点名称为 "mtc_node"
{
}// 设置规划场景的实现
void MTCTaskNode::setupPlanningScene()
{// 创建一个碰撞对象(障碍物)moveit_msgs::msg::CollisionObject object;object.id = "object";  // 定义对象 IDobject.header.frame_id = "world";  // 对象的参考坐标系object.primitives.resize(1);  // 定义对象的几何形状数组大小为 1object.primitives[0].type = shape_msgs::msg::SolidPrimitive::CYLINDER;  // 设置对象为圆柱体object.primitives[0].dimensions = { 0.1, 0.02 };  // 定义圆柱体的高度和半径// 定义对象的位置和姿态geometry_msgs::msg::Pose pose;pose.position.x = 0.5;pose.position.y = -0.25;pose.orientation.w = 1.0;  // 设置无旋转的四元数object.pose = pose;  // 赋值给碰撞对象的位姿// 创建规划场景接口并将碰撞对象添加到场景中moveit::planning_interface::PlanningSceneInterface psi;psi.applyCollisionObject(object);  // 应用碰撞对象到规划场景
}// 执行任务的实现
void MTCTaskNode::doTask()
{task_ = createTask();  // 创建任务// 尝试初始化任务try{task_.init();  // 初始化任务}catch (mtc::InitStageException& e)  // 捕获初始化失败的异常{RCLCPP_ERROR_STREAM(LOGGER, e);  // 打印错误信息return;}// 规划任务路径,最大规划尝试次数为 5if (!task_.plan(5)){RCLCPP_ERROR_STREAM(LOGGER, "Task planning failed");  // 打印任务规划失败的日志return;}// 发布任务解决方案以供检查task_.introspection().publishSolution(*task_.solutions().front());// 执行规划的解决方案auto result = task_.execute(*task_.solutions().front());if (result.val != moveit_msgs::msg::MoveItErrorCodes::SUCCESS){RCLCPP_ERROR_STREAM(LOGGER, "Task execution failed");  // 执行失败的错误日志return;}return;
}// 创建任务的实现
mtc::Task MTCTaskNode::createTask()
{mtc::Task task;  // 创建一个 MTC 任务对象task.stages()->setName("demo task");  // 为任务命名task.loadRobotModel(node_);  // 加载机器人模型// 定义机器人操作相关的参数const auto& arm_group_name = "panda_arm";  // 机械臂的操作组名称const auto& hand_group_name = "hand";  // 手部操作组名称const auto& hand_frame = "panda_hand";  // 机械手的坐标系// 设置任务的属性task.setProperty("group", arm_group_name);task.setProperty("eef", hand_group_name);task.setProperty("ik_frame", hand_frame);// 忽略未使用变量的编译器警告
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"mtc::Stage* current_state_ptr = nullptr;  // 当前状态指针,设置但不使用
#pragma GCC diagnostic pop// 创建并添加获取当前状态的阶段auto stage_state_current = std::make_unique<mtc::stages::CurrentState>("current");current_state_ptr = stage_state_current.get();task.add(std::move(stage_state_current));  // 添加当前状态阶段到任务中// 创建不同的规划器auto sampling_planner = std::make_shared<mtc::solvers::PipelinePlanner>(node_);  // 创建采样规划器auto interpolation_planner = std::make_shared<mtc::solvers::JointInterpolationPlanner>();  // 创建插值规划器// 创建笛卡尔路径规划器,并设置最大速度和加速度auto cartesian_planner = std::make_shared<mtc::solvers::CartesianPath>();cartesian_planner->setMaxVelocityScalingFactor(1.0);  // 设置最大速度缩放因子为 1.0cartesian_planner->setMaxAccelerationScalingFactor(1.0);  // 设置最大加速度缩放因子为 1.0cartesian_planner->setStepSize(.01);  // 设置步长为 0.01// 创建并添加手部动作的阶段(打开手)auto stage_open_hand =std::make_unique<mtc::stages::MoveTo>("open hand", interpolation_planner);  // 创建移动到目标状态的阶段stage_open_hand->setGroup(hand_group_name);  // 设置操作组为手部stage_open_hand->setGoal("open");  // 设置手部打开的目标状态task.add(std::move(stage_open_hand));  // 将阶段添加到任务中return task;  // 返回创建的任务
}// 程序的主函数
int main(int argc, char** argv)
{rclcpp::init(argc, argv);  // 初始化 ROS 2rclcpp::NodeOptions options;  // 创建节点选项options.automatically_declare_parameters_from_overrides(true);  // 自动声明节点参数// 创建 MTC 任务节点对象auto mtc_task_node = std::make_shared<MTCTaskNode>(options);rclcpp::executors::MultiThreadedExecutor executor;  // 创建多线程执行器// 创建一个新线程用于节点执行auto spin_thread = std::make_unique<std::thread>([&executor, &mtc_task_node]() {executor.add_node(mtc_task_node->getNodeBaseInterface());  // 将节点添加到执行器中executor.spin();  // 开始执行节点任务executor.remove_node(mtc_task_node->getNodeBaseInterface());  // 从执行器中移除节点});mtc_task_node->setupPlanningScene();  // 设置规划场景mtc_task_node->doTask();  // 执行任务spin_thread->join();  // 等待线程执行完毕rclcpp::shutdown();  // 关闭 ROS 2return 0;
}

包含的头文件

#include <rclcpp/rclcpp.hpp>
  • 包含 ROS 2 的核心库,用于节点的创建和管理。
#include <moveit/planning_scene/planning_scene.h>
#include <moveit/planning_scene_interface/planning_scene_interface.h>
  • 包含 MoveIt 的规划场景相关的头文件,允许你在场景中设置物体(如障碍物)进行规划。
#include <moveit/task_constructor/task.h>
#include <moveit/task_constructor/solvers.h>
#include <moveit/task_constructor/stages.h>
  • 包含 MoveIt Task Constructor 的头文件,用于任务的创建、规划和求解。task.h 管理任务的整体流程,solvers.hstages.h 用于定义和解决任务中的不同阶段。
#if __has_include(<tf2_geometry_msgs/tf2_geometry_msgs.hpp>)
#include <tf2_geometry_msgs/tf2_geometry_msgs.hpp>
#else
#include <tf2_geometry_msgs/tf2_geometry_msgs.h>
#endif
  • 条件包含头文件,用于处理几何消息的 TF2 转换。TF2 是 ROS 中用于处理坐标变换的工具。
#if __has_include(<tf2_eigen/tf2_eigen.hpp>)
#include <tf2_eigen/tf2_eigen.hpp>
#else
#include <tf2_eigen/tf2_eigen.h>
#endif
  • 类似于上一个 tf2_geometry_msgs,这个条件编译块用于包含 Eigen 库的 TF2 转换接口。

定义日志器

static const rclcpp::Logger LOGGER = rclcpp::get_logger("mtc_tutorial");
  • 定义一个用于输出日志的 ROS 2 日志器,名称为 mtc_tutorial

使用命名空间

namespace mtc = moveit::task_constructor;
  • moveit::task_constructor 命名空间定义简短别名 mtc,便于后续使用。

定义 MTCTaskNode

class MTCTaskNode
{
public:MTCTaskNode(const rclcpp::NodeOptions& options);rclcpp::node_interfaces::NodeBaseInterface::SharedPtr getNodeBaseInterface();void doTask();void setupPlanningScene();
private:mtc::Task createTask();mtc::Task task_;rclcpp::Node::SharedPtr node_;
};
  • MTCTaskNode 是一个类,表示 ROS 2 节点,并包含执行任务的功能:
    • MTCTaskNode: 构造函数,接受 NodeOptions 参数用于节点配置。
    • getNodeBaseInterface: 返回节点的基础接口,供 ROS 2 的执行器使用。
    • doTask: 定义并执行一个任务。
    • setupPlanningScene: 设置规划场景,定义场景中的物体。
    • createTask: 创建任务,并添加不同阶段的规划步骤。
    • task_: MTC 任务对象。
    • node_: ROS 2 节点共享指针。

实现 getNodeBaseInterface 函数

rclcpp::node_interfaces::NodeBaseInterface::SharedPtr MTCTaskNode::getNodeBaseInterface()
{return node_->get_node_base_interface();
}
  • 返回节点的基础接口,用于与 ROS 执行器交互。

实现 MTCTaskNode 构造函数

MTCTaskNode::MTCTaskNode(const rclcpp::NodeOptions& options): node_{ std::make_shared<rclcpp::Node>("mtc_node", options) }
{
}
  • 初始化函数,创建一个名为 mtc_node 的 ROS 2 节点,并传入选项。
1. 构造函数定义
MTCTaskNode::MTCTaskNode(const rclcpp::NodeOptions& options)
  • 这是 MTCTaskNode 类的构造函数,参数 optionsrclcpp::NodeOptions 类型的对象,表示 ROS 2 节点的选项配置。
  • 当用户创建 MTCTaskNode 的实例时,构造函数会被调用,用于初始化节点对象和类中的其他成员变量。
2. 成员初始化列表
: node_{ std::make_shared<rclcpp::Node>("mtc_node", options) }
  • : 后面的部分是成员初始化列表,用于直接初始化类的成员变量。相比在构造函数内部赋值,成员初始化列表在效率上可能更高,特别是当成员变量是对象或者共享指针时。
  • node_ 是类中的私有成员变量,类型为 rclcpp::Node::SharedPtr,即 ROS 2 节点的共享指针。
3. std::make_shared<rclcpp::Node>()
std::make_shared<rclcpp::Node>("mtc_node", options)
  • std::make_shared<rclcpp::Node>() 用于创建一个新的 rclcpp::Node 对象,并返回一个指向该对象的 std::shared_ptr(共享指针)。
  • 这个 Node 对象代表一个 ROS 2 节点,节点的名称为 "mtc_node",并且使用传入的 options 参数来配置该节点。
4. 成员变量 node_ 的赋值
  • 构造函数中的成员初始化列表将 std::make_shared<rclcpp::Node> 创建的共享指针赋值给类的成员变量 node_,这意味着 MTCTaskNode 类的实例会持有一个指向 ROS 2 节点的共享指针。
5. 节点名称和选项
  • "mtc_node" 是这个 ROS 2 节点的名称,它可以用于在 ROS 网络中唯一标识该节点。
  • optionsrclcpp::NodeOptions 对象,允许用户配置节点的一些选项(如参数自动声明等)。
总结

这段代码的作用是在构造 MTCTaskNode 类的实例时,通过 std::make_shared 创建了一个 ROS 2 节点对象,并将其存储在成员变量 node_ 中。通过成员初始化列表的方式,保证了对象的高效初始化,并且节点名称为 "mtc_node",选项通过参数 options 进行配置。

实现 setupPlanningScene

void MTCTaskNode::setupPlanningScene()
{moveit_msgs::msg::CollisionObject object;object.id = "object";object.header.frame_id = "world";object.primitives.resize(1);object.primitives[0].type = shape_msgs::msg::SolidPrimitive::CYLINDER;object.primitives[0].dimensions = { 0.1, 0.02 };geometry_msgs::msg::Pose pose;pose.position.x = 0.5;pose.position.y = -0.25;pose.orientation.w = 1.0;object.pose = pose;moveit::planning_interface::PlanningSceneInterface psi;psi.applyCollisionObject(object);
}
  • 创建一个障碍物对象(圆柱体),并将其添加到规划场景中。
    • CollisionObject: 定义碰撞对象的几何形状和位置信息。
    • PlanningSceneInterface: 用于管理与规划场景的交互。

实现 doTask 函数

void MTCTaskNode::doTask()
{task_ = createTask();try{task_.init();}catch (mtc::InitStageException& e){RCLCPP_ERROR_STREAM(LOGGER, e);return;}if (!task_.plan(5)){RCLCPP_ERROR_STREAM(LOGGER, "Task planning failed");return;}task_.introspection().publishSolution(*task_.solutions().front());auto result = task_.execute(*task_.solutions().front());if (result.val != moveit_msgs::msg::MoveItErrorCodes::SUCCESS){RCLCPP_ERROR_STREAM(LOGGER, "Task execution failed");return;}return;
}
  • 创建任务并尝试执行:
    • task_.init(): 初始化任务。
    • task_.plan(5): 规划 5 个不同的路径。
    • task_.execute(): 执行规划的解决方案。

实现 createTask 函数

mtc::Task MTCTaskNode::createTask()
{mtc::Task task;task.stages()->setName("demo task");task.loadRobotModel(node_);const auto& arm_group_name = "panda_arm";const auto& hand_group_name = "hand";const auto& hand_frame = "panda_hand";task.setProperty("group", arm_group_name);task.setProperty("eef", hand_group_name);task.setProperty("ik_frame", hand_frame);mtc::Stage* current_state_ptr = nullptr;auto stage_state_current = std::make_unique<mtc::stages::CurrentState>("current");current_state_ptr = stage_state_current.get();task.add(std::move(stage_state_current));auto sampling_planner = std::make_shared<mtc::solvers::PipelinePlanner>(node_);auto interpolation_planner = std::make_shared<mtc::solvers::JointInterpolationPlanner>();auto stage_open_hand =std::make_unique<mtc::stages::MoveTo>("open hand", interpolation_planner);stage_open_hand->setGroup(hand_group_name);stage_open_hand->setGoal("open");task.add(std::move(stage_open_hand));return task;
}
  • 定义任务并设置不同的阶段:
    • CurrentState: 获取当前状态。
    • PipelinePlanner: 采样规划器。
    • MoveTo: 指定机器人末端执行器移动到某个目标状态。

main 函数

int main(int argc, char** argv)
{rclcpp::init(argc, argv);rclcpp::NodeOptions options;options.automatically_declare_parameters_from_overrides(true);auto mtc_task_node = std::make_shared<MTCTaskNode>(options);rclcpp::executors::MultiThreadedExecutor executor;auto spin_thread = std::make_unique<std::thread>([&executor, &mtc_task_node]() {executor.add_node(mtc_task_node->getNodeBaseInterface());executor.spin();executor.remove_node(mtc_task_node->getNodeBaseInterface());});mtc_task_node->setupPlanningScene();mtc_task_node->doTask();spin_thread->join();rclcpp::shutdown();return 0;
}
  • main 函数是程序的入口点,初始化 ROS 2 并创建执行器与任务线程:
    • rclcpp::init: 初始化 ROS 2。
    • rclcpp::NodeOptions: 设置节点选项。
    • MultiThreadedExecutor: 用于多线程执行节点操作。
    • 创建并启动执行器线程来处理任务。

相关文章:

【Moveit2官方教程】使用 MoveIt Task Constructor (MTC) 框架来定义和执行一个机器人任务

#include <rclcpp/rclcpp.hpp> // ROS 2 的核心库 #include <moveit/planning_scene/planning_scene.h> // MoveIt 规划场景相关的头文件 #include <moveit/planning_scene_interface/planning_scene_interface.h> // MoveIt 规划场景接口 #include <m…...

使用docker配置wordpress

docker的安装 配置docker yum源 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo下载最新版本docker sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-…...

JVM字节码

JVM字节码详解 引言 JVM&#xff08;Java Virtual Machine&#xff0c;Java虚拟机&#xff09;字节码是一种中间代码&#xff0c;主要用于Java平台上的程序在不同硬件平台上的移植。Java程序通过编译器将源代码编译成字节码&#xff0c;然后通过JVM解释或即时编译&#xff08…...

python访问mysql

要在 Python 中访问 MySQL 数据库&#xff0c;通常会使用 mysql-connector-python 或 pymysql 这两个库之一。以下是使用这两个库的基本示例&#xff1a; 使用 mysql-connector-python 安装库: pip install mysql-connector-python示例代码: import mysql.connector# 连接到 M…...

Java工具插件

一、springboot集成mqtt订阅 阿里云MQTT使用教程_复杂的世界311的博客-CSDN博客_阿里云mqtt 阿里云创建MQTT服务 先找到产品与服务,然后选择物联网平台,找到公共实例,创建一个产品。 创建产品 然后在左侧下拉栏找到设备管理,在设备管理下拉栏找到设备,然后添加设备。添加…...

Class3——Esp32|Thonny——网络连接主机-wifi连接(源代码带教程)

废话不多说——直接上配置源码和图片 一.电脑连接到wifi上&#xff08;不能是5G&#xff09; 二.网络调试助手信息设置绑定 1.获取电脑wifi信息 2.设置网络调试助手为一致&#xff0c;然后打开&#xff0c;主机地址是上面的192.168.2.149端口自己设置&#xff0c;UDP然后打开…...

特效【生日视频制作】小车汽车黄金色版悍马车身AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程小车汽车黄金色版悍马车身AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】小车汽车黄金色版悍马车身AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 下载AE模板 安装AE软件 把AE模板导入…...

如何利用Java进行快速的足球大小球及亚盘数据处理与分析

在当今信息爆炸的时代&#xff0c;大量的数据产生和积累&#xff0c;对于企业和个人来说&#xff0c;如何高效地处理和分析这些数据成为了一项重要的任务。Java作为一门强大的编程语言&#xff0c;提供了丰富的工具和库&#xff0c;可以帮助我们快速进行数据处理与分析。下面将…...

代码随想录打卡Day29

今天的题目尊嘟好难…除了第三题没看视频&#xff0c;其他的题目都是看了视频才做出来的。二刷等我。 134. 加油站 感觉这道题和之前的53. 最大子序和有点像&#xff0c;最大子序和是一旦当前总和为负数则立即抛弃当前的总和&#xff0c;从下个位置重新开始计算&#xff0c;而…...

图分类!!!

deepwalk 使用图中节点与节点的共现关系来学习节点的向量表示。那么关键的问题就是如何来描述节点与节点的共现关系&#xff0c;DeepWalk给出的方法是使用随机游走(RandomWalk)的方式在图中进行节点采样,RandomWalk是一种可重复访问已访问节点的深度优先遍历算法。给定当前访问…...

高防IP是如何防御攻击

DDoS攻击作为网络攻击中最常见的一种&#xff0c;一般利用大量的虚假流量向目标服务器发起攻击&#xff0c;进而堵塞网络损耗服务器性能&#xff0c;使服务器呈现崩溃状态&#xff0c;令真正的用户无法正常访问发送请求。以前的大型企业通常都是使用高防服务器来抵抗这类攻击&a…...

Kubernetes 系列 | k8s入门运维

目录 一、K8S集群搭建1.1 部署方式1.2 了解kubeadm1.3 部署流程1.3.1 初始化配置1.3.2 安装容器运行时1.3.3 安装K8S软件包1.3.4 创建集群 二、集群高可用1.1 集群高可用-堆叠1.2 集群高可用-集群外etcd 三、Pod运维3.1 Pod运维3.2 Pod的生命周期3.3 Pod状况3.4 Pod阶段3.5 容器…...

yolov8+deepsort+botsort+bytetrack车辆检测和测速系统

结合YOLOv8、DeepSORT、BoTSORT和ByteTrack等技术&#xff0c;可以实现一个高效的车辆检测和测速系统。这样的系统适用于交通监控、智能交通管理系统&#xff08;ITS&#xff09;等领域&#xff0c;能够实时识别并跟踪车辆&#xff0c;并估算其速度。 项目介绍 本项目旨在开发…...

基于准静态自适应环型缓存器(QSARC)的taskBus万兆吞吐实现

文章目录 概要整体架构流程技术名词解释技术细节1. 数据结构2. 自适应计算队列大小3. 生产者拼接缓存4. 高效地通知消费者 小结1. 性能表现情况2. 主要改进和局限3. 源码和发行版 概要 准静态自适应环形缓存器&#xff08;Quasi-Static Adaptive Ring Cache&#xff09;是task…...

C++笔记---指针常量和常量指针

巧记方法&#xff08;方法来自于网络出处忘记了&#xff09;&#xff1a;const读作常量&#xff0c;*读作指针&#xff0c;按顺序读即可。例如&#xff1a; const int * ptr; //const在前*在后读作常量指针 const * int ptr; //const在前*在后读作常量指针 int * const prt; /…...

Python习题 177:设计银行账户类并实现存取款功能

(编码题)Python 实现一个简单的银行账户类 BankAccount,包含初始化方法、存款、取款、获取余额等功能。 参考答案 分析需求如下。 Python 类 BankAccount,用于模拟银行账户的基本功能。该类应包含以下方法: 初始化方法: 接受两个参数:account_holder(账户持有人的姓…...

IPhone 16:它的 “苹果智能 “包括哪些内容?

IPhone 16 的发布让科技界看到了该公司的人工智能产品 “苹果智能”&#xff08;Apple Intelligence&#xff09;究竟能做些什么。 苹果公司发布了拥有人工智能硬件升级的最新款 iPhone 16&#xff0c;进一步进军人工智能领域。苹果公司首席执行官蒂姆-库克&#xff08;Tim Coo…...

【中国国际航空-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…...

【ArcGIS】栅格计算器原理及案例介绍

ArcGIS&#xff1a;栅格计算器原理及案例介绍 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍案例案例1&#xff1a;计算栅格数据平均值 参考 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍 描述&#xff1a;在类似计算器的界面中&#xff0c;…...

LOOKUP函数和VLOOKUP函数知识讲解与案例演示

〇、需求 在 Excel 文档中&#xff0c;根据查找值从查找域和结果域构成的数组中&#xff0c;找到对应的结果值。 一、知识点讲解 LOOKUP函数&#xff08;比较常用&#xff0c;推荐&#xff09;和VLOOKUP函数 两个公式都可以实现上述需求。 1. LOOKUP 函数 1.1 单个查询条件…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...