# ROS 2 机外控制示例
警告
机外 控制是很危险的。如果您要在真实载具上进行操作,请务必想办法重新获得手动控制权,以防出现意外。
警告
ROS 2 与 PX4 的相互作用是通过 microRTPS 桥牌 这就要求用户了解 PX4 的内部工作原理!通过 ROS 2 进行 PX4 机外控制也需要同样的理解,在 ROS 2 中,用户直接向所需的 uORB 主题发布信息(ROS 和 PX4 数据格式/约定之间没有任何抽象层)。
如果您不确定 PX4 的内部工作原理,我们建议您使用依赖于 MAVLink 微服务和抽象层的工作流来执行机外控制或任何其他类型的交互。 microRTPS 桥
下面的 C++ 示例展示了如何使用 microRTPS 从 ROS 2 节点进行机外位置控制的桥接器。
# 要求
本示例使用的是 PX4 SITL,因此首先假定用户已正确配置了仿真环境。除此之外
用户已经正确配置了 ROS 2 环境 检查 PX4-ROS 2 桥接器 有关如何操作的详细信息,请参阅文件。
px4_msgs
和px4_ros_com
应该已经存在于您的 colcon 工作区中。详情请参见上一点中的链接。车外控制模式
和轨迹设置点
信息配置在uorb_rtps_message_ids.yaml
文件都在 PX4-Autopilot 和 px4_ros_com 软件包将 收到 在自动驾驶仪中。在 PX4-Autopilot/msg/tools/uorb_rtps_message_ids.yaml:
- 信息: 车外控制模式 本我: 44 接收: 真 ... - 信息: 轨迹设置点 本我: 186 别称: 载具本地设定点 接收: 真
在 path_too_colcon_ws/src/px4_ros_com/templates/uorb_rtps_message_ids.yaml:
- 本我: 44 信息: 机外控制模式 接收: 真 ... - 别称: 载具本地位置设定点 本我: 186 信息: 轨迹设置点 接收: 真
备注
在撰写本报告时,上述主题已配置为接收。
# 实施情况
机外控制示例的源代码可在以下网站找到 offboard_control.cpp (打开新窗口).
下面是一些实施细节:
timesync_sub_ = 此->;创建订阅<;px4_msgs::信息::时间同步>;("Timesync_PubSubTopic";,
10,
[此](缢 px4_msgs::信息::时间同步::UniquePtr msg) {
timestamp_.店铺(信息->;时戳);
});
要获得同步时间戳,就必须进行上述操作。 车外控制模式
和 轨迹设置点
留言
汽车 定时器回调 = [此]() ->; 空白 {
如果 (离板设定点计数器 == 10) {
// 10 个设定点后改为离板模式
此->;发布载具命令(载具指令::vehicle_cmd_doo_set_mode, 1, 6);
// 解除载具上膛
此->;上膛();
}
// offboard_control_mode 需要与 trajectory_setpoint 配对
发布控制模式();
发布轨迹设置点();
// 计数器运行到 11 时停止
如果 (离板设定点计数器 <; 11) {
离板设定点计数器++;
}
};
定时器 = 此->;创建隔离墙计时器(100毫秒, 定时器回调);
}
以上是 ROS 2 节点上的主循环。它首先发送 10 条设定点信息,然后才发送命令切换到离板模式。 车外控制模式
和 轨迹设置点
信息发送至飞行控制器。
/** * @brief 发布机外控制模式。* 在本例中,只有位置和高度控制处于激活状态。*/
空白 机外控制::发布控制模式() 缢 {
离机控制模式 msg{};
信息.时戳 = timestamp_.负荷();
信息.位置 = 真;
信息.速度 = 错误;
信息.加速度 = 错误;
信息.态度 = 错误;
信息.身体速率 = 错误;
船外控制模式发布者->;发布(信息);
}
/** * @brief 发布轨迹设定点 * 在本例中,它发送了一个轨迹设定点,使 * 载具悬停在 5 米处,偏航角为 180 度。*/
空白 机外控制::发布轨迹设置点() 缢 {
轨迹设置点 msg{};
信息.时戳 = timestamp_.负荷();
信息.x = 0.0;
信息.y = 0.0;
信息.z = -5.0;
信息.打呵欠 = -3.14; // [-PI:PI]
轨迹设定点发布者->;发布(信息);
}
上述函数举例说明了如何在两个 车外控制模式
和 轨迹设置点
信息。请注意,上述示例适用于机外位置控制,在机上的 车外控制模式
信息 位置
字段设置为 真
,而所有其他参数设置为 错误
.另外,在这种情况下 x
, y
, z
和 打呵欠
字段被硬编码为特定值,但它们可以根据算法动态更新,甚至可以通过订阅回调对来自其他节点的消息进行更新。
TIP
为了简单起见,位置已经在 NED 坐标系中发布,但如果用户想要订阅来自其他节点的数据,而且 ROS/ROS 2 的标准参照系是 ENU,那么用户可以使用以下辅助功能 帧变换
图书馆 (打开新窗口).
/** * @brief 发布载具命令 * @param command 命令代码(与 VehicleCommand 和 MAVLink MAV_CMD 代码匹配) * @param param1 命令参数 1 * @param param2 命令参数 2 */
空白 机外控制::发布载具命令(uint16_t 指挥部, 浮动 参数1,
浮动 参数2) 缢 {
载具指令 msg{};
信息.时戳 = timestamp_.负荷();
信息.参数1 = 参数1;
信息.参数2 = 参数2;
信息.指挥部 = 指挥部;
信息.目标系统 = 1;
信息.目标组件 = 1;
信息.源系统 = 1;
信息.源组件 = 1;
信息.来自外部 = 真;
载具命令发布者->;发布(信息);
}
如描述所示,上述代码的作用是发送 载具命令发布者
信息,并向飞行控制器发出指令。
备注
在撰写本报告时 载具命令发布者
也已配置为接收。
# 使用方法
建立 colcon 工作区后,启动 PX4 SITL 以及 microRTPS 桥接客户端和代理:
$ 消息来源 path_too_colcon_workspace/install/setup.bash $ ros2 run px4_ros_com offboard_control