if (gcs_url != "") { ROS_INFO_STREAM("GCS URL: " << gcs_url); try { gcs_link = MAVConnInterface::open_url_no_connect(gcs_url, system_id, component_id); gcs_link_diag.set_mavconn(gcs_link); gcs_diag_updater.setHardwareID(gcs_url); gcs_diag_updater.add(gcs_link_diag); } catch (mavconn::DeviceError &ex) { ROS_FATAL("GCS: %s", ex.what()); ros::shutdown(); return; } } else ROS_INFO("GCS bridge disabled");
时间: 2023-06-14 11:06:29 浏览: 188
这段代码是一个ROS节点的一部分,用于连接到MAVLink通信协议的设备,例如Pixhawk飞控。它首先检查是否提供了GCS(地面站)的URL,如果提供了,它会尝试打开一个MAVLink连接,并创建一个诊断更新器来监视连接状态。如果连接失败,它将输出一个致命错误,并关闭ROS节点。如果没有提供GCS URL,则只会输出一条消息表示GCS桥被禁用。
相关问题
fcu_link->connect( [this](const mavlink_message_t *msg, const Framing framing) { mavlink_pub_cb(msg, framing); plugin_route_cb(msg, framing); if (gcs_link) { if (this->gcs_quiet_mode && msg->msgid != mavlink::minimal::msg::HEARTBEAT::MSG_ID &&(ros::Time::now() - this->last_message_received_from_gcs > this->conn_timeout)) { return; } gcs_link->send_message_ignore_drop(msg); } }, []() { ROS_ERROR("FCU connection closed, mavros will be terminated."); ros::requestShutdown(); });
这段代码看起来像是使用了一个名为 `fcu_link` 的对象进行连接操作。在连接时,使用了一个lambda表达式,其中使用了`mavlink_pub_cb`和`plugin_route_cb`函数对消息进行处理,并且如果存在`gcs_link`对象,会将消息发送给`gcs_link`。同时,该lambda表达式还包含了一个判断,如果`gcs_quiet_mode`被启用,且距离上次从GCS接收到消息已经超过了连接超时时间,就会直接返回不进行发送。当连接关闭时,会发出一个ROS_ERROR并请求关闭ROS节点。
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` 不会被赋值。
阅读全文