Linux 基础与开发环境搭建
说实话,我见过太多机器人项目的同学,代码写得挺溜,一碰到 Linux 环境就卡壳。尤其是刚接触 Ubuntu 的时候,连个文件权限都能折腾半天。这一章,咱们就把这些基础打扎实。
我个人习惯把 Linux 环境比作机器人的「操作系统骨架」。你想想看,ROS 跑在 Ubuntu 上,驱动、通信、编译全得靠它。底子不牢,后面联调时各种莫名其妙的问题就来了。
本章核心目标:从零搭建一个可用的 Ubuntu 开发环境,掌握日常开发必备的 Linux 命令、Vim 编辑技巧、Shell 脚本基础以及 SSH 远程连接。学完这一章,你就能在终端里「走路」了。
2.1 Ubuntu 系统安装:选对版本,少走弯路
Ubuntu 版本很多,我建议机器人开发直接用 Ubuntu 20.04 LTS。为什么?ROS 1 的 Noetic 版本官方支持的就是 20.04,ROS 2 的 Foxy 也是。我踩过坑,用 22.04 装 ROS 1,折腾了一整天依赖问题,最后老老实实换回 20.04。
安装方式主要有三种:
| 方式 | 适用场景 | 我的建议 |
|---|---|---|
| 物理机双系统 | 主力开发机,性能要求高 | 如果你只有一台电脑,这是首选 |
| 虚拟机(VMware/VirtualBox) | 学习、测试、不想影响主系统 | 适合初学者,随时可以快照回滚 |
| WSL2(Windows Subsystem for Linux) | Windows 用户,轻度开发 | 性能不错,但 GUI 和硬件直通有限制 |
我的小技巧:安装时分区别太复杂。给根目录 / 分 30-50GB,/home 分 20-30GB,再留个 swap 分区(大小等于内存即可)。别学网上那些花里胡哨的分区方案,简单够用就行。
2.2 Linux 常用命令:文件操作、权限管理、进程管理
命令这东西,不用刻意背。用得多了自然就记住了。我刚开始也记不住 chmod 的数字权限,后来发现一个规律:r=4, w=2, x=1,加起来就行。
2.2.1 文件操作命令
这些是每天都要敲的,必须形成肌肉记忆:
ls -la:列出所有文件(包括隐藏文件)和详细信息。我每次进一个新目录,第一件事就是敲这个。cd ~:回到用户主目录。别问为什么,问就是方便。cp -r source_dir/ target_dir/:递归复制目录。少写-r会报错,我犯过这毛病。mv file1 file2:移动或重命名。注意,如果目标已存在,会直接覆盖,没有提示。rm -rf dir/:删除目录。这个命令要小心,-rf下去,回收站都救不了你。
我曾经犯过的错:有一次在服务器上想删除一个临时目录,结果路径写错了,rm -rf / tmp/(注意那个空格),直接把根目录删了……嗯,从那以后我每次敲 rm -rf 之前都会先 ls 确认一遍路径。
2.2.2 权限管理
Linux 的权限模型其实很简单:用户、组、其他人,每个角色有 读、写、执行 三种权限。
举个例子:
# 查看文件权限
ls -l my_robot_script.sh
# 输出:-rwxr--r-- 1 alice robot_dev 1024 Mar 15 10:30 my_robot_script.sh
# 解释:
# -rwxr--r-- 表示:文件所有者有读写执行权限,组用户有读权限,其他人只有读权限
# 修改权限:给所有用户添加执行权限
chmod +x my_robot_script.sh
# 数字法:设置权限为 755(所有者全部,组和其他人读+执行)
chmod 755 my_robot_script.sh
数字法怎么算?rwx 对应 421,加起来就是权限值。比如 rwx = 4+2+1 = 7,r-x = 4+0+1 = 5。
2.2.3 进程管理
机器人开发中,经常要启动多个节点,进程管理是基本功:
ps aux:查看所有进程。我习惯用ps aux | grep ros来过滤 ROS 相关进程。top或htop:实时查看系统资源占用。如果机器人卡顿了,先看看 CPU 和内存。kill -9 PID:强制杀死进程。注意,-9是最后手段,正常应该先试试kill PID。nohup command &:让命令在后台运行,即使关闭终端也不会停。我经常用这个来跑长时间的数据采集。
避坑指南:用 kill -9 杀 ROS 节点时,有时候会留下共享内存没清理。下次启动就会报错。我建议先 rosnode kill 或者 Ctrl+C 正常退出,实在不行再用 -9。
2.3 Vim 编辑器:从入门到「够用」
Vim 的学习曲线确实陡,但一旦上手,效率极高。我刚开始用 Vim 时,连退出都不会,只能关终端。后来发现一个真理:Vim 不是用来写代码的,是用来快速编辑配置文件的。
你不需要成为 Vim 高手,掌握这几个模式就够了:
| 模式 | 进入方式 | 主要操作 |
|---|---|---|
| 普通模式 | 默认进入,或按 Esc |
移动光标、复制粘贴、删除 |
| 插入模式 | 按 i |
输入文本 |
| 可视模式 | 按 v |
选择文本块 |
| 命令行模式 | 按 : |
保存、退出、搜索、替换 |
常用的操作命令:
dd:删除当前行。我经常用5dd删除连续 5 行。yy:复制当前行。p粘贴。/keyword:搜索关键字。按n跳到下一个。:wq:保存并退出。:q!强制退出不保存。u:撤销。这个键救过我无数次。
我的个人习惯:在 ~/.vimrc 里加上这几行,能让 Vim 好用很多:
set number " 显示行号
set tabstop=4 " Tab 宽度为 4
set shiftwidth=4 " 缩进宽度为 4
set expandtab " 用空格代替 Tab
syntax on " 语法高亮
2.4 Shell 脚本基础:让重复工作自动化
机器人开发中,经常要启动多个终端、运行多个节点。手动敲命令太累了。写个 Shell 脚本,一键搞定。
一个简单的启动脚本示例:
#!/bin/bash
# 文件名:start_robot.sh
echo "正在启动机器人系统..."
# 设置 ROS 环境
source /opt/ros/noetic/setup.bash
source ~/catkin_ws/devel/setup.bash
# 启动 ROS Master
roscore &
sleep 2 # 等待 roscore 启动
# 启动机器人驱动节点
rosrun robot_base robot_driver_node &
# 启动激光雷达
rosrun rplidar_ros rplidar_node &
echo "所有节点已启动!"
wait
写脚本时要注意几点:
- 第一行
#!/bin/bash是 shebang,告诉系统用哪个解释器。 - 变量赋值等号两边不能有空格:
name="value",不是name = "value"。 - 用
$?获取上一条命令的退出状态,0 表示成功。 - 脚本写完后记得
chmod +x script.sh添加执行权限。
我曾经踩过的坑:在 Windows 下用记事本写 Shell 脚本,然后传到 Ubuntu 上运行,结果报错 ^M 字符问题。因为 Windows 换行符是 \r\n,Linux 是 \n。解决方案:用 dos2unix script.sh 转换一下。
2.5 SSH 远程连接:远程开发与调试
机器人通常部署在实体硬件上,你不可能每次都抱着显示器去连它。SSH 就是你的远程遥控器。
基本用法:
# 连接远程机器人
ssh username@192.168.1.100
# 指定端口(默认是 22)
ssh -p 2222 username@192.168.1.100
# 执行远程命令
ssh username@192.168.1.100 "ls -la /home/robot"
# 复制文件到远程
scp local_file.txt username@192.168.1.100:/home/robot/
# 从远程复制文件到本地
scp username@192.168.1.100:/home/robot/data.log ./
为了提高效率,我建议配置 SSH 密钥登录,省去每次输密码的麻烦:
# 在本地生成密钥对
ssh-keygen -t rsa -b 4096
# 将公钥复制到远程机器人
ssh-copy-id username@192.168.1.100
# 之后就可以直接 ssh 登录,不需要密码了
我的经验:在 ~/.ssh/config 里配置主机别名,可以省很多事:
Host myrobot
HostName 192.168.1.100
User robot
Port 22
IdentityFile ~/.ssh/id_rsa
配置完后,直接 ssh myrobot 就能连上,不用记 IP 和用户名。
2.6 本章知识体系总览
下面这张图把本章的核心知识点串起来了。你可以把它当作一个「地图」,学完后再回来看,应该会有更清晰的认识。
嗯,这一章的内容就到这里。记住,Linux 环境是机器人开发的基石,别急着跳过。把每个命令都敲一遍,把 Vim 的常用操作练熟,写几个 Shell 脚本试试。后面联调的时候,你会感谢现在认真打基础的自己。