if (px4_usb_quirk) startup_px4_usb_quirk(); std::stringstream ss; for (auto &s : mavconn::MAVConnInterface::get_known_dialects()) ss << " " << s; ROS_INFO("Built-in SIMD instructions: %s", Eigen::SimdInstructionSetsInUse()); ROS_INFO("Built-in MAVLink package version: %s", MAVLINK_VERSION); ROS_INFO("Known MAVLink dialects:%s", ss.str().c_str()); ROS_INFO("MAVROS started. MY ID %u.%u, TARGET ID %u.%u", system_id, component_id, tgt_system_id, tgt_component_id);
时间: 2023-06-14 14:05:44 浏览: 173
这段代码是一个在ROS下运行的MAVROS节点的启动代码。MAVROS是一个ROS的软件包,用于与MAVLink兼容的飞行控制器通信。在这个代码段中:
- 如果定义了px4_usb_quirk宏,则调用startup_px4_usb_quirk()函数;
- 使用std::stringstream创建一个字符串流ss,并遍历mavconn::MAVConnInterface::get_known_dialects()返回的MAVLink方言列表,将它们添加到ss字符串流中;
- 打印出内置的SIMD指令集使用情况;
- 打印出内置的MAVLink包版本号;
- 打印出已知的MAVLink方言列表;
- 打印出MAVROS节点的启动信息,包括本地系统ID、组件ID和目标系统ID、组件ID。
相关问题
nh.param<std::string>("fcu_url", fcu_url, "serial:///dev/ttyACM0"); nh.param<std::string>("gcs_url", gcs_url, "udp://@"); nh.param<bool>("gcs_quiet_mode", gcs_quiet_mode, false); nh.param("conn/timeout", conn_timeout_d, 30.0); nh.param<std::string>("fcu_protocol", fcu_protocol, "v2.0"); nh.param("system_id", system_id, 1); nh.param<int>("component_id", component_id, mavconn::MAV_COMP_ID_UDP_BRIDGE); nh.param("target_system_id", tgt_system_id, 1); nh.param("target_component_id", tgt_component_id, 1); nh.param("startup_px4_usb_quirk", px4_usb_quirk, false); nh.getParam("plugin_blacklist", plugin_blacklist); nh.getParam("plugin_whitelist", plugin_whitelist);
这段代码是使用ROS参数服务器获取一些参数的值。其中:
- `nh` 是一个 `ros::NodeHandle` 对象,用于与ROS节点通信。
- `nh.param<std::string>("fcu_url", fcu_url, "serial:///dev/ttyACM0")` 表示从参数服务器中读取名为 `fcu_url` 的参数值,如果不存在则使用默认值 `"serial:///dev/ttyACM0"`。读取到的参数值以 `std::string` 类型存储在变量 `fcu_url` 中。
- 同理,`gcs_url`、`gcs_quiet_mode`、`conn_timeout_d`、`fcu_protocol`、`system_id`、`component_id`、`tgt_system_id`、`tgt_component_id`、`px4_usb_quirk`、`plugin_blacklist` 和 `plugin_whitelist` 都是从参数服务器中读取相应的参数值。
- `nh.getParam("plugin_blacklist", plugin_blacklist)` 和 `nh.getParam("plugin_whitelist", plugin_whitelist)` 相当于 `nh.param()`,但是不设置默认值,如果参数不存在则 `plugin_blacklist` 和 `plugin_whitelist` 不会被赋值。
static void nvme_calc_irq_sets(struct irq_affinity *affd, unsigned int nrirqs) { struct nvme_dev *dev = affd->priv; unsigned int nr_read_queues, nr_write_queues = dev->nr_write_queues; if (!nrirqs) { nrirqs = 1; nr_read_queues = 0; } else if (nrirqs == 1 || !nr_write_queues) { nr_read_queues = 0; } else if (nr_write_queues >= nrirqs) { nr_read_queues = 1; } else { nr_read_queues = nrirqs - nr_write_queues; } dev->io_queues[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; affd->set_size[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; dev->io_queues[HCTX_TYPE_READ] = nr_read_queues; affd->set_size[HCTX_TYPE_READ] = nr_read_queues; affd->nr_sets = nr_read_queues ? 2 : 1; }static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues) { struct pci_dev *pdev = to_pci_dev(dev->dev); struct irq_affinity affd = { //ָ���ж����Եļ��㷽���Ͳ��� .pre_vectors = 1, .calc_sets = nvme_set_irq_affinity, //nvme_calc_irq_sets, .priv = dev, }; unsigned int irq_queues, poll_queues; poll_queues = min(dev->nr_poll_queues, nr_io_queues - 1); dev->io_queues[HCTX_TYPE_POLL] = poll_queues; dev->io_queues[HCTX_TYPE_DEFAULT] = 1; dev->io_queues[HCTX_TYPE_READ] = 0; irq_queues = 1; if (!(dev->ctrl.quirks & NVME_QUIRK_SINGLE_VECTOR)) irq_queues += (nr_io_queues - poll_queues); return pci_alloc_irq_vectors_affinity(pdev, 1, irq_queues, PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY, &affd); } 在 Linux 5.17.12 内核版本中,可以通过修改 pci_alloc_irq_vectors_affinity() 函数的 affinity_hint 参数来绑定 NVMe 驱动的所有 I/O 队列到同一 CPU 核心上。
是的,通过设置 affinity_hint 参数为一个指定的 CPU 核心,可以将 NVMe 驱动的所有 I/O 队列绑定到同一 CPU 核心上,从而提高系统的性能和响应速度。这个参数可以在 nvme_setup_irqs() 函数中调用 pci_alloc_irq_vectors_affinity() 函数时设置。同时,在 nvme_calc_irq_sets() 函数中也可以根据系统的硬件资源和配置情况,动态计算 IRQ 的分配方式和数量,以实现更加高效的 IRQ 管理和利用。
阅读全文