Autoware学习笔记waypoint_follower之twist_filter

2023-05-16

twis_filter.launch文件

<!-- -->
<launch>
    <!-- rosrun waypoint_follower twist_filter -->    
    <node pkg="waypoint_follower" type="twist_filter" name="twist_filter" output="log">    
    </node>    
    <node pkg="waypoint_follower" type="twist_gate" name="twist_gate" output="log">    
    </node>
</launch>

launch文件中同时启动了twist_filtertwist_gate两个节点。

twist_filter节点

twist_filter的主函数如下:

int main(int argc, char **argv)
{    
    ros::init(argc, argv, "twist_filter");
    
    ros::NodeHandle nh;    
    ros::NodeHandle private_nh("~");
    
    ros::Subscriber twist_sub = nh.subscribe("twist_raw", 1, TwistCmdCallback);    
    ros::Subscriber config_sub = nh.subscribe("config/twist_filter", 10, configCallback);    
    g_twist_pub = nh.advertise<geometry_msgs::TwistStamped>("twist_cmd", 1000);
    
    ros::spin();    
    return 0;
}

初始化ROS,指定节点名称为“twist_filter”。
定义了两个订阅者用来接收“twist_raw”“config/twist_filter”话题,并调用回调函数处理。其中twist_raw话题由pure_pursuit节点发布(见前面的博客),config/twist_fiter来自于runtime的config
也定义了一个发布者发布消息类型为<geometry_msgs::TwistStamped>twist_cmd话题。
主函数的内容比较简单,来看一下两个回调函数:

void TwistCmdCallback(const geometry_msgs::TwistStampedConstPtr &msg)
{
  double v = msg->twist.linear.x;  
  double omega = msg->twist.angular.z;
 
  if(fabs(omega) < ERROR)
  {    
    g_twist_pub.publish(*msg);    
    return;  
  }
  
  double max_v = g_lateral_accel_limit / fabs(omega);
  geometry_msgs::TwistStamped tp;  
  tp.header = msg->header;
  double a = v * omega;  ROS_INFO("lateral accel = %lf", a);

  tp.twist.linear.x = fabs(a) > g_lateral_accel_limit ? max_v : v;  
  tp.twist.angular.z = omega;
  static double lowpass_linear_x = 0;  
  static double lowpass_angular_z = 0;  
  lowpass_linear_x = g_lowpass_gain_linear_x * lowpass_linear_x + (1 - g_lowpass_gain_linear_x) * tp.twist.linear.x;
  lowpass_angular_z = g_lowpass_gain_angular_z * lowpass_angular_z + (1 - g_lowpass_gain_angular_z) *tp.twist.angular.z;
  tp.twist.linear.x = lowpass_linear_x;  
  tp.twist.angular.z = lowpass_angular_z;
  ROS_INFO("v: %f -> %f",v,tp.twist.linear.x);  
  g_twist_pub.publish(tp);
}

接受的消息中包含速度V和角速度Omega,首先判断角速度大小 是否接近于0,是的话则认为当前是直线行驶不考虑横向加速度,直接发布接收到的消息。
若角速度的值不接近零(非直线行驶),有如下参数设定

double g_lateral_accel_limit = 5.0;
double g_lowpass_gain_linear_x = 0.0;
double g_lowpass_gain_angular_z = 0.0;
constexpr double RADIUS_MAX = 9e10;
constexpr double ERROR = 1e-8;

根据给定的横向加速度限制g_lateral_accel_limit = 5,得到当前角速度时对应的最大行驶速度max_v。计算当前的横向加速度a = v * omega这些公式涉及到物理知识也比较容易有疑问的可以复习一下。
新建geometry_msgs::TwistStamped tp
如果根据接受到的速度和角速度计算出的横向加速度a大于给定的限值,则tp的线速度赋值为max_v,否则赋值为接收的速度v。其角速度Omega就是接收的角速度。
接着对输出的速度和角速度进行一阶低通滤波处理。
一阶低通滤波的算法公式为:
                Y(n)=αX(n) + (1-α)Y(n-1)
  式中:α=滤波系数(通常较小);X(n)=本次采样值;Y(n-1)=上次滤波输出值;Y(n)=本次滤波输出值。
一阶低通滤波法采用本次采样值与上次滤波输出值进行加权,得到有效滤波值,其输出对输入有反馈作用。

其中在另一个回调函数中配置了一些参数。

void configCallback(const autoware_config_msgs::ConfigTwistFilterConstPtr &config)
{  
  g_lateral_accel_limit = config->lateral_accel_limit;  
  ROS_INFO("g_lateral_accel_limit = %lf",g_lateral_accel_limit);  
  g_lowpass_gain_linear_x = config->lowpass_gain_linear_x;  
  ROS_INFO("lowpass_gain_linear_x = %lf",g_lowpass_gain_linear_x);  
  g_lowpass_gain_angular_z = config->lowpass_gain_angular_z;  
  ROS_INFO("lowpass_gain_angular_z = %lf",g_lowpass_gain_angular_z);
}

参数可以通过runtime manage配置,如下图示例。
在这里插入图片描述
最后把处理好的消息发布出去geometry_msgs::TwistStamped>("twist_cmd")
twist_filter节点主要是对速度和角速度进行一个满足车辆运动学的前提下进行检验,不能超过给定的横向加速度阈值,否则进行减速处理。

往往和 twist_filter节点一同工作的还有twist_gate,后续补上。

由于水平有限以上内容仅是自己学习理解过程,各位读者朋友发现问题之处还请帮忙提出,不胜感激。

有问题还请指正,不胜感激。

共同交流,共同进步!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Autoware学习笔记waypoint_follower之twist_filter 的相关文章

  • 我的Chrome插件

    1 AdBlock 用来屏蔽广告 xff0c 用过的人都说好 2 Flash Block Plus 用来限制Flash的播放 3 Flash Control 用来限制Flash的播放 4 Full Page Screen Capture 好
  • 网络协议栈基本知识

    https www cnblogs com mrlayfolk p 11965347 html 个人觉得原作者把网络协议栈讲解的很好 xff08 生动 xff0c 易理解 xff09 xff0c 所以在这里记录并分享 1 网络协议分层 按照
  • VS code 发送http请求

    下载rest http插件 xff0c 重启vscode 发送get请求 span class token annotation punctuation 64 hostname span span class token operator
  • AD 教程(一)

    写在前面 xff1a 本教程源自凡亿教育出品的 AD2019 从入门到精通 xff0c 笔记分为六部分 xff0c 如有错误之处 xff0c 请多指教 视频出处 一 元件库的创建 1 软件的安装2 AD工程的组成及创建3 元件库介绍 电阻容
  • docker 常用删除镜像和容器命令记录

    删除镜像命令 一 通过标签删除镜像 通过如下两个都可以删除镜像 xff1a 1 docker rmi image 或者 xff1a 1 docker image rm image 支持的子命令如下 xff1a f force 强制删除镜像
  • 树莓派安装ROS系统【第一篇】

    树莓派装ROS系统 xff08 第一篇 xff09 注 xff1a 第一篇 主要是撰写了树莓派安装ROS系统 xff0c 远程连接等操作 在网上扒拉了一些资料 xff0c 感觉各有优缺 xff0c 作为踩坑者要进行信息的筛选 xff0c 因
  • 使用Scala编写第一个Spark程序

    使用Scala编写第一个Spark程序 演示目标演示环境创建Spark工程本地运行Spark集群运行安装SparkSpark standaloneSpark on yarnyarn client模式yarn cluster模式运行结果 演示
  • Git常用命令及使用

    Git常用命令 根据分支名查询分支 根据分支名查询分支 span class token comment 根据输入的分支名模糊匹配本地和远程分支 span span class token function git span branch
  • Elasticsearch的安装与启动

    Elasticsearch的安装与启动 演示目标安装与启动配置远程服务器访问启动时异常与解决方法 演示目标 在Linux环境中安装并启动Elasticsearch 7 x版本 安装与启动 下载ES https www elastic co
  • 各软件下载地址

    常用软件下载地址 软件备注JDK各版本华为云高速下载
  • 使用VMware创建CentOS7虚拟机并设置网络环境(桥接、NAT、内网)

    使用VMware创建CentOS7虚拟机并设置网络环境 xff08 桥接 NAT 内网 xff09 演示目标演示环境创建虚拟机设置外网NAT模式桥接模式 设置内网 演示目标 使用VMware Workstation创建三台CentOS7虚拟
  • SOAP出现问题:由于 ContractFilter 在 EndpointDispatcher 不匹配,因此 Action 为“”的消息无法在接收方处理(已解决)

    场景 SOAPUI在服务器上正常运行 xff1b 用Java的Post请求调用时 xff0c 能够调通接口 xff0c 但出现问题 xff1a lt s Envelope xmlns s 61 http schemas xmlsoap or
  • 从0开始搭建Hadoop2.x高可用集群(HDFS篇)

    从0开始搭建Hadoop2 x高可用集群 xff08 HDFS篇 xff09 演示目标演示环境注意事项准备虚拟机关闭防火墙检查系统时间修改host设置免密登录卸载OpenJDK安装软件 准备HDFS配置cote site xml配置hdfs
  • 从0开始搭建Hadoop2.x高可用集群(YARN篇)

    从0开始搭建Hadoop2 x高可用集群 xff08 YARN篇 xff09 演示目标演示环境准备YARN配置yarn site xml配置mapred site xml拷贝配置 启动YARN集群验证高可用 xff08 HA xff09 演
  • 解决Win10菜单栏中搜索框无法搜索应用

    解决Win10菜单栏中搜索框无法搜索应用 如图 xff0c 在任务管理器中找到Windows资源管理器 xff0c 重新启动即可
  • 使用Java编写第一个MapReduce程序

    使用Java编写第一个MapReduce程序 演示目标演示环境搭建MR工程配置pom xml编写WordCountMapper java编写WordCountReducer java编写启动类Startup java打包工程 部署MR工程上
  • 一次函数和正比例函数的介绍

    一次函数 一次函数 xff1a 什么是一次函数 xff1f 图像展示一次函数和正比例函数 xff1a 例题一 xff1a y 61 2 x
  • STM32F103开发板霸道V2兼容指南者 从零开始(3)

    这里是对STM32学习路线的截图 xff0c 方便平时巩固32的知识 截图超多 xff0c 实操步骤都有 使用开发板为STM32F103 xff0c 后面四位影响不大 xff0c 在烧写上电的时候选好芯片即可 xff0c 下面有演示 在下小
  • Docker在ubuntu中安装与使用

    Docker是一种轻量级的虚拟化技术 xff0c 同时是一个开源的应用容器运行环境搭建平台 xff0c 可以让开发者以便捷方式打包应用到一个可移植的容器中 xff0c 然后安装至任何运行Linux或Windows等系统的服务器上 相较于传统
  • ROS定义自己的消息类型 自定义消息类型

    The massages which I need to record are 5 topics and 2 massege types I want to set them into one massege type and it is

随机推荐

  • 嵌入式行业职位分析

    嵌入式开发涵盖硬件软件 xff0c 开发链条很长 xff0c 要根据自己的实际情况选择适应的职位 嵌入式的职位大概有 xff1a 1 硬件工程师 xff1a 负责底层的硬件设计 xff0c 主要要用到 xff1a 1 处理器 xff1a A
  • 常见单片机对比

    各个厂商们也在速度 内存 功能上此起彼伏 xff0c 参差不齐 同时涌现出一大批拥有代表性单片机的厂商 xff1a Atmel TI ST MicroChip ARM 国内的宏晶STC单片机也是可圈可点 下面为大家带来51 MSP430 T
  • Maven关于阿里云的镜像配置地址选哪一个的问题

    网上很多文章介绍配置的地址是 xff1a lt mirror gt lt id gt alimaven lt id gt lt name gt aliyun maven lt name gt lt url gt http maven ali
  • 嵌入式Linux软件开发的三个分类

    一 嵌入式驱动工程师 xff1a 编写和移植各种芯片驱动 xff08 如音频芯片 xff09 xff0c 优化硬件设备驱动 xff08 如温湿度传感器 xff09 xff0c 得精通各种硬件接口协议 xff08 如I2C协议 xff09 系
  • 华为 联发科和台积电的关系及芯片制造产业中其他公司了解

    台积电 xff1a 全称台湾积体电路制造股份有限公司 xff0c 中文简称台积电 xff0c 英文简称 xff1a tsmc xff0c 是全球第一家专业集成电路 xff08 IC xff09 制造服务 xff08 晶圆代工foundry
  • 嵌入式Linux开发细分四个岗位

    嵌入式Linux开发从下到bai上分为 xff1a 嵌du入式硬件开发 嵌入式驱动开发 嵌入式系统zhi开发 嵌dao入式软件开发 一 嵌入式硬件开发 xff1a 熟悉电路等知识 xff0c 非常熟悉各种常用元器件 xff0c 掌握模拟电路
  • Android系国产手机操作系统汇总

    1 华为的Emotion UI系统 Emotion UI 简称EMUI 是华为基于Android 安卓 进行开发的情感化操作系统 拥有简化的用户界面 新的手势导航和HiVision的 AI 功能 xff0c 新系统在国内已经向部分机型推送更
  • 嵌入式开发学习路线 及书籍推荐

    嵌入式学习是一个循序渐进的过程 xff0c 如果是希望向嵌入式软件方向发展的话 xff0c 目前最常见的是嵌入式Linux方向 xff0c 关注这个方向 xff0c 大概分3个阶段 xff1a 1 嵌入式linux上层应用 xff0c 包括
  • Cat.1

    近日 xff0c 中国联通Cat 1芯片大规模采购招标结果出炉 xff0c 这是自年初 一夜走红 之后 xff0c Cat 1再次引发业界关注 实际上 xff0c Cat 1并不是一项新技术 xff0c 其早在十年前就已 出道 坐了十年 冷
  • LTE Cat1有什么用?基于4G LTE打造cat1,弥补NB-IoT和5G的空缺。

    简介 从目前蜂窝物联网发展的态势看 xff0c LTE Cat 1承担4G物联网连接主力的时机已经开启 其中 xff0c Category 1作为最低版参数配置的用户终端等级 xff0c 让业界能够低成本地设计 低配版 的4G终端 xff0
  • 前辈对于JAVA开发和嵌入式发表的一些看法

    提问一 xff1a 二战考研失败 xff0c 今年25 xff0c 在放弃考研 xff0c 学习编程 但是嵌入式orJAVA走哪条路好呢 xff1f 最近在B站看编程视频 xff0c 也刷到一些up主视频 xff0c 说是java市场饱和
  • ubuntu18.04 Realsense d435i SDK 和 ROS wrapper 安装以及相机imu和分别率参数更改

    Realsense d435i SDK 和 ROS wrapper 安装以及相机imu和分别率参数更改 一 SDK参考官方网站 1 Register the server s public key sudo apt span class t
  • vscode中配置git并上传项目到远程仓库

    首先你电脑上得下载git吧 在vscode中设置git 参考 成功后你就会看到 下面就是要把本地项目发布到远程仓库上去 xff08 1 xff09 现在gitee上建一个仓库 xff08 2 以终端操作为例 xff0c 感觉命令行操作更清晰
  • redis整理-kw

    缓存有哪些分类 本地缓存 xff1a 进程中的缓存 xff1b 分布式缓存 xff1a xff08 分布式 xff0c 理解为 xff0c 多个模块 xff0c 共同组成一个系统 xff0c 不一定在或者不在同台服务器上 xff09 多级缓
  • 定时任务报错Encountered invalid @Scheduled method ‘...‘: Exactly one of the ‘cron‘, ‘fixedDelay

    今天在搞定时任务 xff0c 突然报了这个问题 xff0c 发现是在使用 64 Scheduled这个注解时 xff0c 忘记设置参数了 xff0c 比如配置一个默认的延期时间fixedDelay 这里的fixedDelay单位是毫秒 xf
  • 超详细Jetson Xavier NX烧录系统镜像

    一 硬件准备 1 SD卡 xff08 至少32G xff09 和读卡器 xff0c 前者用于转载系统镜像 xff0c 后者用于镜像烧录 2 Jetson Xavier NX开发套件 二 软件准备 1 SDFormatter xff1a 用于
  • python、ros和socket通讯

    项目需要把笔记本的数据发送到小车的ros上 xff0c 我们采用socket通讯的方法 首先把通过socket把笔记本的数据发送到小车上 xff0c 然后通过消息发布和订阅的方式把数据传递到小车的ros上 一 通过socket发送笔记本上的
  • 【YOLOv3 预测】YOLOv3图像输入->处理->输出全过程

    文章目录 1 数据输入输出代码详解2 yolo detect image详解3 感谢链接 1 数据输入输出代码详解 数据输入方式主要包括三种 xff1a 读取本地一张图片 代码中predict状态 读取本地文件夹中所有图片 代码中dir p
  • STM32嵌入式开发常用的协议UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB、SD卡、1-WIRE、Ethernet

    在单片机开发中 xff0c UART I2C RS485等普遍存在 xff0c 对它们的认识可能模棱两可 xff0c 本文它们整理了 UART口通用异步收发器 UART口指的是一种物理接口形式 硬件 UART是异步 xff0c 全双工串口总
  • Autoware学习笔记waypoint_follower之twist_filter

    twis filter launch文件 lt span class token operator span span class token operator span span class token operator span gt