ROS2 库包设置和使用 Catch2 进行单元测试

news2024/11/27 21:49:07

说明

        本文的目的是了解如何在 ROS2 中创建库,以供其他 ROS2 包使用。除此之外,本文还介绍了如何使用 catch2 框架编写单元测试。本文的第 1 部分将详细介绍如何创建库包。第 2 部分将介绍 ROS2 软件包如何利用创建的库

上篇  ROS2 库包设置和使用 Catch2 进行单元测试

一、项目结构大纲

库的流程

  1. 在包含/点下为 2d 点创建标题.hpp
  2. 在 src/point 下为 2d 点添加实现类.cpp
  3. 为测试下的测试类/主类创建入口点.cpp
  4. 在测试/test_point.cpp下添加单元测试
  5. 在 cmake/try_out_utils-config.cmake.in 下为 cmake 添加命名空间配置
  6. 在根项目目录下创建 CMakeLists.txt (此处指定了 lib 的配置)
  7. 在根项目目录下创建包.xml

 二、程序代码实现

2.1 为 2d 点创建标题.hpp

// include/try_out_utils/point.hpp

#ifndef TRY_OUT_UTILS__POINT_HPP_
#define TRY_OUT_UTILS__POINT_HPP_

namespace try_out_utils
{
class Point
{
private:
  double x_;
  double y_;

public:
  Point(double x, double y);
  double get_x();
  double get_y();
};
}  // namespace try_out_utils

#endif  // TRY_OUT_UTILS__POINT_HPP_

 2.2 为 2d 点添加实现类.cpp

        具有两个私有变量 x 和 y 的标头类,用于表示 2d 中的点及其 getter 和 setter 方法

// src/point.cpp
#include <try_out_utils/point.hpp>
Point::Point(double x, double y)
{
  this->x_ = x;
  this->y_ = y;
}
double Point::get_x()
{
  return this->x_;
}
double Point::get_y()
{
  return this->y_;
}

之前在标头类中声明的 2d 点的实现类

// test/main.cpp
#define CATCH_CONFIG_MAIN
#include <catch2/catch.hpp>

测试用例的 Catch2 入口点

// test/test_point.cpp
#include <catch2/catch.hpp>
#include <try_out_utils/point.hpp>
TEST_CASE("Test for point", "[]")
{
  SECTION("Test for point with object creation")
  {
    Point p(11, 10);
    REQUIRE(p.get_x() == 11);
    REQUIRE(p.get_y() == 10);
  }
}

对点类进行单元测试以创建新的点对象

@PACKAGE_INIT@

get_filename_component(try_out_utils_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)

include(CMakeFindDependencyMacro)

if(NOT TARGET try_out_utils::try_out_utils)
    include("${try_out_utils_CMAKE_DIR}/try_out_utils-targets.cmake")
endif()

check_required_components(try_out_utils)

三、编译文件CMake

Cmake 配置别名,以便外部包可以引用该库作为 try_out_utils::try_out_utils

# setting up cmake minimum version and project name
cmake_minimum_required(VERSION 3.8)
project(try_out_utils VERSION 0.1.0)

# setting c++ version standard to 17
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 17)
endif()

# adding compiler arguments
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# added to use install directory variables
include(GNUInstallDirs)

# adding external dependencies required
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(ament_cmake_catch2 REQUIRED)
find_package(Catch2 REQUIRED)

# creating library package with reference to required files
add_library(${PROJECT_NAME} SHARED
  src/point.cpp
)

# including external directories reference for the created library
target_include_directories(try_out_utils PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

# helpers functions for creating config files that can be included by other projects to find and use a package
include(CMakePackageConfigHelpers)

set(INSTALL_CONFIG_DIR "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake")
set(PACKAGE_CONFIG_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake")
set(PACKAGE_CONFIG_FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake")

# creating version configuration for external package to perform compatibility check
configure_package_config_file(
  "${CMAKE_CURRENT_LIST_DIR}/cmake/${PROJECT_NAME}-config.cmake.in"
  ${PACKAGE_CONFIG_FILE}
  INSTALL_DESTINATION ${INSTALL_CONFIG_DIR}
)

# creating version configuration for external package to perform compatibility check
write_basic_package_version_file(
  ${PACKAGE_CONFIG_VERSION_FILE}
  COMPATIBILITY ExactVersion
)

# installing library files
install(
  TARGETS try_out_utils
  EXPORT try_out_utils-targets
  DESTINATION lib
)

# installing all reference header files
install(
    DIRECTORY include/try_out_utils
    DESTINATION include/
)

# installing cmake config files for try_out_utils
install(
  FILES
    ${PACKAGE_CONFIG_VERSION_FILE}
    ${PACKAGE_CONFIG_FILE}
  DESTINATION ${INSTALL_CONFIG_DIR}
)

# installing cmake config files for try_out_utils-targets
install(
  EXPORT try_out_utils-targets
  FILE try_out_utils-targets.cmake
  NAMESPACE try_out_utils::
  DESTINATION ${INSTALL_CONFIG_DIR}
)

# exporting the try_out_utils-target cmake config to build folder
export(
  EXPORT try_out_utils-targets
  FILE ${CMAKE_CURRENT_BINARY_DIR}/try_out_utils-targets.cmake
  NAMESPACE try_out_utils::
)

# checking whether build includes test
if(BUILD_TESTING)
  # listing files for testing
  file(GLOB_RECURSE unit_test_srcs "test/*.cpp")

  # adding listed files for testing
  ament_add_catch2(test_try_out_utils ${unit_test_srcs} TIMEOUT 300)

  # linking libraries required to the current package for testing
  target_link_libraries(
    test_try_out_utils
    try_out_utils
    Catch2::Catch2
  )

  find_package(ament_lint_auto REQUIRED)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

   让我们详细介绍一下上面创建的cmakelist

  1. include(GNUInstallDirs) — 允许使用 cmake 安装变量
  2. add_library — 使用指定的参照文件创建库
  3. target_include_directories — 要包含在目标中的内部和外部包中的目录
  4. include(CMakePackageConfigHelpers) — 用于创建配置文件的帮助程序函数,其他项目可以包含这些文件来查找和使用包
  5. configure_package_config_file — 在创建用于安装项目或库的 or 文件时,应使用代替普通命令。它通过避免已安装文件中的硬编码路径来帮助使生成的包可重定位configure_package_config_file()configure_file()<PackageName>Config.cmake<PackageName>-config.cmakeConfig.cmake
  6. write_basic_package_version_file — 应该用于创建版本配置文件,以便导入此库的外部包可以执行与此处提供的版本兼容性检查
  7. 在目标位置安装目录 — 表单将一个或多个目录的内容安装到给定目标DIRECTORY
  8. 在目标位置安装文件 — 表单指定为项目安装文件的规则。在指定目标中安装文件FILES
  9. 在目标位置安装导出 — 该窗体生成并安装一个 Make 文件,其中包含用于将目标从安装树导入到另一个项目中的代码EXPORT
  10. 出口 — 创建一个可能由外部项目包含的文件,以从当前项目的生成树中导入命名的目标。这在交叉编译期间非常有用,可以生成实用程序可执行文件,这些实用程序可执行文件可以在一个项目中的主机平台上运行,然后将它们导入到为目标平台编译的另一个项目中。将字符串附加到写入文件的所有目标名称前面<filename><target>...(NAMESPACE)<namespace>
  11. 使用导出在目标位置安装目标 — 在指定目标位置安装目标的代码段。选项将已安装的目标文件与名为EXPORT<export-name>
  12. ament_add_catch2 — 使用为测试提供的测试文件创建测试目标
  13. target_link_libraries — 将目标与指定的
    库链接起来(Ament 是一个用 Cmake 编写的包装器,用于简化 colcon 构建的一些功能)
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>try_out_utils</name>
  <version>0.1.0</version>
  <description>Utility package for commonly used functions</description>
  <maintainer email="sample@email.com">santosh balaji</maintainer>
  <license>Apache License 2.0</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>
  <test_depend>ament_cmake_catch2</test_depend>
  <test_depend>ament_cmake_uncrustify</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

  四、包依赖关系

      用于指定依赖项的包文件

# To build created package
colcon build --packages-select try_out_utils

# To run tests on package
colcon test --event-handlers console_direct+ --packages-select try_out_utils
      

        运行上述命令以构建和测试库包

执行后的测试结果

下篇 ROS2 库包设置和使用 Catch2 进行单元测试

五、项目结构大纲

六、库的流程

  1. 在包含/try_out/point_checker.hpp 下为逻辑函数创建标头
  2. 在 src/point_checker.cpp 下为逻辑函数添加实现类
  3. 为测试下的测试类/主类创建入口点.cpp
  4. 在测试/test_point_checker.cpp下添加单元测试
  5. 在根项目目录下创建 CMakeLists.txt
  6. 在根项目目录下创建包.xml

七、程序实现

// include/try_out/point_checker.hpp
#ifndef TRY_OUT__POINT_CHECKER_HPP_
#define TRY_OUT__POINT_CHECKER_HPP_

#include <try_out_utils/point.hpp>
#include <memory>
#include <cmath>
#include <vector>

class PointChecker
{
private:
  std::vector<try_out_utils::Point *> points_;

public:
  void add_point(double x, double y);
  std::vector<std::vector<double>> find_distance_matrix();
};

#endif  // TRY_OUT__POINT_CHECKER_HPP_

带有向量的标头类,用于存储点和逻辑函数

// src/point_checker.cpp

#include <try_out/point_checker.hpp>

#include <vector>

void PointChecker::add_point(double x, double y)
{
  try_out_utils::Point * point = new try_out_utils::Point(x, y);
  this->points_.push_back(point);
}

std::vector<std::vector<double>> PointChecker::find_distance_matrix()
{
  std::vector<std::vector<double>> overall_vect;
  for (unsigned int i = 0; i < this->points_.size(); i++) {
    std::vector<double> inner_vect;
    for (unsigned int j = 0; j < this->points_.size(); j++) {
      double x_compute =
        (this->points_[j]->get_x() - this->points_[i]->get_x()) *
        (this->points_[j]->get_x() - this->points_[i]->get_x());
      double y_compute =
        (this->points_[j]->get_y() - this->points_[i]->get_y()) *
        (this->points_[j]->get_y() - this->points_[i]->get_y());
      double distance = std::sqrt(x_compute + y_compute);
      inner_vect.push_back(distance);
    }
    overall_vect.push_back(inner_vect);
  }
  return overall_vect;
}

int main()
{
  PointChecker point_checker;
  point_checker.add_point(5, 5);
  return 0;
}

前面在标头中声明的逻辑类的实现类。此处添加了距离计算逻辑

// test/main.cpp
#define CATCH_CONFIG_MAIN
#include <catch2/catch.hpp>

测试用例的 Catch2 入口点

// test/test_point_checker.cpp

#include <catch2/catch.hpp>
#include <try_out/point_checker.hpp>
#include <vector>
#include <cmath>
TEST_CASE("Test for point checker", "[]")
{
  SECTION("Test for distance matrix computation"
  {
    PointChecker point_checker;
    point_checker.add_point(1, 1);
    point_checker.add_point(2, 2);
    point_checker.add_point(3, 3);
    std::vector<std::vector<double>> result = 
      point_checker.find_distance_matrix();
    REQUIRE(result.size() == 3);
    REQUIRE(result[0].size() == 3);
    REQUIRE(result[1].size() == 3);
    REQUIRE(result[2].size() == 3);
    REQUIRE(result[0][0] == 0);
    REQUIRE(std::round(result[0][1] - 1.4142135624) == 0);
    REQUIRE(std::round(result[0][2] - 2.8284271247) == 0);
    REQUIRE(std::round(result[1][2] - 1.4142135624) == 0);
    REQUIRE(result[1][1] == 0);
    REQUIRE(std::round(result[1][2] - 1.4142135624) == 0);
    REQUIRE(std::round(result[2][0] - 2.8284271247) == 0);
    REQUIRE(std::round(result[2][1] - 1.4142135624) == 0); 
    REQUIRE(result[2][2] == 0);
  }
}

点检查器类的单元测试,用于计算提供的点之间的距离

# setting up cmake minimum version and project name
cmake_minimum_required(VERSION 3.8)
project(try_out VERSION 0.1.0)

# setting c++ version standard to 17
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 17)
endif()

# adding compiler arguments
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# adding external dependencies required
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(try_out_utils REQUIRED)
find_package(ament_cmake_catch2 REQUIRED)
find_package(Catch2 REQUIRED)

# creating library package with reference to required files
add_library(try_out SHARED
  src/point_checker.cpp
)

# including external directory reference for the created library
target_include_directories(try_out PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  ${rclcpp_INCLUDE_DIRS})

# including external library reference for the created library
target_link_libraries(try_out
  PUBLIC
    try_out_utils::try_out_utils
)

# creating executables with reference to required files
add_executable(
  try src/point_checker.cpp)

# including external directory reference for the created executable
target_include_directories(try PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  ${rclcpp_INCLUDE_DIRS})

# including external library reference for the created executable
target_link_libraries(try
  ${rclcpp_LIBRARIES}
  try_out_utils::try_out_utils
)

# installing executable file
install(TARGETS
try
DESTINATION lib})

# installing library file
install(
  TARGETS try_out
  DESTINATION lib
)

# installing all reference header files
install(
    DIRECTORY include/try_out
    DESTINATION include/
)

# checking whether build includes test
if(BUILD_TESTING)
  # listing files for testing
  file(GLOB_RECURSE unit_test_srcs "test/*.cpp")

  # adding listed files for testing
  ament_add_catch2(test_try_out ${unit_test_srcs} TIMEOUT 300)

  # linking libraries required to the current package for testing
  target_link_libraries(test_try_out
  try_out
  try_out_utils::try_out_utils
  Catch2::Catch2)

  find_package(ament_lint_auto REQUIRED)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

九、编译环节

让我们详细介绍一下上面创建的cmakelist

  1. add_library — 使用指定的参照文件创建库
  2. add_executable — 使用指定文件创建可执行文件
  3. target_include_directories — 要包含在目标中的内部和外部包中的目录。可以使用命令
  4. target_link_libraries — 将目标与指定的库链接
  5. 在目标位置安装目录 — 表单将一个或多个目录的内容安装到给定目标DIRECTORY
  6. 在目标位置安装目标 — 表单指定从项目安装目标的规则TARGETS
  7. ament_add_catch2 — 使用提供的
    测试文件创建测试目标(Ament 是一个用 Cmake 编写的包装器,用于简化 colcon 构建的一些功能)
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>try_out</name>
  <version>0.1.0</version>
  <description>Work package which utilizes the created library package</description>
  <maintainer email="santechselva@gmail.com">santosh balaji</maintainer>
  <license>Apache License 2.0</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>try_out_utils</depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>
  <test_depend>ament_cmake_catch2</test_depend>
  <test_depend>ament_cmake_uncrustify</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

十、单元测试实现

        用于指定依赖项的包文件

# To build created package
colcon build --packages-select try_out

# To run tests on package
colcon test --event-handlers console_direct+ --packages-select try_out

运行上述命令以构建和测试库包

执行后的测试结果

参考资料
GitHub - open-rmf/rmf_utils: Internal utilities for RMF libraries (Robotics middleware framework utilities)
GitHub - open-rmf/rmf_traffic: Traffic management libraries for RMF (Traffic management framework which uses the utility library)
CMake Reference Documentation — CMake 3.27.6 Documentation (Cmake documentation)
ament_cmake user documentation — ROS 2 Documentation: Foxy documentation (Enhanced version of Cmake for ROS2 packages)

Source code
GitHub - santoshbalaji/ros2-library-package-medium: Repository which has package used for ROS2 based work package tutorial

罗斯2
克马克
第2条军规
科尔康
阿门特

 

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

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

相关文章

postgresql-管理数据表

postgresql-管理数据表 创建表数据类型字段约束表级约束模式搜索路径 修改表添加字段删除字段添加约束删除约束修改字段默认值修改字段数据类型重命名字段重命名表 删除表 创建表 在 PostgreSQL 中&#xff0c;使用 CREATE TABLE 语句创建一个新表&#xff1a; CREATE TABLE …

二、BurpSuite Scan扫描

1.Scan details 解释&#xff1a;选择只是爬行还是爬行加代码审计 Scan Type&#xff1a;选择爬行或者代码审计URLs to scan&#xff1a;定义要扫描的网址。Burp将从这些网址开始进行爬行&#xff0c;并默认将包括指定网址文件夹下的所有内容。Protocol settings&#xff1a;使…

【Office】超简单,Excel快速完成不规则合并单元格排序

演示效果&#xff1a;将下图已经合并了的单元格按照单位名称排序并将同一个单位的数据合并在了一起。 Step 1&#xff1a;取消合并 选中所有的数据后&#xff0c;点击 “开始”-“合并单元格” &#xff0c;并且取消数据源的合并。 Step 2&#xff1a;填充数据 选中需要填…

宝塔反代openai官方API接口详细教程,502 Bad Gateway问题解决

一、前言 宝塔反代openai官方API接口详细教程&#xff0c;实现国内使用ChatGPT502 Bad Gateway问题解决&#xff0c; 此方法最简单快捷&#xff0c;没有复杂步骤&#xff0c;不容易出错&#xff0c;即最简单&#xff0c;零代码、零部署的方法。 二、实现前提 一台海外VPS服务…

Python Cartopy地图投影【3】

上两期文章见&#xff1a; Python Cartopy地图投影【1】 第一期文章内容纲要&#xff1a; step1: 开始地图投影 step2: GeoAxes 的常用方法 2.1 add_feature&#xff1a;添加海岸线、河流、湖泊等地理特征 2.2 gridlines&#xff1a;添加网格线以及相应标签等 Python Cartopy地…

最新AI智能创作系统ChatGPT商业源码+详细图文搭建部署教程+AI绘画系统

一、AI系统介绍 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&am…

深度学习(2)---循环神经网络(RNN)

文章目录 一、序列数据和语言模型1.1 序列数据1.2 语言模型 二、循环神经网络(RNN)2.1 概述2.2 门控循环单元(GRU)2.3 长短期记忆网络(LSTM) 一、序列数据和语言模型 1.1 序列数据 1. 在深度学习中&#xff0c;序列数据&#xff08;Sequence data&#xff09;是指具有前后顺序…

华为:数据治理方法论

导读 本文先概要介绍了数据治理框架、数据治理组织架构和数据治理度量评估体系&#xff0c;然后结合华为数据治理案例和新冠疫情简单描述了数据治理的应用&#xff0c;最后描述了DAYU方法论在DataArts Studio产品上的落地以及详细的落地指导文档。 加gzh“大数据食铁兽”&am…

[题]欧拉函数 #欧拉函数

目录 欧拉函数一、用公式求代码 二、线性筛法求欧拉函数扩展欧拉定理 欧拉函数 AcWing 873. 欧拉函数 一、用公式求 定义&#xff1a;1 ~ N 中与 N 互质的数的个数被称为欧拉函数&#xff0c;记为ϕ(N)。 怎么求呢&#xff1f;&#xff1f; 有一个公式&#xff1a; N p1a1 X…

《Vue.js+Spring Boot全栈开发实战》简介

大家好&#xff0c;我是老卫。 恰逢中秋国庆双节&#xff0c;不想出门看人山&#xff0c;惟愿宅家阅书海&#xff01; 今天开箱的这本书是《Vue.jsSpring Boot全栈开发实战》。 外观 从书名故名思议&#xff0c;就是基于Vue.jsSpring Boot来实现企业级应用全栈开发。 该书由…

(2023,ControlNet,CFGRW,diffusion,控制组合)向文本到图像扩散模型添加条件控制

Adding Conditional Control to Text-to-Image Diffusion Models 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2.相关工作 2.1. 微调神经网络 2.2. 图像扩散 …

基于electron25+vite4创建多窗口|vue3+electron25新开模态窗体

在写这篇文章的时候&#xff0c;查看了下electron最新稳定版本由几天前24.4.0升级到了25了&#xff0c;不得不说electron团队迭代速度之快&#xff01; 前几天有分享一篇electron24整合vite4全家桶技术构建桌面端vue3应用示例程序。 https://www.cnblogs.com/xiaoyan2017/p/17…

【C++哈希应用】位图、布隆过滤器

【C哈希应用】位图、布隆过滤器 目录 【C哈希应用】位图、布隆过滤器位图概念位图的实现位图改造位图应用总结布隆过滤器布隆过滤器的提出布隆过滤器的概念布隆过滤器的查找布隆过滤器删除布隆过滤器优点布隆过滤器缺陷 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2023.9…

【人物】知识就是金钱,程序员搞副业年入200万,各行各业的你也可以效仿

优秀的普通人 大家好&#xff0c;我是老李。一个专注于收集互联网有用信息的博主。 今天我们这一期要讲的是人物。讲什么人物呢&#xff1f; 首先我们不会讲一些特别知名和特别牛逼的人物&#xff0c;比如马云&#xff0c;雷军。刘强东。这些人固然很厉害很成功&#xff0c;…

【【萌新的RiscV学习之流水线控制-9】】

萌新的RiscV学习之流水线控制-9 我们按照在之前的单周期设计加入控制单元 那么我们能够在后续的设计中提供方便 我们也在流水线中加入一个control单元 我们先按照书上的指令op码值介绍一遍基本功能 接下来我们讲述control 的 控制效果 关于这些串口判别的使用 由于控制线从…

状态压缩dp,291. 蒙德里安的梦想

291. 蒙德里安的梦想 - AcWing题库 求把 NM 的棋盘分割成若干个 12 的长方形&#xff0c;有多少种方案。 例如当 N2&#xff0c;M4 时&#xff0c;共有 5 种方案。当 N2&#xff0c;M3 时&#xff0c;共有 3 种方案。 如下图所示&#xff1a; 输入格式 输入包含多组测试用例…

【yolov5】原理详解

一.模型框架 二.对Yolov5的描述 Yolov5的模型主要由 输入、Backbone、Neck、Head、输出 五部分组成。2.1 输入 输入 640x640x32.2 backbone Backbone&#xff1a;负责提取输入图像的特征。 在Yolov5中&#xff0c;常见的Backbone网络包括CSPDarknet53或ResNet。这些网络都是…

uniapp使用scroll-into-view实现锚点定位和滚动监听功能【楼层效果 / 侧边导航联动效果】

大佬网址&#xff1a; https://blog.csdn.net/weixin_47136265/article/details/132303570 效果 代码 <template><!-- 这里面有2个bug&#xff0c;已经解决&#xff0c;需要知道的地方1.methods里的scrollEvt(e)方法里面的 this.tabIndex index ! -1 ? index :…

python -m pip install --upgrade pip失败

显示这样的报错&#xff1a; You are using pip version 9.0.1, however version 23.2.1 is available. You should consider upgrading via the python -m pip install --upgrade pip command. 换源安装 python -m pip install --upgrade pip -i https://pypi.douban.com/s…