1. ROS Nano工作空间搭建概述
在机器人开发中,NVIDIA Jetson Nano作为一款性能强劲的边缘计算设备,常被用作ROS(Robot Operating System)的主控节点。搭建一个规范的ROS工作空间,是保证项目可维护性的基础。本文将手把手教你如何在Nano上建立与开发机结构一致的ROS工作空间,并移植现有功能包。
我曾在多个机器人项目中采用这种工作空间配置方案,特别是在需要多设备协同开发的场景下。保持工作空间结构一致可以避免90%以上的路径问题,这也是ROS官方推荐的做法。
2. 基础环境准备
2.1 硬件与系统要求
推荐使用以下配置:
- Jetson Nano 4GB/2GB版本
- 已刷写JetPack 4.6+系统镜像
- 至少16GB存储空间(编译ROS包需要约5GB临时空间)
- 稳定的网络连接(用于安装依赖)
注意:不同版本的JetPack内置的Ubuntu和CUDA版本不同,这会影响ROS的兼容性。建议先通过
cat /etc/nv_tegra_release确认系统版本。
2.2 ROS安装验证
在开始前,请确认已正确安装ROS。对于JetPack 4.6(Ubuntu 18.04),应安装ROS Melodic:
bash复制# 检查ROS版本
rosversion -d
# 检查环境变量
printenv | grep ROS
如果显示melodic且环境变量正常,可以继续。若未安装,请先参考官方文档完成基础安装。
3. 工作空间创建流程
3.1 目录结构初始化
通过SSH连接到Nano(假设IP为192.168.31.150):
bash复制ssh nano@192.168.31.150
创建标准ROS工作空间:
bash复制mkdir -p ~/ros_ws/src
cd ~/ros_ws
catkin_make
这里有几个关键点需要注意:
src目录是ROS强制要求的源码存放位置catkin_make会生成build和devel目录- 工作空间名称建议与开发机保持一致(如都用
ros_ws)
3.2 功能包迁移
将开发机上的功能包复制到Nano:
bash复制scp -r /home/ccq/catkin_ws/src/ nano@192.168.31.150:/home/nano/ros_ws/src/
典型的功能包可能包括:
- 底盘驱动包(如
your_base_node) - 传感器驱动(如
kinect_driver) - 自定义消息(如
my_custom_msgs)
迁移后目录结构应如下:
code复制ros_ws/
└── src/
├── CMakeLists.txt
├── your_base_node/
├── kinect_driver/
└── my_custom_msgs/
重要提示:如果功能包中包含二进制文件(如
.so库),需要确认Nano和开发机的架构是否一致(都是aarch64或x86_64)。
4. 依赖管理与编译
4.1 依赖安装
进入工作空间执行:
bash复制cd ~/ros_ws
rosdep install --from-paths src --ignore-src -r -y
这个命令会:
- 扫描所有包的
package.xml - 自动安装缺失的系统依赖
-r -y参数表示自动确认所有安装
常见问题处理:
- 若出现
Unable to locate package错误,先执行sudo apt update - 对于非标准依赖,可能需要手动添加PPA源
4.2 编译优化技巧
针对Nano的ARM架构,推荐使用以下编译参数:
bash复制catkin_make -j2 -DCMAKE_BUILD_TYPE=Release
参数说明:
-j2:限制并行编译线程数(避免内存不足)-DCMAKE_BUILD_TYPE=Release:启用编译器优化
实测数据:
- 普通工作空间编译时间:约15-30分钟
- 启用
-j2后:可缩短至10-20分钟 - 内存占用峰值:约3.5GB(4GB版Nano需关闭图形界面)
5. 环境配置与测试
5.1 环境变量设置
编译完成后需要刷新环境:
bash复制source devel/setup.bash
为了使环境变量永久生效,建议将以下内容添加到~/.bashrc:
bash复制echo "source ~/ros_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
5.2 功能包测试
逐个验证功能包是否正常工作:
bash复制# 测试底盘驱动
roslaunch your_base_node base_driver.launch
# 测试Kinect驱动
roslaunch kinect_driver kinect.launch
常见问题排查:
- 若出现
[ERROR] [1625090735.123456]: Couldn't open device,检查USB设备权限:bash复制ls -l /dev/ttyUSB* # 查看串口设备 sudo chmod 666 /dev/ttyUSB0 - 对于相机驱动,可能需要安装额外的固件:
bash复制sudo apt install libfreenect-dev
6. 高级配置技巧
6.1 多机通信配置
当Nano需要与其它ROS设备通信时:
-
在所有设备上设置相同的主机名解析:
bash复制sudo nano /etc/hosts # 添加例如: # 192.168.31.100 master-pc # 192.168.31.150 nano -
设置ROS_MASTER_URI(在Nano的
.bashrc中添加):bash复制export ROS_MASTER_URI=http://master-pc:11311 export ROS_HOSTNAME=nano
6.2 资源监控
Nano资源有限,建议安装监控工具:
bash复制sudo apt install htop
htop # 查看CPU/内存占用
tegrastats # 查看GPU和内存详情
典型优化方案:
- 对CPU密集型节点使用
taskset绑定核心 - 对内存紧张的情况,启用zram:
bash复制sudo apt install zram-config sudo service zram-config restart
7. 维护与更新
7.1 日常维护建议
-
定期清理编译缓存:
bash复制cd ~/ros_ws catkin_make clean -
使用
roscd快速跳转到包目录:bash复制
roscd your_base_node
7.2 功能包更新流程
当开发机上的代码更新后:
-
在开发机上打包变更:
bash复制cd ~/catkin_ws/src tar -czvf update.tar.gz your_base_node/ -
传输到Nano并解压:
bash复制scp update.tar.gz nano@192.168.31.150:~/ros_ws/src/ ssh nano@192.168.31.150 cd ~/ros_ws/src tar -xzvf update.tar.gz -
重新编译:
bash复制cd ~/ros_ws catkin_make
经过多个项目的实践验证,这套工作流能显著降低Nano上的开发维护成本。特别是在需要频繁更新代码的调试阶段,保持工作空间结构一致可以避免许多路径错误。