APM 学习 6 --- ArduPilot 线程

2023-05-16

ArduPilot 学习之路 - 6,线程

英文原文地址:https://ardupilot.org/dev/docs/learning-ardupilot-threading.html

理解 ArduPilot 线程

        线程时 ArduPilot 运行的核心概念,setup() / loop() 结构来源于 Arduino,使得 ArduPilot 系统看起来更像是单线程系统,但事实并非如此。

        ArduPilot 中的线程处理方法取决于其所运行的主板。有些主板(例如APM1和APM2)不支持线程,因此可以使用简单的计时器和回调。某些主板(PX4和Linux)支持具有实时优先级的丰富Posix线程模型,ArduPilot广泛使用了这些模型。

ArduPilot 线程主要涉及到如下关键概念:

  • The timer callbacks                  定时器回调
  • HAL specific threads                HAL特定线程
  • driver specific threads              驱动程序特定线程
  • ardupilot drivers versus platform driversardupilot            驱动程序与平台驱动程序
  • platform specific threads and tasks                                 平台特定的线程和任务
  • the AP_Scheduler system                                               AP_调度系统
  • semaphores                                                                     信号量
  • lockless data structures                                                   无锁数据结构

1,定时器回调(The timer callbacks)

       每个平台在 AP_HAL 中都提供一个1kHz计时器。 ArduPilot 中的任何代码都可以注册一个计时器功能,然后以1kHz的频率调用该功能。所有已注册的计时器功能均被依次调用。这种机制很原始,但是它具备很强的移植性,而且非常有用。您可以通过调用 hal.scheduler-> register_timer_process()来注册计时器回调,如下所示:

      该示例来自MS5611气压计驱动程序。 AP_HAL_MEMBERPROC()宏提供了一种将C ++成员函数封装为回调参数的方法。

      当一段代码希望某件事发生在低于1kHz的频率时,它应该保持其自己的 “ last_ Called” 变量,并在没有足够时间的情况下立即返回。您可以使用 hal.scheduler-> millis()和 hal.scheduler-> micros()函数来获取自启动以来的时间,该时间以毫秒和微秒为单位。

      现在,您应该去修改一个现有的示例(或创建一个新的示例)并添加一个计时器回调。使计时器递增一个计数器,然后在loop()函数中每秒打印一次计数器的值。修改函数,使其每25毫秒递增一次计数器。

2,HAL特定线程

   在支持实线程的平台上,该平台的 AP_HAL 将创建多个线程以支持基本操作。例如在Pixhawk上创建以下特定于HAL的线程:

  • UART线程,用于读写UART(和USB)
  • 计时器线程,支持上述 1kHz 计时器功能
  • IO线程,支持写入 microSD 卡,EEPROM 和 FRAM

       在每个AP_HAL实现中查看 Scheduler.cpp,以查看创建了哪些线程以及每个线程的实时优先级。

       如果你的硬件为 Pixhawk,那么设置调试控制台电缆并连接到nsh控制台(serial5 端口)。连接速度为57600。连接后,尝试“ ps ”命令广告,将获得以下内容:

       在此示例中,您可以看到“ AHRS_Test”线程,该线程正在运行来自库/ AP_AHRS / examples / AHRS_Test的示例,还可以看到计时器线程(优先级181),UART线程(优先级60)和IO线程(优先级59)。其他AP_HAL端口具有更多或更少的线程,具体取决于所需的线程。

       线程为控制器提供了一种常用的方法,可以在不中断主要自动驾驶飞行代码的情况下安排慢任务的方式。例如,AP_Terrain库需要能够对microSD卡执行文件 IO(以存储和检索地形数据)。它的执行方式是这样调用函数    hal.scheduler-> register_io_process():

       设置AP_Terrain :: io_timer函数以使其定期调用。在板卡 IO 线程中调用意味着它的实时优先级较低,适合存储IO任务。请勿在计时器线程上调用此类缓慢的IO任务,因为它们会导致更重要的高速传感器数据处理过程中的延迟,这一点很重要

3,驱动程序特定线程(Driver specific threads)

       对于特定的异步处理,可以创建特定的驱动线程。目前,只能以依赖于平台的方式创建特定于驱动程序的线程,因此,仅驱动程序仅打算在一种类型的自动驾驶板上运行时才适用。如果希望它在多个AP_HAL目标上运行,则有两种选择:

  • 可以使用 register_io_process()和 register_timer_process()调度程序调用来使用现有的计时器或IO线程
  • 可以添加一个新的HAL接口,该接口提供了一种在多个 AP_HAL 目标上创建线程的通用方法

      驱动程序特定线程的一个示例是 Linux 端口中的 ToneAlarm 线程。参见 AP_HAL_Linux / ToneAlarmDriver.cpp

  4,驱动程序与平台驱动程序(ArduPilot drivers versus platform drivers)

       细心的程序员可能会会注意到 ArduPilot 中有一些驱动程序重复。例如,库 /AP_InertalSensor/AP_InertialSensor_MPU6000.cpp 中有一个MPU6000驱动程序,PX4Firmware / src / drivers / mpu6000 中有另一个 MPU6000 驱动程序 。

       重复的原因是PX4项目已经为Pixhawk板卡随附的硬件提供了一组经过良好测试的驱动程序,并且我们与PX4团队在开发和增强这些驱动程序方面享有良好的合作关系。因此,当我们为PX4构建ArduPilot时,我们通过编写小的 “shim” 驱动程序来利用PX4驱动程序,这些驱动程序为PX4驱动程序提供了标准 ArduPilot 库接口。如果查看 libraries / AP_InertialSensor / AP_InertialSensor_PX4.cpp,您会看到一个小的填充驱动程序,询问PX4该板上有哪些IMU驱动程序,并自动将它们作为ArduPilot AP_InertialSensor 库的一部分提供。

      因此,如果板上有 MPU6000,则在非 Pixhawk / NuttX 平台上使用AP_InertialSensor_MPU6000.cpp 驱动程序,在基于NuttX的平台上使用AP_InertialSensor_PX4.cpp 驱动程序。

       其他 AP_HAL 端口也可能发生相同类型的拆分。例如,我们可以将Linux内核驱动程序用于Linux板上的某些传感器。对于其他传感器,我们使用通用的 AP_HAL I2C 和 SPI 接口来使用 ArduPilot“ 树内”驱动程序,该驱动程序可在各种板上使用。

5,平台特定的线程和任务(Platform specific threads and tasks)

       在某些平台上,启动过程将创建许多基本任务和线程。这些是特定于平台的,因此为了本教程的缘故,我将专注于基于PX4的板上使用的任务。

  在上面的“ ps”输出中,我们看到了许多 AP_HAL_PX4 Scheduler 代码未启动的任务和线程。具体来说,它们是:

  • idle task - called when there is nothing else to run
  • init - used to start up the system
  • px4io - handle the communication with the PX4IO co-processor
  • hpwork - handle thread based PX4 drivers (mainly I2C drivers)
  • lpwork - handle thread based low priority work (eg. IO)
  • fmuservo - handle talking to the auxillary PWM outputs on the FMU
  • uavcan - handle the uavcan CANBUS protocol

       所有这些任务的启动由特定于 PX4 的 rc.APM 脚本控制。该脚本在PX4引导时运行,并负责检测我们正在使用哪种PX4板,然后为该板加载正确的任务和驱动程序。它是一个“ nsh” 脚本,类似于bourne shell脚本(尽管nsh更原始)。

      作为练习,请尝试编辑 rc.APM 脚本并添加一些sleep和echo命令。然后,在主板启动时上传新固件并连接到调试控制台。您的 echo 命令应显示在控制台上。

       探索PX4启动的另一种非常有用的方法是在插槽中没有 microSD 卡的情况下启动。 rcS 脚本运行在 rc.APM 之前,它检测是否插入了 microSD,并在 USB 端口上提供一个原始的 nsh 控制台。然后,还可以在 USB 控制台上自己手动运行 rc.APM 的所有步骤,以了解其工作方式。

      在没有 microSD 卡的情况下启动 Pixhawk 并连接到 USB 控制台后,请尝试以下练习:

        tone_alarm stop
        uorb start
        mpu6000 start
        mpu6000 info
        mpu6000 test
        mount -t binfs /dev/null /bin
        ls /bin
        perf


       尝试运行其他驱动,在 / bin 中查看可用的内容。这些命令大多数的源代码在 PX4Firmware / src / drivers 中。浏览一下mpu6000 驱动程序,以了解所涉及的内容。

       鉴于我们的主题是线程和任务,因此值得一提的是 PX4Firmware git 树中的线程的简短描述。如果您查看 mpu6000 驱动程序,您将看到如下一行:


        hrt_call_every(&_call, 1000, _call_interval, (hrt_callout)&MPU6000::measure_trampoline, this);  

       这等效于 AP_HAL 中的 hal.scheduler-> register_timer_process()函数,但特定于PX4,并且更加灵活。它表示希望PX4的HRT(高分辨率计时器)子系统每1000微秒调用一次MPU6000 :: measure_trampoline 函数。使用 hrt_call_every()是用于操作非常快速的驱动程序(例如SPI设备驱动程序)的常用方法。这些操作通常在禁用中断的情况下运行,并且最多只需要几十微秒。

如果将此与hmc5883驱动程序进行比较,将看到如下一行:


                work_queue(HPWORK, &_work, (worker_t)&HMC5883::cycle_trampoline, this, 1);  

       对于速度较慢的设备(例如I2C设备),常规做法时使用替代机制。这样做是将 cycle_trampoline 函数添加到您在上面看到的HPWORK 线程内的工作队列中。在 HPWORK Worker 中进行的调用应在启用中断的情况下运行,并且可能需要花费数百微秒的时间。对于将花费比应使用LPWORK工作队列更长的时间的任务,该任务将在较低优先级的 lpwork 线程中运行。

6,AP_调度系统(The AP_Scheduler system)

       对于 ArduPilot 线程任务,需要了解的下一个方面是 AP_Scheduler 系统。 AP_Scheduler 库用于在主无人设备线程中分配时间,同时提供一些简单的机制来控制每个操作使用多少时间(在 AP_Scheduler 中称为“任务”)。

    它的工作方式是每个设备的 loop()函数都包含一些执行此操作的代码:

  • 等待新的 IMU 采样数据到达
  • 在每个 IMU 样本之间调用一组任务

      每种无人机设备都有一个 AP_Scheduler :: Task 表。要了解其工作原理,请查看                                                  AP_Scheduler / examples / Scheduler_test.cpp 示例。如果查看该文件,您将看到一个小表格,其中包含3个调度任务。与每个任务相关的是两个数字。该表如下所示:


static const AP_Scheduler::Task scheduler_tasks[] PROGMEM = {
 { ins_update, 1, 1000 },
 { one_hz_print, 50, 1000 },
 { five_second_call, 250, 1800 },
};  

      每个函数名称后面的第一个数字是调用频率,以 ins.init()调用控制的单位。对于此示例,ins.init()使用 RATE_50HZ,因此每个调度步骤为20ms。这意味着每 20 毫秒进行一次ins_update()调用,每50次(即每秒一次)调用一次 one_hz_print()函数,每250次(即每5秒一次)调用一次 five_second_call()。

      第三个数字是该功能预计要花费的最长时间。除非在此调度运行中剩余足够的时间来运行该函数,否则这样做可以避免进行调用。当调用 scheduler.run()时,将传递可用于运行任务的时间(以微秒为单位),如果最差的情况下该任务的时间意味着该任务在该时间用完之前不适合,则不会调用该程序。

       需要注意的另一点是 ins.wait_for_sample()调用。那就是在 ArduPilot 中推动调度的“节拍器”。在新的 IMU 样本可用之前,它将阻止执行无人机主线程, IMU样本之间的时间由 ins.init()调用的参数控制。

     注意 AP_Scheduler 表中的任务必须具有以下属性:

  • 它们永远都不会阻塞(除了ins.update()调用之外)
  • 他们绝不应该在飞行时调用睡眠功能(像真正的飞行员一样,自动驾驶仪在飞行时也不应睡眠)
  • 他们应该有可预测的最坏情况时机

     现在,我们可以去去修改 Scheduler_test 示例,并添加自己的任务以运行,尝试添加执行以下操作的任务:

  • 读取气压计
  • 读取指南针
  • 读取 GPS 信息
  • 更新 AHRS 并打印滚动 / 俯仰角度

    查看本教程前面使用的每个库的示例,以了解如何使用每个传感器库。

7,信号量(Semaphores)

       当有多个线程(或计时器回调)时,需要确保两个执行逻辑线程共享的数据结构以防止损坏的方式进行更新。在 ArduPilot中,有 3 种基本方法可以做到这一点:a,信号量;b,无锁数据结构;c,PX4 ORB。

       AP_HAL 信号量只是特定平台上可用的任何信号量系统的包装,提供了一种相互排斥的简单机制。例如,I2C 驱动程序使用 I2C 总线信号量,以确保一次仅使用一个I2C设备,防止数据冲突。

       读者可以转到库 /AP_Compass/AP_Compass_HMC5843.cpp 中的 hmc5843 驱动程序,并查找 get_semaphore()调用。查看所有使用它的地方,看看是否可以弄清楚为什么需要它。

8,无锁数据结构(Lockless Data Structures)

     ArduPilot 代码还包含使用无锁数据结构来避免使用信号量的示例,这比信号量更加有效。

     提供两个示例参考:

  • the _shared_data structure in libraries/AP_InertialSensor/AP_InertialSensor_MPU9250.cpp
  • the ring buffers used in numerous places. A good example is libraries/DataFlash/DataFlash_File.cpp

      参考这两个例子,理解示例并发访问如何保证数据安全。对于 DataFlash_File,请查看_writebuf_head 和 _writebuf_tail 变量的使用。最好在ArduPilot中的多个位置创建一个通用的环形缓冲区类,以代替单独的环形缓冲区实现。

9,The PX4 ORB

        这种机制的另一个示例是PX4 ORB。 ORB(对象请求代理)是一种使用在多线程环境中安全的发布/订阅模型,将数据从系统的一个部分提供给另一部分(例如,设备驱动程序->车辆代码)的方法。

        ORB 提供了一种很好的机制来声明这种共享的结构(全部在PX4Firmware / src / modules / uORB /中定义)。然后,代码可以将数据“发布”到这些主题之一,而其他代码则可以选择这些主题。

       一个示例是舵机或者电调控制量的发布,以便可以在Pixhawk上使用 uavcan ESC。参考 AP_HAL_PX4 / RCOutput.cpp 中的_publish_actuators()函数。您会看到它发布了一个“ actuator_direct”主题,其中包含每个ESC所需的速度。 uavcan在PX4Firmware / src / modules / uavcan / uavcan_main.cpp中对这些监视代码进行编码,以查找对此主题的更改,并将新值输出到uavcan ESC。

 PX4驱动程序进行通信的其他两种常见机制是:

  • ioctl 调用(请参阅AP_HAL_PX4 / RCOutput.cpp中的示例)
  • /dev/xxx read/write calls (see _timer_tick in AP_HAL_PX4/RCOutput.cpp)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

APM 学习 6 --- ArduPilot 线程 的相关文章

  • 使用simulink分析APM日志信息

    一 将bin转化成mat文件 使用mission planner将bin文件转化成mat文件 二 将工作区变量转化成timeserial对象 RCIN TimeSerial 61 timeseries RCIN 3 RCIN 2 1e6 三
  • APM日志格式表

    APM的日志格式文件在libraries AP Logger LogStructure h文件中 xff0c 二进制数据类型对照表如下 xff1a 单位对照表如下 xff1a
  • APM-MAVROS连接

    1 运行mavros roslaunch mavros apm launch fcu url 61 34 dev ttyUSB0 921600 34 2 读取topic之前先运行以下命令 xff0c 修改飞控广播频率 rosservice
  • Ardupilot SITL(Software in the Loop)软件仿真

    参考 xff1a http ardupilot org dev docs sitl native on windows html sitl native on windows 第一步 xff1a 下载MAVProxy 第二步 xff1a 下
  • Ardupilot与T265配置

    摘自 xff1a https www jianshu com p ce91fdec7235 我现在发现这篇文章的原文在这 https www cnblogs com hellocxz p 12104290 html Ardupilot与T2
  • APM添加超声模块及定高程序分析

    给飞控添加新的模块 xff0c 通常的做法是写驱动文件 xff0c 然后用uORB订阅消息 xff0c 这种方法已经有文章介绍了 xff0c 下面介绍另一种更加简洁的方法 硬件连接 UARTD xff08 ttyS2 xff09 超声 Bo
  • 【飞控学习】APM和PX4飞控源码下载及安装

    对于无人机开发的专业人员来说 xff0c APM和PX4是现今市面上最强大的2个开源无人机飞控 学习和查看他们2者的源码 xff0c 将会提高我们对整个无人机的姿态解算和控制的深入理解 现在我们就来下载2者的源码和安装查看2者源码的软件 1
  • Docs » Learning the ArduPilot Codebase » EKF » Extended Kalman Filter Navigation Overview and Tuning

    原文 xff1a http ardupilot org dev docs extended kalman filter html extended kalman filter navigation overview and tuning 本
  • Ardupilot任务调度的理解

    Ardupilot通过定时器定时调度一系列任务实现任务调度 由于Ardupilot固件有基于arduino的APM发展而来 xff0c 因此程序与arduino的形式类似 xff0c 包含一个setup xff08 xff09 函数与一个l
  • win7下 pixhawk (ardupilot) 的编译

    前几天都在搞pixhawk源码编译问题 xff0c 什么在window下用Console或者eclipse xff0c 还是在Ubuntu下 xff0c 都做了 xff0c 而且把 mk文件都看了 xff0c 结果还是有bug 总结一下三种
  • APM(pixhawk)飞控疑难杂症解决方法汇总(持续更新)

    原文链接 xff1a http www nufeichuiyun com p 61 28
  • APM 学习 6 --- ArduPilot 线程

    ArduPilot 学习之路 6 xff0c 线程 英文原文地址 xff1a https ardupilot org dev docs learning ardupilot threading html 理解 ArduPilot 线程 线程
  • Ardupilot 编译Bootloader

    1 清理之前的编译中间文件 xff0c 一定要清理一下 xff0c 能避免很多奇怪的问题 span class token punctuation span span class token operator span waf distcl
  • APM飞控学习之路:4 源码裁剪与下载

    月盈则亏 xff0c 水满则溢 当博主编译完成 xff0c 以为离成功更近一步准备下载的时候 xff0c 殊不知陷阱也早已准备好 xff0c 等待我的踏入 连上USB线 xff0c 下载 xff0c timeout xff0c timeou
  • 配置Ardupilot环境4--------Ubuntu 安装eclipse

    1 资源准备 这个的要求不是太清楚 xff0c 反正我是随便下的版本 xff0c 成功配置 下载JDK 选择dk 8u172 linux x64 tar gz 下载Eclipse 选择Eclipse IDE for Java Develop
  • ArduPilot之开源代码框架

    ArduPilot之开源代码框架 1 系统框架2 工程框架2 1 工程目录2 2 代码组成2 3 运行流程 4 硬件传感器总线4 1 I2C4 2 SPI4 3 UART4 4 CAN 5 软件设计概念6 总结7 参考资料 在研读ArduP
  • ArduPilot-sitl中的一些操作记录

    ArduPilot 这么优秀的代码 提供了一套很方便的SITL仿真开发模式 在git clone代码的时候 已经将相关的东西下载下来了 问题是如何进行使用 首先要安装mavproxy 这个软件 pymavlink mavlink封装的pyt
  • APM:ELK 与 Prometheus

    同为监控应用的两个平台 Prometheus和ELK的对比 ELK和Prometheus的对比 Prometheus ELK 轻量 部署相对简单 较重 组件较多 部署起来较麻烦 使用灵活 需要使用者会灵活运用 上手较为简单 适用于短期使用
  • Pixhawk VTOL SITL仿真

    Pixhawk VTOL 和 SITL Simulation 需求的软件 MAVProxy 下载地址 http firmware ardupilot org Tools MAVProxy MAVProxySetup latest exe C
  • 一次APM32替换STM32的经历分享

    系列文章目录 这几年相信大家知道STM32系列的芯片价格翻倍的涨 自己玩都快玩不起了 要是用于生产 这得多掏多少钱 所以现在大家都选择了国产芯片 哈哈不能说多差吧 价格你没得说 这是我的一次APM32代替STM32的经历 你是不是也会遇到这

随机推荐

  • 【Gazebo入门教程】第五讲 控制器插件的编写与配置(上)

    Gazebo入门教程 第五讲 控制器插件的编写与配置 xff08 上 xff09 文章目录 Gazebo入门教程 第五讲 控制器插件的编写与配置 xff08 上 xff09 一 控制插件的使用方法1 插件简介2 插件编写流程 二 模型插件与
  • 【Gazebo入门教程】第六讲 控制器插件的编写与配置(下)

    Gazebo入门教程 第六讲 控制器插件的编写与配置 xff08 下 xff09 qquad 文章目录 Gazebo入门教程 第六讲 控制器插件的编写与配置 xff08 下 xff09 一 系统插件二 Velodyne传感器插件1 基本插件
  • 一键式AI绘画,让你也能体验当画师的魅力(附原理分析)

    文章目录 讲在前面一 Novel AI1 网站介绍2 AI作画 二 AI绘画的内在原理1 Diffusion Model的基本过程2 扩散模型的兴起 讲在前面 大概在今年10月初期 xff0c AI作画的热潮突然被掀起 xff0c 这股潮流
  • 类与对象:C++编程知识回顾与拓展 第一篇

    类与对象 C 43 43 编程知识回顾与拓展 第一篇 前言 在步入研究生生涯以来 xff0c 痛感自身编程知识与能力的不足 xff0c 亟需重新回顾 xff0c 并重点学习关于C 43 43 中面向对象 类 STL等关键知识 xff0c 提
  • OpenStreetMap:对抗谷歌帝国的共享开源地图

    OpenStreetMap xff1a 对抗谷歌帝国的共享免费地图 讲在前面 在步入自动驾驶的学习之后 xff0c 不可避免地我需要去了解在驾驶领域中选择的地图格式 xff0c 而随着研究的进一步深入 xff0c 我逐步了解到两种较为主流的
  • Copilot:AI自动写代码,人工智能究竟还能取代什么?

    Copilot xff1a AI自动写代码 xff0c 人工智能究竟还能取代什么 xff1f 前言 在AI绘画掀起一阵热潮之后 xff0c AI写代码又逐渐进入了我们的视野 xff0c 似乎这一步我们还没想到就迅速到来了 xff0c 难道说
  • 关于SubSonic3.0生成的表名自动加复数(s)的“用户代码未处理SqlException,对象名‘xxxs‘无效”异常处理

    关于SubSonic3 0生成的表名自动加复数 xff08 s xff09 的 用户代码未处理SqlException xff0c 对象名 39 xxxs 39 无效 异常处理 参考文章 xff1a xff08 1 xff09 关于SubS
  • 互联网金融风控面试算法知识(三)

    资料来源于网络搜集和汇总 xff0c 把算法知识的总结放在业务知识后面也是为了说明实际工作业务落地应用的重要性大于算法创新 面试题依然是适用于3年经验以内的初学者 xff0c 希望大家在学习算法的同时不要一心只研究算法而脱离了业务 xff0
  • wiki树莓派安装ubuntu mate 和 ros

    两大步骤 1 安装ubuntu mate 2 安装ros 一 安装ubuntu mate 下载ubuntu mate 18 04 img 并制作系统盘 首先要说的就是树莓派支持的系统是很多样的 xff0c 但是针对ros xff0c 我们只
  • npm 的工作原理

    包 Package 和模块 Module 如何定义一个Package 满足如下条件都可以称为一个包 xff1a 一个文件夹包含应用程序 xff0c 使用package json来描述它 a 一个用gzip压缩的文件夹 xff0c 满足 a
  • 2023最全Postman安装使用详解

    一 Postman背景介绍 用户在开发或者调试网络程序或者是网页B S模式的程序的时候是需要一些方法来跟踪网页请求的 xff0c 用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具 今天给大家介绍的这款网页调试工具不仅可以
  • cmake 设置 debug release模式

    1 通过命令行的方式 cmake DCMAKE BUILD TYPE 61 Debug 2 set CMAKE BUILD TYPE Debug CACHE STRING 34 set build type to debug 34 或者 s
  • 华为笔试题(4)

    一 计算n x m的棋盘格子 xff08 n为横向的格子数 xff0c m为竖向的格子数 xff09 沿着各自边缘线从左上角走到右下角 xff0c 总共有多少种走法 xff0c 要求不能走回头路 xff0c 即 xff1a 只能往右和往下走
  • 安装RedisBloom插件

    前言 安装RedisBloom模块会遇到很多坑 xff0c 希望你不要和我一样踩的这么全 x1f60f 如果觉得编译麻烦 xff0c 我也上传了我编译的so文件 xff0c 可以直接加载使用 https download csdn net
  • ROS Catkin 教程之 CMakeLists.txt

    1 概览 CMakeLists txt 是用 CMake 构建系统构建 ROS 程序包的输入文件 任何兼容 CMake 的包都包含一个或多个 CMakeLists txt 文件 xff0c 用以描述怎样构建和安装代码 catkin 项目采用
  • Xsens Mti-g-710 IMU driver在Ubuntu18.04 ROS melodic中的安装使用

    Ubuntu18 04下安装的ROS melodic 如何使用Xsens Mti g 710 IMU driver xff1f 这里给出一个详细步骤说明 这里的IMU是USB接口 1安装 首先插入IMU的USB口 命令行运行 gt lsus
  • PYTHON -MYSQLDB安装遇到的问题和解决办法

    PYTHON MYSQLDB安装遇到的问题和解决办法 参考文章 xff1a xff08 1 xff09 PYTHON MYSQLDB安装遇到的问题和解决办法 xff08 2 xff09 https www cnblogs com gaosh
  • 位姿估计Robot_pose_efk的配置和使用

    Robot pose efk 用于融合里程计 xff0c 惯性测量单元和视觉里程计的传感器输出 xff0c 从而减少测量中的总体误差 了解ROS的robot pose ekf软件包中扩展卡尔曼滤波器的用法 xff1a robot pose
  • linux录屏和截图软件

    linux下的录屏和截图软件有很多 xff0c kazam集成了录屏和截图两个功能 xff0c 而且十分轻量级 xff0c 比较好用 如果是在VirtualBox虚拟机中跑linux的话 xff0c virtualbox本身就提供录屏和截图
  • APM 学习 6 --- ArduPilot 线程

    ArduPilot 学习之路 6 xff0c 线程 英文原文地址 xff1a https ardupilot org dev docs learning ardupilot threading html 理解 ArduPilot 线程 线程