亚博microros小车-原生ubuntu支持系列:16 机器人状态估计
本来想测试下gmapping建图,但是底层依赖了yahboomcar_bringup做底层的数据处理,所以先把依赖的工程导入。
程序启动后,会订阅imu和odom数据,过滤掉一部分的imu数据后,然后与odom数据进行融合,最后输出一个融合后的odom数据用于估计机器人的状态,该数据多用于建图和导航中。
src/yahboomcar_bringup/launch/新建启动脚本yahboomcar_bringup_launch.py
from ament_index_python.packages import get_package_share_pathfrom launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.conditions import IfCondition, UnlessCondition
from launch.substitutions import Command, LaunchConfigurationfrom launch_ros.actions import Node
from launch_ros.parameter_descriptions import ParameterValueimport os
from ament_index_python.packages import get_package_share_directoryfrom launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSourceprint("---------------------robot_type = x3---------------------")
def generate_launch_description():imu_filter_config = os.path.join( get_package_share_directory('yahboomcar_bringup'),'param','imu_filter_param.yaml') imu_filter_node = IncludeLaunchDescription(PythonLaunchDescriptionSource([os.path.join(get_package_share_directory('imu_complementary_filter'), 'launch'),'/complementary_filter.launch.py']))ekf_node = IncludeLaunchDescription(PythonLaunchDescriptionSource([os.path.join(get_package_share_directory('robot_localization'), 'launch'),'/ekf.launch.py']))description_launch = IncludeLaunchDescription(PythonLaunchDescriptionSource([os.path.join(get_package_share_directory('yahboomcar_description'), 'launch'),'/description_launch.py'])) base_link_to_imu_tf_node = Node(package='tf2_ros',executable='static_transform_publisher',name='base_link_to_base_imu',arguments=['-0.002999', '-0.0030001','0.031701','0','0','0','base_link','imu_frame']) return LaunchDescription([imu_filter_node,ekf_node,base_link_to_imu_tf_node,description_launch])
该launch文件启动了以下几个节点:
-
imu_filter_node:过滤imu数据节点,主要是过滤部分的imu数据;
-
ekf_node:融合节点,主要是融合odom数据和过滤的imu数据。
-
base_link_to_imu_tf_node:发布一个静态变化,主要是发布imu模块与小车的位姿变换。
-
description_launch:加载URDF模型。
从代码来看,结合之前的迁移,还差了2工程。robot_localization、imu_complementary_filter
亚博官网资料对此缺乏介绍。只说启动:
ros2 launch yahboomcar_bringup yahboomcar_bringup_launch.py
网上找资料,大概看看。
robot_localization
功能包简介
robot_localization是状态估计节点的集合,每个节点都是非线性状态估计器的一种实现,用于在3D空间中移动的机器人。它包括两个状态估计节点ekf_localization_node和ukf_localization_node。另外,robot_localization提供navsat_transform_node,它有助于集成GPS数据。
robot_localization wiki — robot_localization 2.6.12 documentation
官方文档,https://github.com/cra-ros-pkg/robot_localization
说的比较抽象,简单理解下,机器人状态估计需要用到很多传感器,因为对单一的传感器来讲,都存在各自的优缺点,需要融合估计。
安装,一般是使用:
sudo apt-get install
但是,yahboomcar_bringup_launch.py里面使用里脚本加载,所以需要使用源码安装。
这个编译安装缺一些包,比如
Could not find a package configuration file provided by “GeographicLib"
sudo apt-get install ros-melodic-geographic-*
sudo apt-get install geographiclib-*
sudo apt-get install libgeographic-*
其他的编译报错缺啥包就对应的安装吧,比较麻烦些。

imu_tools
imu_complementary_filter 网上搜了下,就是imu_tools,这个工程在yahboomcar_ws工程找不到。在外面。官网也没有单独提这个,还是udo apt-get install ros-humble-imu-tools不可行,需要源码编译。
https://github.com/CCNYRoboticsLab/imu_tools/tree/humble
与 IMU 相关的过滤器和可视化器。堆栈包含:
imu_filter_madgwick:一种过滤器,可将来自常规 IMU 设备的角速度,加速度和(可选) 磁读数融合到方向中。
imu_complementary_filter:一种滤波器,该滤波器使用基于互补融合的新颖方法将来自 通用 IMU 设备的角速度,加速度和(可选)磁读数融合到方向四元数中。
rviz_imu_plugin:rviz 的插件,可显示 sensor_msgs::Imu 消息。

测试运行
先启动小车代理
ros2 launch yahboomcar_bringup yahboomcar_bringup_launch.py
启动日志:
bohu@bohu-TM1701:~/yahboomcar/yahboomcar_ws$ ros2 launch yahboomcar_bringup yahboomcar_bringup_launch.py
[INFO] [launch]: All log files can be found below /home/bohu/.ros/log/2025-01-29-17-43-00-359232-bohu-TM1701-218123
[INFO] [launch]: Default logging verbosity is set to INFO
---------------------robot_type = x3---------------------
[INFO] [complementary_filter_node-1]: process started with pid [218125]
[INFO] [ekf_node-2]: process started with pid [218127]
[INFO] [static_transform_publisher-3]: process started with pid [218129]
[INFO] [joint_state_publisher-4]: process started with pid [218131]
[INFO] [robot_state_publisher-5]: process started with pid [218133]
[INFO] [static_transform_publisher-6]: process started with pid [218135]
[static_transform_publisher-3] [WARN] [1738143780.898682373] []: Old-style arguments are deprecated; see --help for new-style arguments
[static_transform_publisher-6] [WARN] [1738143780.900906973] []: Old-style arguments are deprecated; see --help for new-style arguments
[complementary_filter_node-1] [INFO] [1738143781.138198744] [complementary_filter_gain_node]: Starting ComplementaryFilterROS
[static_transform_publisher-6] [INFO] [1738143781.140989389] [static_transform_publisher_WQtu1UbMwwhEa1kH]: Spinning until stopped - publishing transform
[static_transform_publisher-6] translation: ('0.000000', '0.000000', '0.050000')
[static_transform_publisher-6] rotation: ('0.000000', '0.000000', '0.000000', '1.000000')
[static_transform_publisher-6] from 'base_footprint' to 'base_link'
[static_transform_publisher-3] [INFO] [1738143781.142566675] [base_link_to_base_imu]: Spinning until stopped - publishing transform
[static_transform_publisher-3] translation: ('-0.002999', '-0.003000', '0.031701')
[static_transform_publisher-3] rotation: ('0.000000', '0.000000', '0.000000', '1.000000')
[static_transform_publisher-3] from 'base_link' to 'imu_frame'
[robot_state_publisher-5] [WARN] [1738143781.154460630] [kdl_parser]: The root link base_link has an inertia specified in the URDF, but KDL does not support a root link with an inertia. As a workaround, you can add an extra dummy link to your URDF.
[robot_state_publisher-5] [INFO] [1738143781.154576150] [robot_state_publisher]: got segment base_link
[robot_state_publisher-5] [INFO] [1738143781.154647599] [robot_state_publisher]: got segment imu_Link
[robot_state_publisher-5] [INFO] [1738143781.154656936] [robot_state_publisher]: got segment jq1_Link
[robot_state_publisher-5] [INFO] [1738143781.154663678] [robot_state_publisher]: got segment jq2_Link
[robot_state_publisher-5] [INFO] [1738143781.154670400] [robot_state_publisher]: got segment radar_Link
[robot_state_publisher-5] [INFO] [1738143781.154676689] [robot_state_publisher]: got segment yh_Link
[robot_state_publisher-5] [INFO] [1738143781.154682893] [robot_state_publisher]: got segment yq_Link
[robot_state_publisher-5] [INFO] [1738143781.154689248] [robot_state_publisher]: got segment zh_Link
[robot_state_publisher-5] [INFO] [1738143781.154695418] [robot_state_publisher]: got segment zq_Link
查看节点间的通讯图,
ros2 run rqt_graph rqt_graph

融合的节点是/ekf_filter_node,可以查询下这个节点的相关信息,终端输入,
ros2 node info /ekf_filter_node
bohu@bohu-TM1701:~/imu_ws$ ros2 node info /ekf_filter_node
/ekf_filter_nodeSubscribers:/imu/data: sensor_msgs/msg/Imu/odom_raw: nav_msgs/msg/Odometry/parameter_events: rcl_interfaces/msg/ParameterEvent/set_pose: geometry_msgs/msg/PoseWithCovarianceStampedPublishers:/diagnostics: diagnostic_msgs/msg/DiagnosticArray/odom: nav_msgs/msg/Odometry/parameter_events: rcl_interfaces/msg/ParameterEvent/rosout: rcl_interfaces/msg/Log/tf: tf2_msgs/msg/TFMessageService Servers:/ekf_filter_node/describe_parameters: rcl_interfaces/srv/DescribeParameters/ekf_filter_node/get_parameter_types: rcl_interfaces/srv/GetParameterTypes/ekf_filter_node/get_parameters: rcl_interfaces/srv/GetParameters/ekf_filter_node/list_parameters: rcl_interfaces/srv/ListParameters/ekf_filter_node/set_parameters: rcl_interfaces/srv/SetParameters/ekf_filter_node/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically/enable: std_srvs/srv/Empty/set_pose: robot_localization/srv/SetPose/toggle: robot_localization/srv/ToggleFilterProcessingService Clients:Action Servers:Action Clients:
该节点订阅了/imu/data和/odom_raw数据,然后发布一个/odom数据。
相关文章:
亚博microros小车-原生ubuntu支持系列:16 机器人状态估计
本来想测试下gmapping建图,但是底层依赖了yahboomcar_bringup做底层的数据处理,所以先把依赖的工程导入。 程序启动后,会订阅imu和odom数据,过滤掉一部分的imu数据后,然后与odom数据进行融合,最后输出一个…...
Greenplum临时表未清除导致库龄过高处理
1.问题 Greenplum集群segment后台日志报错 2.回收库龄 master上执行 vacuumdb -F -d cxy vacuumdb -F -d template1 vacuumdb -F -d rptdb 3.回收完成后检查 仍然发现segment还是有库龄报警警告信息发出 4.检查 4.1 在master上检查库年龄 SELECT datname, datfrozen…...
【Unity3D】实现横版2D游戏角色二段跳、蹬墙跳、扶墙下滑
目录 一、二段跳、蹬墙跳 二、扶墙下滑 一、二段跳、蹬墙跳 GitHub - prime31/CharacterController2D 下载工程后直接打开demo场景:DemoScene(Unity 2019.4.0f1项目环境) Player物体上的CharacterController2D,Mask添加Wall层…...
mybatis(134/134)完结
一级缓存(默认情况下开启)同一个sqlsession中执行相同的查询语句走一级缓存 二级缓存 :同一个sqlsessionfactory,sqlsession关闭了才会将一级缓存提交到二级缓存中 外部编写的缓存 PageHelper插件:方便进行分页&#x…...
PaddleSeg 从配置文件和模型 URL 自动化运行预测任务
git clone https://github.com/PaddlePaddle/PaddleSeg.git# 在ipynb里面运行 cd PaddleSegimport sys sys.path.append(/home/aistudio/work/PaddleSeg)import os# 配置文件夹路径 folder_path "/home/aistudio/work/PaddleSeg/configs"# 遍历文件夹,寻…...
人工智能丨视觉识别在自动化测试中的应用
视觉识别:自动化测试的新纪元 在当今快速发展的科技时代,软件测试正面对着日益复杂的挑战。作为其中一个关键领域,自动化测试不断寻求创新的方法,以提高测试效率和准确性。在这一背景下,视觉识别技术的引入为自动化测…...
lambda 表达式:Python中的极简艺术
lambda 表达式:Python中的极简艺术 — 让你的代码更简洁、更高效! 引言 在 Python 中,lambda 表达式是一种简洁的定义匿名函数的方式。它通常用于需要函数对象的场景,但又不需要显式定义一个完整函数的场合。本文将详细介绍 la…...
BLE透传方案,IoT短距无线通信的“中坚力量”
在物联网(IoT)短距无线通信生态系统中,低功耗蓝牙(BLE)数据透传是一种无需任何网络或基础设施即可完成双向通信的技术。其主要通过简单操作串口的方式进行无线数据传输,最高能满足2Mbps的数据传输速率&…...
无用知识研究:对std::common_type以及问号表达式类型的理解
先说结论:如果问号表达式能编译通过,那么std::common_type就能通过。因为common_type的底层依赖的就是?: common_type的实现里,利用了问号表达式:ternary conditional operator (?:) https://stackoverflow.com/questions/1432…...
苍穹外卖—订单模块
该模块分为地址表的增删改查、用户下单、订单支付三个部分。 第一部分地址表的增删改查无非就是对于单表的增删改查,较基础,因此直接导入代码。 地址表 一个用户可以有多个地址,同时有一个地址为默认地址。用户还可为地址添加例如&q…...
「 机器人 」扑翼飞行器的数据驱动建模核心方法
前言 数据驱动建模可充分利用扑翼飞行器的已有运行数据,改进动力学模型与控制策略,并对未建模动态做出更精确的预测。在复杂的非线性飞行环境中,该方法能有效弥补传统解析建模的不足,具有较高的研究与应用价值。以下针对主要研究方向和实现步骤进行整理与阐述。 1. 数据驱动…...
openeuler 22.03 lts sp4 使用 cri-o 和 静态 pod 的方式部署 k8s-v1.32.0 高可用集群
前情提要 整篇文章会非常的长…可以选择性阅读,另外,这篇文章是自己学习使用的,用于生产,还请三思和斟酌 静态 pod 的部署方式和二进制部署的方式是差不多的,区别在于 master 组件的管理方式是 kubectl 还是 systemctl有 kubeadm 工具,为什么还要用静态 pod 的方式部署?…...
Helm Chart 实战指南
Helm 是 Kubernetes 的包管理工具,而 Helm Chart 是 Helm 的核心概念,用于定义、安装和升级 Kubernetes 应用。本文将带你从零开始,通过实战演练,掌握 Helm Chart 的创建、配置和部署,帮助你高效管理 Kubernetes 应用。 1. 环境准备 在开始之前,确保你已经具备以下环境:…...
【数据结构】_顺序表经典算法OJ(力扣版)
目录 1. 移除元素 1.1 题目描述及链接 1.2 解题思路 1.3 程序 2. 合并两个有序数组 1.1 原题链接及题目描述 1.2 解题思路 1.3 程序 1. 移除元素 1.1 题目描述及链接 原题链接:27. 移除元素 - 力扣(LeetCode) 题目描述:…...
目前市场主流的AI PC对于大模型本地部署的支持情况分析-Deepseek
以下是目前市场主流AI PC对**大模型本地部署支持情况**的综合分析,结合硬件能力、软件生态及厂商动态进行总结: --- ### **一、硬件配置与算力支持** 1. **核心处理器架构** - **异构计算方案(CPUGPUNPU)**:主流…...
Vue3 v-bind 和 v-model 对比
1. 基本概念 1.1 v-bind 单向数据绑定从父组件向子组件传递数据简写形式为 : 1.2 v-model 双向数据绑定父子组件数据同步本质是 v-bind 和 v-on 的语法糖 2. 基础用法对比 2.1 表单元素绑定 <!-- v-bind 示例 --> <template><input :value"text&quo…...
MySQL分表自动化创建的实现方案(存储过程、事件调度器)
《MySQL 新年度自动分表创建项目方案》 一、项目目的 在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低。分表是一种有效的优化策略,它将数据分散存储在多…...
接口技术-第6次作业
目录 作业内容 解答 1.假设在一个系统中,8255A的端口地址为184H-187H,A口工作于方式1输出,B口工作于方式1输入,禁止中断,C口剩余的两根线PC5,PC4位输入,如下图所示,试编写初始化…...
计算机网络之计算机网络体系结构
一、定义与概述 计算机网络体系结构是计算机网络及其部件所应该完成功能的精确定义,这些功能由何种硬件或软件完成是遵循这种体系结构的。体系结构是抽象的,实现是具体的,是运行在计算机软件和硬件之上的。 二、主流模型 目前,…...
(1)Linux高级命令简介
Linux高级命令简介 在安装好linux环境以后第一件事情就是去学习一些linux的基本指令,我在这里用的是CentOS7作演示。 首先在VirtualBox上装好Linux以后,启动我们的linux,输入账号密码以后学习第一个指令 简介 Linux高级命令简介ip addrtou…...
网络直播时代的营销新策略:基于受众分析与开源AI智能名片2+1链动模式S2B2C商城小程序源码的探索
摘要:随着互联网技术的飞速发展,网络直播作为一种新兴的、极具影响力的媒体形式,正逐渐改变着人们的娱乐方式、消费习惯乃至社交模式。据中国互联网络信息中心数据显示,网络直播用户规模已达到3.25亿,占网民总数的45.8…...
CSS(快速入门)
欢迎大家来到我的博客~欢迎大家对我的博客提出指导,有错误的地方会改进的哦~点击这里了解更多内容 目录 一、什么是CSS?二、基本语法规范三、CSS选择器3.1 标签选择器3.2 id选择器3.3 class选择器3.4 通配符选择器3.5 复合选择器 四、常用CSS样式4.1 color4.2 font…...
waitpid使用
waitpid 是 Unix/Linux 系统中用于等待子进程状态变化的系统调用。它允许父进程挂起执行,直到指定的子进程终止或者发生了其他指定的状态变化。 waitpid 的语法 pid_t waitpid(pid_t pid, int *status, int options); pid: 要等待的子进程的进程 ID,特殊…...
对顾客行为的数据分析:融入2+1链动模式、AI智能名片与S2B2C商城小程序的新视角
摘要:随着互联网技术的飞速发展,企业与顾客之间的交互方式变得日益多样化,移动设备、社交媒体、门店、电子商务网站等交互点应运而生。这些交互点不仅为顾客提供了便捷的服务体验,同时也为企业积累了大量的顾客行为数据。本文旨在…...
MySQL查询优化(三):深度解读 MySQL客户端和服务端协议
如果需要从 MySQL 服务端获得很高的性能,最佳的方式就是花时间研究 MySQL 优化和执行查询的机制。一旦理解了这些,大部分的查询优化是有据可循的,从而使得整个查询优化的过程更有逻辑性。下图展示了 MySQL 执行查询的过程: 客户端…...
pytorch线性回归模型预测房价例子
import torch import torch.nn as nn import torch.optim as optim import numpy as np# 1. 创建线性回归模型类 class LinearRegressionModel(nn.Module):def __init__(self):super(LinearRegressionModel, self).__init__()self.linear nn.Linear(1, 1) # 1个输入特征&…...
UE AController
定义和功能 AController是一种特定于游戏的控制器,在UE框架中用于定义玩家和AI的控制逻辑。AController负责处理玩家输入,并根据这些输入驱动游戏中的角色或其他实体的行为。设计理念 AController设计用于分离控制逻辑与游戏角色,增强游戏设计…...
选择的阶段性质疑
条条大路通罗马,每个人选择的道路,方向并不一样,但不妨碍都可以到达终点,而往往大家会更推崇自己走过的路径。 自己靠什么走向成功,自己用了什么方法,奉行什么原则或者理念,也会尽可能传播这种&…...
Git进阶之旅:Git 配置信息 Config
Git 配置级别: 仓库级别:local [ 优先级最高 ]用户级别:global [ 优先级次之 ]系统级别:system [ 优先级最低 ] 配置文件位置: git 仓库级别对应的配置文件是当前仓库下的 .git/configgit 用户级别对应的配置文件时用…...
51单片机开发:定时器中断
目标:利用定时器中断,每隔1s开启/熄灭LED1灯。 外部中断结构图如下图所示,要使用定时器中断T0,须开启TE0、ET0。: 系统中断号如下图所示:定时器0的中断号为1。 定时器0的工作方式1原理图如下图所示&#x…...
