Java如何实现PDF转高质量图片

在这里插入图片描述
大家好,我是 V 哥。在Java中,将PDF文件转换为高质量的图片可以使用不同的库,其中最常用的库之一是 Apache PDFBox。通过该库,你可以读取PDF文件,并将每一页转换为图像文件。为了提高图像的质量,你可以指定分辨率等参数。此外,也可以结合 Java ImageIO 来保存生成的图片文件。

如何实现

下面V哥通过一个详细的案例,来展示如何使用 PDFBox 实现 PDF 转高质量图片:

所需依赖

首先,确保你已经在项目中添加了 PDFBox 依赖。你可以通过Maven来添加:

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.29</version> <!-- 确保使用最新的版本 -->
</dependency>

实现步骤

先来捋一下实现步骤哈。

  1. 加载 PDF 文件
  2. 设置渲染参数(如 DPI 来控制图片分辨率)
  3. 将每页 PDF 渲染为图片
  4. 保存图片

通过以上1,2,3,4个步骤,咱们具体来实现一下代码:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class VGPdfToImage {

    public static void main(String[] args) {
        // PDF文件路径
        String pdfFilePath = "path/to/your/pdf/vg_doc.pdf";
        // 输出图片文件夹路径
        String outputDir = "path/to/output/images/";

        // 设置DPI(越高图片越清晰,但文件也会更大)
        int dpi = 300;

        try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            
            // 遍历PDF每一页并转换为图片
            for (int page = 0; page < document.getNumberOfPages(); ++page) {
                // 使用BufferedImage来表示图像
                BufferedImage bim = pdfRenderer.renderImageWithDPI(page, dpi);
                
                // 生成文件名
                String fileName = outputDir + "pdf_page_" + (page + 1) + ".png";
                
                // 将图片保存为PNG格式
                ImageIO.write(bim, "png", new File(fileName));
                
                System.out.println("Saved page " + (page + 1) + " as image.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

来解释一下

  1. PDFRenderer: PDFBox 提供的 PDFRenderer 类用于将 PDF 文档页渲染为图像对象(BufferedImage)。
  2. renderImageWithDPI: 该方法可以指定DPI(每英寸点数),它直接影响图片的分辨率。通常,72 DPI 是屏幕显示的默认分辨率,而300 DPI 被视为高质量打印的分辨率。
  3. ImageIO: Java的 ImageIO 用于将 BufferedImage 保存为 PNG、JPEG 等常见图片格式。

输出效果

  • 每一页的PDF将被单独渲染为一张图片,并且通过高DPI参数设置,图片的质量较高。
  • 输出的文件路径为 outputDir 指定的路径,图片将被保存为PNG格式。你也可以更改保存格式为JPEG等。

可调整的项有

  • DPI 设置: 如果你希望输出更高质量的图片,可以将 DPI 设置为 300 或更高。如果需要快速渲染且质量要求不高,可以设置为72 DPI。
  • 图片格式: ImageIO.write() 可以使用不同的格式,如 "jpg""png",根据需求调整。

注意一下,确保你的PDFBox库版本是较新的版本,如2.x系列,来保证支持更多的PDF功能和修复潜在问题。

以上就是一个简单的实现过程DEMO,那在实际应用中,一定会有特定问题,问题来了,如何你要处理的 PDF 文件比较大,或者页数比较多,那必定是要考虑性能问题滴。就这两个问题,V 哥来优化一下。

两个可能的性能优化问题

  1. 缓存策略:对于较大的 PDF 文件,你可以使用某些缓存策略来优化性能。
  2. 并行处理:如果你需要处理很多页的 PDF,可以通过多线程并行处理每一页以提升速度。

缓存策略优化

当要处理较大的 PDF 文件时,咱们使用缓存策略可以显著优化性能,特别是对于那些需要处理多个页面或反复渲染的情况。对于 PDF 渲染操作,缓存策略主要是为了减少对磁盘或内存的反复访问,从而加快读取、渲染速度并节省内存。

在 Java 中,可以通过以下几种方式实现缓存优化:

  1. 内存缓存:将已处理的页面保存在内存中,当需要重复访问这些页面时直接从缓存中获取。
  2. 磁盘缓存:如果内存不足以缓存所有页面,可以将页面渲染结果或部分中间数据缓存到磁盘上。
  3. 逐页处理:只在需要时加载并处理某些页面,而不是一次性加载整个PDF文件。

采用实现内存缓存的案例

采用内存缓存,咱们可以使用 ConcurrentHashMap 来实现,将已经渲染的 PDF 页面存储在内存中,避免重复渲染。

来看一个使用内存缓存的详细实现案例:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

public class PdfToImageWithCache {

    // 用于缓存已渲染的PDF页面(使用ConcurrentHashMap确保线程安全)
    private static final ConcurrentHashMap<Integer, BufferedImage> imageCache = new ConcurrentHashMap<>();
    private static final int dpi = 300; // 高质量DPI设置
    
    public static void main(String[] args) {
        // PDF文件路径
        String pdfFilePath = "path/to/your/large/pdf/ vg_doc.pdf";
        // 输出图片文件夹路径
        String outputDir = "path/to/output/images/";

        try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            
            // 获取页面总数
            int totalPages = document.getNumberOfPages();
            System.out.println("Total pages: " + totalPages);
            
            // 渲染并缓存每一页
            for (int page = 0; page < totalPages; ++page) {
                BufferedImage image = renderPageWithCache(pdfRenderer, page);
                
                // 保存图片
                String fileName = outputDir + "pdf_page_" + (page + 1) + ".png";
                ImageIO.write(image, "png", new File(fileName));
                
                System.out.println("Saved page " + (page + 1) + " as image.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 使用缓存渲染PDF页面
     * @param pdfRenderer PDFRenderer实例
     * @param page 页码(从0开始)
     * @return 缓存或渲染后的BufferedImage
     */
    private static BufferedImage renderPageWithCache(PDFRenderer pdfRenderer, int page) throws IOException {
        // 检查缓存是否已存在该页面的图像
        if (imageCache.containsKey(page)) {
            System.out.println("Page " + (page + 1) + " found in cache.");
            return imageCache.get(page);
        }

        // 如果缓存中不存在,则渲染并存入缓存
        System.out.println("Rendering page " + (page + 1) + "...");
        BufferedImage image = pdfRenderer.renderImageWithDPI(page, dpi);
        imageCache.put(page, image);
        return image;
    }
}
解释一下代码
  1. 内存缓存(ConcurrentHashMap:

    • 使用 ConcurrentHashMap<Integer, BufferedImage> 作为缓存结构,Integer 代表页面的索引(从0开始),BufferedImage 代表已渲染的图像。
    • 每次渲染页面前,先检查缓存中是否存在该页面的图像,如果已存在,则直接返回缓存的图像,否则渲染并保存到缓存中。
  2. renderPageWithCache 方法:

    • 该方法首先检查页面是否在缓存中,如果在,则直接从缓存中获取。
    • 如果缓存中不存在该页面的图像,则渲染并将其保存到缓存中。
  3. DPI 设置:

    • dpi 参数设置为300以确保输出的图像质量足够高。
  4. 逐页渲染:

    • 使用 for 循环逐页处理,避免一次性加载所有页面到内存。对于每页图像的渲染,若该页面已经渲染过,则直接从缓存中获取。
这样优化的好处是啥
  1. 内存缓存的好处:

    • 当你需要多次访问或保存某些页面时,内存缓存可以避免重复渲染,从而提升性能。
    • 对于较大的PDF文件,如果反复操作相同的页面,缓存能显著减少处理时间。
  2. 并发支持:

    • ConcurrentHashMap 保证了在多线程环境下缓存操作的安全性,可以安全地在多线程中使用。
  3. 控制内存占用:

    • 如果内存使用量过大,可以根据情况定期清理缓存,或者在缓存中限制最大保存数量,使用类似LRU(最近最少使用)策略来清除旧缓存。

实现磁盘缓存的案例

接下来,咱们看一个使用磁盘缓存要怎么实现,如果 PDF 文件较大,内存无法保存全部页面的图像,我的天啊,那要怎么办?就是可以使用磁盘缓存,将渲染结果暂时保存到磁盘。

来看下面这个磁盘缓存策略实现,将渲染的图像保存为临时文件,并在需要时从磁盘加载:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class PdfToImageWithDiskCache {

    private static final int dpi = 300; // 高质量DPI设置
    private static final String cacheDir = "path/to/cache/";

    public static void main(String[] args) {
        // PDF文件路径
        String pdfFilePath = "path/to/your/large/pdf/vg_doc.pdf";
        // 输出图片文件夹路径
        String outputDir = "path/to/output/images/";

        try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            int totalPages = document.getNumberOfPages();

            for (int page = 0; page < totalPages; ++page) {
                BufferedImage image = renderPageWithDiskCache(pdfRenderer, page);

                // 保存图片
                String fileName = outputDir + "pdf_page_" + (page + 1) + ".png";
                ImageIO.write(image, "png", new File(fileName));
                System.out.println("Saved page " + (page + 1) + " as image.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 使用磁盘缓存渲染PDF页面
     * @param pdfRenderer PDFRenderer实例
     * @param page 页码(从0开始)
     * @return 缓存或渲染后的BufferedImage
     */
    private static BufferedImage renderPageWithDiskCache(PDFRenderer pdfRenderer, int page) throws IOException {
        // 磁盘缓存文件路径
        File cachedFile = new File(cacheDir + "page_" + page + ".png");

        // 如果缓存文件已存在,则从磁盘加载
        if (cachedFile.exists()) {
            System.out.println("Loading page " + (page + 1) + " from disk cache.");
            return ImageIO.read(cachedFile);
        }

        // 如果缓存文件不存在,则渲染并保存到磁盘
        System.out.println("Rendering page " + (page + 1) + "...");
        BufferedImage image = pdfRenderer.renderImageWithDPI(page, dpi);
        ImageIO.write(image, "png", cachedFile);
        return image;
    }
}

代码解释

  1. 缓存到磁盘: 通过 ImageIO.write() 将渲染的图像保存到磁盘上,如果该页面已经有缓存文件,则直接从磁盘读取。
  2. 缓存文件路径: 每个页面有对应的缓存文件名,避免重复渲染和保存。
  3. 适用于内存不足的情况: 当内存不足时,可以通过磁盘缓存减轻内存负担,同时仍然保留较好的访问速度。

通过这样的优化策略,咱们就可以在处理较大的 PDF 文件时,显著提升性能并减少资源消耗。

并行处理优化

接下来,看第二个问题:在处理很多页的 PDF 文件时,通过多线程并行处理每一页可以让处理速度显著提升,尤其是在每页渲染操作耗时较长的情况下。Java 提供了多线程的机制,咱们就用 ExecutorService 可以方便地管理和执行多线程任务。

下面来看一下如何实现哈,使用多线程并行处理 PDF 文件的每一页,将其转换为高质量图片。

主要步骤有三个

  1. 使用 ExecutorService 来创建线程池
  2. 每个线程独立处理一页 PDF,将其渲染为图片。
  3. 线程任务执行完毕后,统一关闭线程池

具体的代码实现

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class PdfToImageWithMultithreading {

    // 设置DPI用于高质量渲染
    private static final int dpi = 300;

    public static void main(String[] args) {
        // PDF文件路径
        String pdfFilePath = "path/to/your/large/pdf/vg_doc.pdf";
        // 输出图片文件夹路径
        String outputDir = "path/to/output/images/";

        // 线程池大小(可以根据CPU核心数量或需要并行的任务数进行调整)
        int numThreads = Runtime.getRuntime().availableProcessors();
        ExecutorService executorService = Executors.newFixedThreadPool(numThreads);

        try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            int totalPages = document.getNumberOfPages();
            System.out.println("Total pages: " + totalPages);

            // 为每一页创建一个并行处理任务
            for (int page = 0; page < totalPages; page++) {
                final int currentPage = page;  // 需要用final修饰以便在多线程中使用
                executorService.submit(() -> {
                    try {
                        renderAndSavePage(pdfRenderer, currentPage, outputDir);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭线程池
            executorService.shutdown();
            try {
                // 等待所有线程任务完成
                if (!executorService.awaitTermination(60, TimeUnit.MINUTES)) {
                    System.err.println("Some tasks did not finish within the timeout.");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 渲染PDF页面并保存为图片
     * @param pdfRenderer PDFRenderer实例
     * @param page 页码(从0开始)
     * @param outputDir 输出目录
     * @throws IOException 如果发生IO错误
     */
    private static void renderAndSavePage(PDFRenderer pdfRenderer, int page, String outputDir) throws IOException {
        // 渲染页面为高质量图片
        BufferedImage image = pdfRenderer.renderImageWithDPI(page, dpi);
        
        // 保存图片文件
        String fileName = outputDir + "pdf_page_" + (page + 1) + ".png";
        ImageIO.write(image, "png", new File(fileName));
        System.out.println("Saved page " + (page + 1) + " as image.");
    }
}

来详细解释一下代码和思路

1. 线程池的使用
  • ExecutorService :我们使用 Executors.newFixedThreadPool(numThreads) 来创建一个固定大小的线程池,其中 numThreads 是线程的数量。通过 Runtime.getRuntime().availableProcessors() 获取 CPU 核心数作为线程池大小的依据,通常这个值是处理器核心数。
  • submit() :将任务提交给线程池,submit() 方法会立即返回,不会阻塞主线程,从而能够让多个页面同时处理。
2. 任务分配
  • 每一页的渲染任务被分配到一个线程中,通过 executorService.submit() 提交渲染任务。每个任务都会调用 renderAndSavePage() 方法,处理特定页面的渲染和保存。
3. 渲染与保存
  • 每个线程使用 renderAndSavePage() 方法渲染指定页码的 PDF,并将生成的图像保存为 PNG 文件。这里使用 ImageIO.write() 来保存渲染结果。
  • 输出的文件名根据页面编号动态生成。
4. 关闭线程池
  • shutdown() :主线程在提交所有任务后调用 shutdown() 方法,通知线程池停止接收新的任务。
  • awaitTermination():主线程等待所有线程任务完成,这里设置了一个较长的超时时间(60分钟),你要根据实际情况来调整一下,确保所有页都能被处理完毕。

小结一下

通过多线程处理PDF的每一页,能显著缩短处理时间,特别是在处理大文件或大量页数的PDF时。线程池中的任务可以同时在多个CPU核心上运行,最大化利用硬件资源。对于超级大PDF文件或需要处理大量PDF时,可那就得上分布式处理了,每个节点处理一部分页面来解决,这里就不多赘述了。

最后

Java 如何实现PDF转高质量图片的案例就讲完了,喜欢这篇文件的话,一定帮我点赞、评论支持哦,如果怕忘了,收藏起来备孕是不错的选择。关注威哥爱编程,一群人的坚持才更加快乐。么么哒~~~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【力扣刷题实战】另一棵树的子树

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 力扣题目&#xff1a; 另一棵树的子树 题目描述 示例 1&#xff1a; 示例 2&#xff1a; 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码&#xff08;C语言&#xff09; 兄弟们共勉 &#xff01;&#xf…

ubuntu 24 (wayland)如何实现无显示器远程桌面

ubuntu 24默认采用的是wayland而非x11&#xff0c;查过文档vnc对wayland的支持不是很好&#xff0c;折腾了好久&#xff0c;弄了一个如下的方案供参考&#xff1a; 硬件条件 需要一个显卡欺骗器或者可以接HDMI口作为视频信号源输出的设备。 将ubuntu的主机的HDMI输出接到该硬…

StructRAG简介

StructRAG是一种新型的框架&#xff0c;旨在提升大型语言模型&#xff08;LLMs&#xff09;在知识密集型推理任务中的性能。它通过推理时的混合信息结构化机制&#xff0c;根据任务需求以最合适的格式构建和利用结构化知识。 以下是StructRAG的核心组成部分和工作流程&#xff…

聚类分析算法——K-means聚类 详解

K-means 聚类是一种常用的基于距离的聚类算法&#xff0c;旨在将数据集划分为 个簇。算法的目标是最小化簇内的点到簇中心的距离总和。下面&#xff0c;我们将从 K-means 的底层原理、算法步骤、数学基础、距离度量方法、参数选择、优缺点 和 源代码实现 等角度进行详细解析。…

【蓝桥杯选拔赛真题77】python计算小球 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python计算小球 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python计算小球 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要…

VMware 17 安装RedHat7.0

1.创建新的虚拟机&#xff0c;选择典型安装&#xff0c;【下一步】 2.选择“稍后安装操作系统&#xff08;S&#xff09;”&#xff0c;【下一步】 注&#xff1a;选择“安装程序光盘映像文件&#xff08;iso&#xff09;&#xff08;M&#xff09;”这一项&#xff0c;虚拟机…

事务的原理、MVCC的原理

事务特性 数据库事务具有以下四个基本特性&#xff0c;通常被称为 ACID 特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务被视为不可分割的最小工作单元&#xff0c;要么全部执行成功&#xff0c;要么全部失败回滚。这意味着如果事务执行过程中发生…

别玩了!软考初级网络管理员无非就这23页纸!背完稳!

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 考点2、子网划分 【考法分析】 本考点的基本考法是给出一个IP网段&#xff0c;同时提出需要划分多少个子网&#xff0c;或每个子网…

技术干货|如何巧妙利用数字孪生技术助力口腔保健分析

行业&#xff1a; 口腔医疗 挑战&#xff1a; 传统方法缺乏预测口腔内受力状态&#xff0c;也很难从患者方面获得反馈&#xff0c;因此将口腔扫描、牙齿形状/位置识别和正畸数字模型生成的过程数字化是一个重大机会。 正畸治疗是牙科中最大的类别之一&#xff0c;随着病例的…

WPF+MVVM案例实战(十一)- 环形进度条实现

文章目录 1、运行效果2、功能实现1、文件创建与代码实现2、角度转换器实现3、命名空间引用3、源代码下载1、运行效果 2、功能实现 1、文件创建与代码实现 打开 Wpf_Examples 项目,在Views 文件夹下创建 CircularProgressBar.xaml 窗体文件。 CircularProgressBar.xaml 代码实…

从壹开始解读Yolov11【源码研读系列】——Data.Base.py.BaseDataset:可灵活改写的数据集加载处理基类

目录 一、base.BaseDataset 1.__init__类初始化 2.get_img_files根据地址获得图片详细地址 3.get_labels&#xff08;自定义&#xff09;获取标签数据 4. update_labels指定类别和单分类设定 5.set_rectangle开启批量矩阵训练 6.cache_images加载图片进程可视化 7.load_image内…

超出人类思维的「系统0」:AI正在创造一种新的思维方式吗?

在大众的认知中&#xff0c;人类的思维分为系统 1&#xff08;System 1&#xff0c;直觉的、快速的、无意识的、自动思考&#xff09;和系统 2&#xff08;System 2&#xff0c;有逻辑的、缓慢的、有意识的、计划和推理&#xff09;。 如今&#xff0c;一种不同于 System 1 和…

华为ICT题库-云服务部分

1651、关于创建数据盘镜像的约束条件&#xff0c;以下说法错误的是&#xff1f;&#xff08;云服务考点&#xff09; (A)使用云服务器的数据盘创建数据盘镜像时&#xff0c;要确保该云服务器必须有系统盘 (B)通过外部文件创建数据盘镜像必须明确指定操作系统类型 (C)使用云服务…

阿里旺旺ActiveX控件ImageMan溢出

Welcome to Windows pwn~ 环境搭建&#xff1a; 虚拟机&#xff1a;winxp sp3 32位 再装一些常用的tools&#xff0c;olldby&#xff0c;immundbg&#xff0c;windbg这些。 漏洞版本的软件&#xff1a;AliIM2010_taobao(6.50.00C) PoC crash 分析 运行PoC&#xff0c;win…

新闻记者职业资格考试备考资料包分享(重要考点)!

24年新闻记者职业资格考试时间&#xff1a;11月2日&#xff0c;今天给大家整理的是新闻记者职业资格考试备考资料包&#xff08;重要考点&#xff09;23版&#xff0c;可以更有重点的进行复习~ 「新闻记者职业资格」 资料链接&#xff1a; https://pan.quark.cn/s/965044c95…

三菱FX5U CPU 存储卡引导运行操作

在CPU模块的电源0FF->ON时或复位时&#xff0c;将保存在SD存储卡内的文件传送至CPU模块自动判别的传送目标存储器。 引导运行的步骤如下所示。 1、进行引导文件设置。 2、安装SD存储卡。 3、将引导文件设置及引导文件写入至SD存储卡中。 4、CPU模块的电源0FF→>0N或复位…

【学习】ZLMediaKit试用

服务端准备 下载ZLMediaKit压缩包&#xff0c;解压 /linux/Release路径下启用MediaServer ./MediaServer -d &/linux/Release路径下config.ini更改配置 也可以将进入web控制台 rtmp默认端口1935, rtsp默认端口554,http默认端口80, SSL默认端口443 进入web控制台 http…

域渗透AD渗透攻击利用 python脚本攻击之IPC连接 以及 python生成exe可执行程序讲解方式方法

Python脚本批量检测ipc连接 import os, timeips [192.168.1.121,192.168.1.8 ] users {administrator,hack,hack1,test, } passs {123qq.com,456qq.com,Admin12345 } for ip in ips:for user in users:for mima in passs:exec1 "net use \\" "\\" i…

基于springboot小区物联网平台源码

小区物联网平台是一个专为小区硬件管理设计的物联网管理平台&#xff0c;其核心功能在于与各大厂商的门禁设备、道闸设备、监控设备、智能锁以及充电桩等进行高效对接。该平台支持HTTP、MQTT、ComNet等多种协议&#xff0c;以便轻松实现与各大小区云平台的互联互通。 目前&…

Moveit-轨迹优化

mvoeit轨迹周期不固定的问题&#xff0c;以及我们希望对moveit规划出来的轨迹进一步优化的项目需求 首先看一个关节角运动的python函数&#xff0c;通过这个函数我们可以实现机械臂从当前位姿运动到设定位姿的功能 #用于控制机械臂移动到目标位置&#xff0c;接受三个参数 #t…