当前位置: 首页 > 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 单个查询条件…...

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 //第一…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

python可视化:俄乌战争时间线关键节点与深层原因

俄乌战争时间线可视化分析&#xff1a;关键节点与深层原因 俄乌战争是21世纪欧洲最具影响力的地缘政治冲突之一&#xff0c;自2022年2月爆发以来已持续超过3年。 本文将通过Python可视化工具&#xff0c;系统分析这场战争的时间线、关键节点及其背后的深层原因&#xff0c;全面…...

React、Git、计网、发展趋势等内容——前端面试宝典(字节、小红书和美团)

React React Hook实现架构、.Hook不能在循环嵌套语句中使用 , 为什么&#xff0c;Fiber架构&#xff0c;面试向面试官介绍&#xff0c;详细解释 用户: React Hook实现架构、.Hook不能在循环嵌套语句中使用 , 为什么&#xff0c;Fiber架构&#xff0c;面试向面试官介绍&#x…...

Android Settings 数据库生成、监听与默认值配置

一、Settings 数据库生成机制​ ​传统数据库生成&#xff08;Android 6.0 前&#xff09;​​ ​路径​&#xff1a;/data/data/com.android.providers.settings/databases/settings.db​创建流程​&#xff1a; ​SQL 脚本初始化​&#xff1a;通过 sqlite 工具创建数据库文件…...