1. 基于ROS 2的Jetson平台基础环境搭建与验证
任务目标
在Jetson设备(本文以JetPack 5.x / Ubuntu 20.04为例)上完成ROS 2 Foxy的安装与基础依赖配置,并通过一个自定义的发布-订阅节点对验证环境可用性。验证标准:两个终端分别运行发布节点与订阅节点后,订阅终端能持续打印发布节点发送的递增计数消息。
环境与依赖
- 硬件:Jetson Xavier NX / AGX Xavier / Orin(本文适用于JetPack 5.0及以上)
- 系统:Ubuntu 20.04(JetPack自带)
- ROS 2发行版:Foxy Fitzroy(arm64)
- Python:3.8(系统默认)
安装ROS 2 Foxy
在Jetson终端依次执行以下命令(全程需要网络连接):
# 1. 设置编码与软件源
sudo apt update && sudo apt install -y locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
# 2. 添加ROS 2 apt源
sudo apt install -y curl gnupg2 lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
# 3. 安装ROS 2 Foxy桌面版(含rqt等工具)
sudo apt update
sudo apt install -y ros-foxy-desktop python3-argcomplete
# 4. 配置环境变量
echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc
source ~/.bashrc
安装完成后,可用 ros2 --help 验证命令行工具是否可用。
创建工作区与功能包
# 创建ROS 2工作区
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
# 创建Python功能包(使用ros2 pkg命令)
ros2 pkg create --build-type ament_python py_pubsub
cd py_pubsub
发布-订阅节点实现
在 py_pubsub/py_pubsub/ 目录下创建两个Python文件。先创建发布节点 publisher.py:
import rclpy
from rclpy.node import Node
from std_msgs.msg import Int32
class MinimalPublisher(Node):
def __init__(self):
super().__init__('minimal_publisher')
self.publisher_ = self.create_publisher(Int32, 'counter', 10)
self.timer = self.create_timer(0.5, self.timer_callback)
self.count = 0
def timer_callback(self):
msg = Int32()
msg.data = self.count
self.publisher_.publish(msg)
self.get_logger().info('发布: %d' % msg.data)
self.count += 1
def main(args=None):
rclpy.init(args=args)
node = MinimalPublisher()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
再创建订阅节点 subscriber.py:
import rclpy
from rclpy.node import Node
from std_msgs.msg import Int32
class MinimalSubscriber(Node):
def __init__(self):
super().__init__('minimal_subscriber')
self.subscription = self.create_subscription(
Int32, 'counter', self.listener_callback, 10)
def listener_callback(self, msg):
self.get_logger().info('收到: %d' % msg.data)
def main(args=None):
rclpy.init(args=args)
node = MinimalSubscriber()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
配置功能包入口
编辑 setup.py,在 entry_points 部分添加控制台脚本入口:
entry_points={
'console_scripts': [
'publisher = py_pubsub.publisher:main',
'subscriber = py_pubsub.subscriber:main',
],
},
编译与运行验证
# 编译工作区
cd ~/ros2_ws
colcon build --packages-select py_pubsub
source install/setup.bash
# 终端1:运行发布节点
ros2 run py_pubsub publisher
# 终端2:运行订阅节点(需先source环境)
source ~/ros2_ws/install/setup.bash
ros2 run py_pubsub subscriber
验证通过条件:订阅终端每0.5秒打印一条 收到: N 消息,且N从0开始递增;发布终端同步打印 发布: N。若两个终端均无报错且计数持续递增,则说明ROS 2环境搭建成功,发布-订阅通信正常。
常见问题排查
- colcon未找到:执行
sudo apt install -y python3-colcon-common-extensions - import rclpy失败:确认已执行
source /opt/ros/foxy/setup.bash,且当前终端已加载环境 - 节点无法发现彼此:确认两端均source了
install/setup.bash,且处于同一ROS_DOMAIN_ID(默认0即可)