Pxhawk-Jeston-Board使用教程及ROS2通信
发表于:2026-05-28 | 分类: Linux ROS

硬件连接

Pixhawk 和 Jetson 板块必须分别通过各自的电源端口供电。套件附带的电源模块支持 2S-12S 电池输入,并为 Pixhawk 部分提供稳定供电。其另一个输出通常连接到(供电的)配电板,从那里为电机、伺服等提供电力,同时也为 Jetson( 直接或通过 UBEC)供电。

Jetson 部件可用 7V-21V 输入供电,对应 3S 或 4S 电池。如果使用电压高于 Jetson 允许的电池,你可以选择用 UBEC 提供较低的稳定电源,或者用独立电池供电。

Tip

官网还提供了很多方案
https://docs.px4.io/main/en/companion_computer/holybro_pixhawk_jetson_baseboard#hardware-setup
image-20260528200656999

Jeston烧录

烧录Ubuntu22.04系统

https://docs.px4.io/main/en/companion_computer/holybro_pixhawk_jetson_baseboard#flashing-the-jetson-board

Title

注意进入Recovery模式

image.png

Jetson SSH连接

https://docs.px4.io/main/en/companion_computer/holybro_pixhawk_jetson_baseboard#jetson-network-ssh-login

用wifi连接局域网

1
ip addr show

image.png

Tip

  • eth0 = enP8p1s0(同一个有线网口)
  • wlan0 = wlP1p1s0(同一个 WiFi)

然后使用MobaXterm等SSH工具连接wlP1p1s0的inet 192.168.31.7地址即可

Jeston初始化配置

1
2
sudo apt update
sudo apt install build-essential cmake git genromfs kconfig-frontends libncurses5-dev flex bison libssl-dev

在 Jetson 上组装 PX4(方案一)

1
2
3
4
5
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
bash ./PX4-Autopilot/Tools/setup/ubuntu.sh --no-sim-tools
sudo usermod -a -G dialout $USER
sudo apt-get remove modemmanager -y
make px4_fmu-v6x_default

容易遇到FLASH编译错误不推荐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
● FLASH 溢出错误

链接器报告 .data 段无法放入 FLASH 区域,原因是编译后的代码总大小超过了 FLASH 物理限制:

/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld:
px4_fmu-v6x_default.elf section `.data' will not fit in region `FLASH'
region `FLASH' overflowed by 2928 bytes

具体分析:

- FLASH 区域从 0x08020000 开始,容量为 1920 KB( linker script 中定义)
- 编译后总计使用 1969008 B ≈ 1923.4 KB,超出 2928 字节
- .data 段被放置在 FLASH(但运行时加载到 AXI_SRAM),链接器要求整个 .data 必须在 FLASH 可寻址范围内

根本原因:default.px4board 启用了太多模块(92 个 =y 配置),加上每个模块编译出的代码/数据累积起来超过了 1920 KB 的分区限制。这是功能配置过多导致的容量问题,而非代码 bug。

解决方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
● 我来修改 linker script 增加 FLASH 分区大小。先确认一下当前配置:

Read 1 file (ctrl+o to expand)

● 修改 linker script 将 FLASH 从 1920K 增加到 1984K(溢出约 3KB,简单增加 64KB 即可):

● Update(~/PX4-Autopilot/boards/px4/fmu-v6x/nuttx-config/scripts/script.ld)
⎿ Added 1 line, removed 1 line
110 MEMORY
111 {
112 ITCM_RAM (rwx) : ORIGIN = 0x00000000, LENGTH = 64K
113 - FLASH (rx) : ORIGIN = 0x08020000, LENGTH = 1920K
113 + FLASH (rx) : ORIGIN = 0x08020000, LENGTH = 1984K
114
115 DTCM1_RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
116 DTCM2_RAM (rwx) : ORIGIN = 0x20010000, LENGTH = 64K

组装成功,你可以像下面所示将 Pixhawk 的 USB-C 端口连接到 Jetson USB 端口
image.png

然后通过构建上传参数的固件上传到 Pixhawk

1
make px4_fmu-v6x_default upload

从开发电脑部署(方案二【推荐】)

1
2
3
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
make px4_fmu-v6x_default
  • 你也可以用 px4-dev 的 Docker 容器构建,而不用本地安装工具链。摘自 PX4-Autopilot 目录:./Tools/docker_run.sh ‘make px4_fmu-v6x_default’

3e8c96b6032b8e5a821680133ef00b74.png

固件烧录到飞控板,USB-C连接飞控板,USB-A连接开发电脑

1
make px4_fmu-v6x_default upload

df3b1b90291cea24df085454815ab482.png

QGroundControl烧录预构建的二进制文件(方案三)

https://docs.px4.io/main/zh/config/firmware

PX以太网配置

https://docs.px4.io/main/zh/advanced_config/ethernet_setup#px4-mavlink-serial-port-configuration

  1. 将飞行控制器通过USB线连接到计算机。
  2. Open QGroundcontrol > Analyze Tools > MAVLink Console
  3. MAVLink 控制台中输入命令(将值写入配置文件):
1
2
3
4
5
6
echo DEVICE=eth0 > /fs/microsd/net.cfg
echo BOOTPROTO=fallback >> /fs/microsd/net.cfg
echo IPADDR=10.41.10.2 >> /fs/microsd/net.cfg
echo NETMASK=255.255.255.0 >>/fs/microsd/net.cfg
echo ROUTER=10.41.10.254 >>/fs/microsd/net.cfg
echo DNS=10.41.10.254 >>/fs/microsd/net.cfg
  1. 一旦设置了网络配置,您可以断开 USB 电缆。
  2. 重启飞行控制器以应用设置。

使用 Netplan 进行以太网设置

Holybro Jetson Pixhawk 运营商在 Pixhawk 和 Jetson 之间设有内部网络交换机,可用于 MAVLink 或 ROS 2 通信(或其他任何协议)。虽然不需要连接任何外部线缆,但你仍然需要配置以太网连接,使 Jetson 和 PX4 都在同一子网。

PX4 的默认 IP 地址是 10.41.10.2(PX4 v1.15 及更早版本使用 192.168.0.3),而 Jetson 通常配置为不同子网的默认 IP 地址。为了让这些板子能够通信,它们必须在同一子网。

安装netplan

1
2
sudo apt update
sudo apt install netplan.io

检查 system_networkd 正在运行:

1
2
3
4
5
6
7
sudo systemctl status systemd-networkd
> sudo systemctl status systemd-networkd
○ systemd-networkd.service - Network Configuration
Loaded: loaded (/lib/systemd/system/systemd-networkd.service; disabled; vendor preset: enabled)
Active: inactive (dead)
TriggeredBy: ○ systemd-networkd.socket
Docs: man:systemd-networkd.service(8)

如果出现上述情况,说明未运行,执行下列命令

1
2
sudo systemctl start systemd-networkd
sudo systemctl enable systemd-networkd

img

打开 Netplan 配置文件(这样我们就能为 Jetson 设置静态 IP)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo nano /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
enP8p1s0:
dhcp4: no
addresses:
- 10.41.10.1/24
routes:
- to: 0.0.0.0/0
via: 10.41.10.254
nameservers:
addresses:
- 10.41.10.254

这使得 Jetson 在以太网接口上获得了 10.41.10.1 的静态 IP 地址

使用以下命令应用这些更改:

1
sudo netplan apply

Pixhawk 以太网地址默认设置为 10.41.10.2,属于同一子网。我们可以在上面测试更改,方法是从 Jetson 终端内 pingPixhawk:

1
ping 10.41.10.2

如果成功,你会看到下面的输出,若未成功则查看上一步PX以太网配置
image.png

Jetson 和 Pixhawk 现在可以通过以太网通信。

注意

  • ROS 1 + PX4:必须 MAVLink(MAVROS)PX4
  • ROS 2 + PX4:优先 uXRCE‑DDS(不用 MAVLink)

MAVLink 是一种用于 Jetson 和 PX4 之间通信的协议。PX4 用户通常使用 MAVSDK 来管理 MAVLink 通信,因为它提供了 MAVLink 协议的简单跨平台和跨编程语言抽象。

内部串口和以太网链路默认配置为使用 MAVLink

https://docs.px4.io/main/en/companion_computer/holybro_pixhawk_jetson_baseboard#mavlink-setup

ROS2设置

为了使用 ROS 2,我们首先需要在 PX4 上运行 XRCE-DDS 中间件客户端,在 Jetson 上运行代理。指令取决于所使用的通信信道(以太网或串口)。

PX4 XRCE-DDS 客户端设置

uXRCE-DDS 客户端默认内置于 PX4 固件中,并通过 XRCE-Agent 向 ROS 2 运行的 DDS 网络暴露预定义的 uORB 主题集。这些暴露的主题集合在构建配置文件中定义

客户端用于与代理通信的信道是通过参数配置的。你可以使用内部串口连接或内部以太网交换机

XRCE-客户端串口设置

Pixhawk TELEM2 与 Jetson THS1 之间存在一条内部串行链路,默认配置为通过 MAVLink 通信。您需要禁用 MAVLink 实例并启用 UXRCE_DDS 配置

在 QGroundControl 参数编辑器中修改参数,或者在 MAVLink shell中使用参数集

Title

有多种方式可以访问 MAVLink 外壳。最简单的方法是通过 Pixhawk USB-C 连接到开发电脑,并使用 QGroundControl MAVLink 控制台

在 MAVLink shell 中输入命令:

1
2
param set MAV_1_CONFIG 0  # Disable MAVLINK on TELEM2 (so it can be used for XRCE-DDS)
param set UXRCE_DDS_CFG 102 # Set UXRCE_DDS_CFG to TELEM2

image.png

XRCE-客户端以太网设置

Jetson 和 Pixhawk 之间有一个内部以太网交换机连接。我们配置了两块板使用上述相同的子网。不过我们需要禁用 PX4 以太网端口的 MAVLink 并启用 XRCE-DDS

输入以下命令以更改 MAVLink 壳中的值:

1
2
3
4
param set MAV_2_CONFIG 0  # Disable MAVLINK on Ethernet (so Ethernet can be used for XRCE-DDS)
param set UXRCE_DDS_CFG 1000 # Ethernet
param set UXRCE_DDS_PRT 8888 # Set port to 8888 (default)
param set UXRCE_DDS_AG_IP 170461697 # The int32 version of 10.41.10.1

image.png

UXRCE_DDS_AG_IP 参数将 Jetson 地址设置为 170461697。请注意,这是 10.41.10.1 的 INT32 格式版本(有关如何转换版本的信息,请参见 “启动 uXRCE-DDS 客户端 ”)。

重新启动

检查 XRCE-DDS 客户端是否运行

在 MAVLink shell 中用以下命令检查客户端是否在运行:

1
uxrce_dds_client status

输出

1
2
3
4
5
6
7
8
9
INFO  [uxrce_dds_client] Running, disconnected  
INFO [uxrce_dds_client] Using transport: udp
INFO [uxrce_dds_client] Agent IP: 10.41.10.1
INFO [uxrce_dds_client] Agent port: 8888
INFO [uxrce_dds_client] Custom participant: no
INFO [uxrce_dds_client] Localhost only: no
INFO [uxrce_dds_client] timesync converged: false
uxrce_dds_client: cycle: 0 events, 0us elapsed, 0.00us avg, min 0us max 0us 0.000us rms
uxrce_dds_client: cycle interval: 0 events, 0.00us avg, min 0us max 0us 0.000us rms

另外,检查客户端启动时是否已启动的另一种方法是从 MAVLINK shell 获取 dmesg 输出。下面作为 dmesg 日志的一部分的输出会提到 baudrate 和客户端运行的实例(/dev/tty/S4 等于 Holybro Pixhawk 6X 和 6X Pro 的 TELEM2)。

1
dmesg

之前参考的是串口模式的日志(/dev/ttyS4),但你现在配置的是以太网 UDP 模式,所以日志里是 init UDP agent,不是 init serial。完全正常

通过串口连接会显示以下信息

1
2
Starting UXRCE-DDS Client on /dev/ttyS4
INFO [uxrce_dds_client] init serial /dev/ttyS4 @ 921600 baud

image.png

XRCE-DDS 代理与 ROS 2 设置

在Jeston安装ROS2

安装XRCE-DDS

安装px4_msg\ px4_ros_com

https://docs.px4.io/main/en/ros2/user_guide#setup-the-agent

启动 XRCE-DDS 代理

根据客户端是为串行还是以太网连接配置,你会用不同的命令启动代理。假设客户端按照上述定义设置:

(串口连接)在 /dev/ttyTHS1 启动代理:

1
sudo MicroXRCEAgent serial --dev /dev/ttyTHS1 -b 921600

(以太网)在 UDP 端口 8888 上启动代理

1
MicroXRCEAgent udp4 -p 8888

image.png

启动代理

每次 Jetson 重启时运行 XRCE-DDS 代理,可以创建一个守护进程服务来运行该代理。

创建一个新的服务文件:

1
sudo nano /etc/systemd/system/microxrceagent.service

把以下内容粘贴进去:

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Micro XRCE Agent Service After=network.target
[Service]
14
Holybro carrier board
ExecStart=/usr/local/bin/MicroXRCEAgent udp4 -p 8888 Restart=always
User=root
Group=root
ExecStartPre=/bin/sleep 10
[Install]
WantedBy=multi-user.target

保存文件,然后在终端内运行以下操作

1
2
sudo systemctl daemon-reload
sudo systemctl enable microxrceagent.service

然后你可以重启你的 Jetson 主板,检查代理是否在后台运行:

1
2
sudo reboot
sudo systemctl status microxrceagent.service

如果服务正在运行,你应该会看到这样的输出:

image.png

下图表示连接成功
ee5b26eced1cc0c70586e9b5b8e05f59.png

ROS 2 传感器联合测试

可以通过上述安装的 sensor_combined 示例来测试客户端和代理。

1
ros2 launch px4_ros_com sensor_combined_listener.launch.py

没有连接是输出

1
2
3
4
5
6
[INFO] [launch]: All log files can be found below /home/nano/.ros/log/2026-05-28-18-55-25-451087-ubuntu-2280
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [sensor_combined_listener-1]: process started with pid [2281]
[sensor_combined_listener-1] Starting sensor_combined listener node...
^C[WARNING] [launch]: user interrupted with ctrl-c (SIGINT)
[sensor_combined_listener-1] [INFO] [1779965734.130247648] [rclcpp]: signal_handler(SIGINT/SIGTERM)

连接成功则输出

1
2
3
4
5
6
7
8
9
10
11
12
[sensor_combined_listener-1] RECEIVED SENSOR COMBINED DATA
[sensor_combined_listener-1] =============================
[sensor_combined_listener-1] ts: 1779966228178157
[sensor_combined_listener-1] gyro_rad[0]: -0.000177536
[sensor_combined_listener-1] gyro_rad[1]: -0.00738859
[sensor_combined_listener-1] gyro_rad[2]: -0.00196258
[sensor_combined_listener-1] gyro_integral_dt: 5001
[sensor_combined_listener-1] accelerometer_timestamp_relative: 0
[sensor_combined_listener-1] accelerometer_m_s2[0]: 0.916456
[sensor_combined_listener-1] accelerometer_m_s2[1]: 0.482732
[sensor_combined_listener-1] accelerometer_m_s2[2]: -9.83877
[sensor_combined_listener-1] accelerometer_integral_dt: 5001
下一篇:
Jeston-Orin-Nano烧录Ubuntu22.04系统