# ROS 2 机外控制示例

警告

机外 控制是很危险的。如果您要在真实载具上进行操作,请务必想办法重新获得手动控制权,以防出现意外。

警告

ROS 2 与 PX4 的相互作用是通过 microRTPS 桥牌这就要求用户了解 PX4 的内部工作原理!通过 ROS 2 进行 PX4 机外控制也需要同样的理解,在 ROS 2 中,用户直接向所需的 uORB 主题发布信息(ROS 和 PX4 数据格式/约定之间没有任何抽象层)。

如果您不确定 PX4 的内部工作原理,我们建议您使用依赖于 MAVLink 微服务和抽象层的工作流来执行机外控制或任何其他类型的交互。 microRTPS

下面的 C++ 示例展示了如何使用 microRTPS 桥和 px4_ros_com 软件包,从 ROS 2 节点进行机外位置控制。

# 要求

本示例使用的是 PX4 SITL,因此首先假定用户已正确配置了仿真环境。除此之外

  1. 用户已经正确配置了 ROS 2 环境 检查 PX4-ROS 2 桥接器 有关如何操作的详细信息,请参阅文件。

  2. px4_msgspx4_ros_com 应该已经在您的 colcon 工作区中了 来源 目录。详见上一点中的链接。

  3. 车外控制模式轨迹设置点 信息配置在 urtps_bridge_topics.yaml 文件都在 PX4-Autopilot 和 px4_ros_com 软件包将 收到 在自动驾驶仪中。

    PX4-Autopilot/msg/tools/urtps_bridge_topics.yaml:

    - 信息:     车外控制模式
      接收: 
    ...
    - 信息:     载具命令
      接收: 
    ...
    - 信息:     载具本地设定点
      接收: 
    - 信息:     轨迹设置点 # 多主题 / 载具本地位置设置点的别名
      基础:    载具本地设定点
      接收: 
    

    path_too_colcon_ws/src/px4_ros_com/templates/urtps_bridge_topics.yaml:

    - 信息:     机外控制模式
      接收: 
    ...
    - 信息:     载具指令
      接收: 
    ...
    - 信息:     载具本地位置设定点
      接收: 
    - 信息:     轨迹设置点
      基础:    载具本地位置设定点
      接收: 
    
  4. 载具命令 信息配置在 urtps_bridge_topics.yaml 文件都在 PX4-Autopilot 和 px4_ros_com 软件包到 发送 到自动驾驶仪。

    PX4-Autopilot/msg/tools/urtps_bridge_topics.yaml:

    - 信息:     载具命令
      接收: 
    

    path_too_colcon_ws/src/px4_ros_com/templates/uorb_rtps_message_ids.yaml:

    - 信息:     载具指令
      接收: 
    

备注

在撰写本文时,上述主题已配置为发送。

# 实施情况

机外控制示例的源代码可在以下网站找到 offboard_control.cpp (打开新窗口).

下面是一些实施细节:

timesync_sub_ = ->;创建订阅<;px4_msgs::信息::时间同步>;("/fmu/timesync/out";,
    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 条设定点信息,然后才发送命令,允许 PX4 切换到离板模式。同时,两个 车外控制模式轨迹设置点 信息发送至飞行控制器。

/** * @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 坐标系发布。如果用户想要订阅来自以不同框架(例如 ENU,ROS/ROS 2 的标准参照框架)发布数据的节点的数据,可以使用 帧变换 (打开新窗口) 图书馆

/** * @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 (制作 PX4_SITL_RTPS 仿真场景Gazebo会在 UDP 端口 2019 和 2020 上自动启动 microRTPS 客户端)和 microRTPS 代理 (micrortps_agent -t UDP启动连接到 UDP 端口 2020 和 2019 的代理):

$ 消息来源 path_too_colcon_workspace/install/setup.bash $ ros2 run px4_ros_com offboard_control

# 使用 PX4 SITL 和仿真场景Gazebo进行演示