其实,在进行ROS2/ROS1程序编写的时候,通常需要启动很多节点,有时候大于60+节点也非常常见的。
那么,就需要调度这些节点。不同节点工作频率不同,有些是10Hz就可以,有些需要1000Hz。
基础概念:
- taskset
- isolcpus
taskset 用于在给定 pid 的情况下设置或检索正在运行的进程的 CPU 亲和性,或者启动具有给定 CPU 亲和性的新命令。 CPU 亲和性是一种调度程序属性,它将进程“绑定”到系统上的一组给定 CPU。 Linux 调度程序将遵循给定的 CPU 亲和性,并且该进程不会在任何其他 CPU 上运行。请注意,Linux 调度程序还支持自然 CPU 亲和性:出于性能原因,调度程序会尝试将进程保持在同一个 CPU 上,只要可行。因此,强制特定的 CPU 亲和性仅在某些应用程序中有用。
CPU 亲和性表示为位掩码,最低位对应于第一个逻辑 CPU,最高位对应于最后一个逻辑 CPU。并非所有 CPU 都可能存在于给定系统上,但掩码可能指定比现有更多的 CPU。检索到的掩码将仅反映与系统上物理 CPU 对应的位。如果给出了无效的掩码(即,对应于当前系统上没有有效 CPU 的掩码),则会返回错误。掩码通常以十六进制给出。例如,
- 0x00000001 是处理器#0
- 0x00000003 是处理器#0 和#1
- 0xFFFFFFFF 是所有处理器(#0 到 #31)
当任务集返回时,可以保证给定程序已被调度到合法的 CPU 上。
isolcpus需要注意amd和intel的差异性,如果是arm或nVidia……
极端情况下性能不稳定,或者CPU占满。
采用 "events executor",这个在ROS 2 Humble可以直接使用,其他之前版本需要对应源码编译。
回调函数或时间
FastDDS需要配置后再使用,这样更好一些。
否则,有时 FastDDS 在其他节点正在运行时重新启动节点后无法列出节点/主题。
具体查看discovery_server;或者切换到CycloneDDS
如果选择CycloneDDS,也需要进行配置,而非直接使用默认参数。
ROS_DOMAIN_ID配置相同在大量网络需求或多机器人情况下会使得网络不堪重负……
colcon build 最好加一些参数否则不怎么好用。