1.PSATPAST电力系统软件
2.5.AMCL包源码分析 | 粒子滤波器模型与pf文件夹(一)
3.Linux下使用Netfilter框架编写内核模块
4.7.AMCL包源码分析 | 粒子滤波器模型与pf文件夹(三)
5.linux内核通信核心技术:Netlink源码分析和实例分析
PSATPAST电力系统软件
PSAT,系统即Power System Analysis 源码Toolbox,是系统一个功能强大的电力系统分析软件包,它提供了多种关键功能。源码首先,系统PF-潮流计算是源码d号源码研究电力系统问题的基础,采用标准牛顿-拉夫逊算法和快速解耦算法,系统用户可以方便地通过*.mdl或*.m文件进行计算,源码并查看母线电压相角、系统有功和无功等详细结果。源码潮流计算结果支持文本格式输出,系统便于与其他电力系统分析软件配合使用。源码
OPF-最优潮流采用Mehrotra预测-修改的系统内点法,支持多种目标函数,源码为电力系统优化提供了强大工具。系统SSSA-小信号分析则针对低频振荡问题,通过解析法计算Jacobian矩阵,确保了分析的精确性,对于跨大区输电安全至关重要。
此外,TDS-时域仿真通过修改系统参数和专用故障描述文件实现,用户可以根据研究需要动态调整模型。PSAT的GUI-用户界面直观易用,支持丰富的模型库,包括潮流模型(如母线、共享雨伞 源码变压器等)、电力市场模型、断路器模型、测量元件模型、电机模型、负荷模型、控制器模型(如调速器、PSS等)、FACTS技术模型(如SVC、TCSC等)、直流输电模型以及分布式发电系统模型(如风机模型)等,满足不同电力系统元件和问题的研究需求。
值得一提的是,由于其开源的特性,用户可以根据个人研究兴趣修改PSAT的源代码,将其与控制科学、信号处理等领域的最新思想结合,进行深度研究和创新。整体而言,PSAT是电力系统仿真计算的强大工具,为科研和实际应用提供了广泛的可能性。
5.AMCL包源码分析 | 粒子滤波器模型与pf文件夹(一)
粒子滤波器这部分内容较为复杂,涉及众多理论与数据结构,我们将分多个部分进行介绍。NFT艺术源码本部分内容主要对pf文件夹进行简要分析,包括蒙特卡罗定位在pf中的代码实现、KLD采样算法的理论介绍及其在pf中的具体实现。
pf文件夹主要由以下部分组成:3✖3对称矩阵的特征值和特征向量的分解、kdtree的创建与维护方法、Gaussian模型与概率密度模型采样生成粒子、三维列向量、三维矩阵、实现pose的向量运算、局部到全局坐标的转换以及全局坐标到局部坐标的转换。
接下来,我们将对各个头文件进行简要分析。
粒子滤波器是AMCL定位的理论基础,属于粒子滤波的一种。关于粒子滤波的原理及代码效果演示,可以参考相关资料。
AMCL包中的粒子滤波器作用如下:首先,参考pf.cpp中的pf_update_action函数,了解sample_motion_model代码实现;其次,参考pf.cpp中的pf_update_sensor函数,了解measurement_model的代码实现。
AMCL引入KLD采样理论,对蒙特卡罗定位进行再次改进。参考《概率机器人》第8章,剑舞DNF源码讨论粒子滤波器的效率及采样集大小的重要性。KLD采样是蒙特卡罗定位的一个变种,它能随时间改变粒子数,降低计算资源的浪费。
3.1 KLD_Sampling_MCL算法介绍:算法将以前的采样集合、地图和最新的控制及测量作为输入,要求统计误差界限err和sigma。在满足统计界限之前,KLD采样将一直产生粒子。算法产生新粒子,直到粒子数M超过Mx和使用者定义的最小值Mx(min)。
3.2 KLD采样算法在AMCL包中的具体应用:代码在pf.cpp中的pf_update_resample函数中实现。接下来,我们将详细分析pf文件夹里每个CPP文件的代码逻辑。
Linux下使用Netfilter框架编写内核模块
上篇文章我们从内核源码的角度分析Linux Netfilter框架下,hook钩子是如何被执行的,这次我们将通过一个示例代码,详细讲解如何利用Netfilter框架编写内核模块。
为了更好地理解,我绘制了一张图,通过源码中的具体实例,展示了自定义的钩子函数在内核中的位置。在内核中,有一个全局变量net_namespace_list链表,源码定义为系统中所有的网络命名空间都挂载在这个链表上。系统默认的网络命名空间是init_net,内核启动时,会在初始化网络命名空间net_ns_init中调用setup_net将init_net挂在net_namespace_list链表上。当我们新增hook钩子时,通常都是将其挂载在net_namespace_list链表对应的网络命名空间上。
接下来,我们将开始编写一个基于netfilter框架的简单内核模块。首先,我们需要声明一个hook函数,然后定义一个nf_hook_ops。
①我们在IP层(网络层)对网络包进行处理,这里.pf = NFPROTO_INET;
②hook点在PREROUTING链上,这里.hooknum = NF_INET_PRE_ROUTING;
③hook函数在此链上执行的优先级设置为最高,即.priority = NF_IP_PRI_FIRST;
④设置hook函数为我们前面自定义的函数,即.hook = (nf_hookfn *)packet_filter。
然后,我们需要在内核模块的init函数中注册该nf_hook_ops。
接下来是自定义的hook函数的具体实现。在hook函数中,我们只需简单地打印出源、目的IP和端口信息。
最后,我们需要注销自定义的hook钩子,并在内核模块退出时完成这一操作。
在编写Makefile、所需的头文件、编译并插入模块之后,我们可以在系统日志中看到相关输出。
在测试完成后,别忘了卸载内核模块,以完成整个操作。
至此,我们的内核模块编写任务就完成了。
7.AMCL包源码分析 | 粒子滤波器模型与pf文件夹(三)
在上一讲中,我们深入探讨了pf.cpp文件,它将Augmented-MCL算法和KLD-sampling算法融合使用。重点在于pf_pdf_gaussian_sample(pdf)函数、pf_init_model_fn_t初始化模型以及pf->random_pose_fn方法进行粒子初始化。粒子的插入和存储采用kd树数据结构,同时kd树也表达直方图的k个bins,通过叶子节点数展现。
本讲聚焦kd树在粒子滤波器模型中的作用(pf_kdtree.cpp)、概率密度函数pdf与特征值分解的关系(eig3.cpp、pf_vector.cpp)以及如何利用pdf生成随机位姿(pf_pdf.cpp),同时解释kd树与直方图的对应关系。
在概率密度函数pdf的创建中,我们首先定义一个高斯PDF结构体pf_pdf_gaussian_t,包含均值和协方差的描述,接着进行协方差矩阵的分解,通过Housholder算子和QR分解完成特征值分解过程。
通过pdf结构体实现随机位姿的生成,具体在pf_pdf.cpp中pf_pdf_gaussian_sample函数实现,使用无均值带标准差的高斯分布进行生成。
kd树数据结构在pf_kdtree.cpp中定义,包括节点和树的初始化,以及新位姿的插入。kd树的插入依据树的性质,通过计算max_split、中位数和分支点维数来定位新节点位置。查找节点和计算给定位姿权重则通过kd树结构实现,最终将树中叶子节点打标签,以统计特性如均值和协方差计算整个粒子集。
kd树在AMCL中承担直方图功能,以叶子节点数目表示bin个数(k),概率密度函数pdf依赖于输入的均值和协方差生成,用于随机位姿的产生。此外,kd树还用于判断粒子集是否收敛。最后,kd树表达直方图的过程在pf.cpp中pf_update_resample函数中实现,而pf_resample_limit函数用于设定采样限制。
kd树在粒子滤波器模型中的作用包括存储粒子样本集、查找和插入新位姿,以及统计特性计算。概率密度函数pdf的使用除了初始化粒子位姿外,还有判断粒子收敛的作用。下一讲将探讨amcl_node.cpp的处理内容,包括初始位姿、激光数据和坐标系转换,以及粒子滤波器pf的运用。
linux内核通信核心技术:Netlink源码分析和实例分析
Linux内核通信核心技术:Netlink源码分析和实例分析
什么是netlink?Linux内核中一个用于解决内核态和用户态交互问题的机制。相比其他方法,netlink提供了更安全高效的交互方式。它广泛应用于多种场景,例如路由、用户态socket协议、防火墙、netfilter子系统等。
Netlink内核代码走读:内核代码位于net/netlink/目录下,包括头文件和实现文件。头文件在include目录,提供了辅助函数、宏定义和数据结构,对理解消息结构非常有帮助。关键文件如af_netlink.c,其中netlink_proto_init函数注册了netlink协议族,使内核支持netlink。
在客户端创建netlink socket时,使用PF_NETLINK表示协议族,SOCK_RAW表示原始协议包,NETLINK_USER表示自定义协议字段。sock_register函数注册协议到内核中,以便在创建socket时使用。
Netlink用户态和内核交互过程:主要通过socket通信实现,包括server端和client端。netlink操作基于sockaddr_nl协议套接字,nl_family制定协议族,nl_pid表示进程pid,nl_groups用于多播。消息体由nlmsghdr和msghdr组成,用于发送和接收消息。内核创建socket并监听,用户态创建连接并收发信息。
Netlink关键数据结构和函数:sockaddr_nl用于表示地址,nlmsghdr作为消息头部,msghdr用于用户态发送消息。内核函数如netlink_kernel_create用于创建内核socket,netlink_unicast和netlink_broadcast用于单播和多播。
Netlink用户态建立连接和收发信息:提供测试例子代码,代码在github仓库中,可自行测试。核心代码包括接收函数打印接收到的消息。
总结:Netlink是一个强大的内核和用户空间交互方式,适用于主动交互场景,如内核数据审计、安全触发等。早期iptables使用netlink下发配置指令,但在iptables后期代码中,使用了iptc库,核心思路是使用setsockops和copy_from_user。对于配置下发场景,netlink非常实用。
链接:内核通信之Netlink源码分析和实例分析