ROS学习笔记1:在树莓派3上部署ROS

学了好久,然后依然很混乱,于是决定整理一下笔记

安装 Raspbian jessie

安装 Raspbian 非常简单,只需要三步:

  • 下载镜像
  • 写入TF卡(MicroSD)
  • 开启SSH

下载镜像

首先打开树莓派官网,点击 DOWNLOADS,然后选择 RASPBIAN,来到Raspbian下载页面,下载 RASPBIAN JESSIE WITH PIXEL 的种子。通过种子来下载会快一些,而且下载后不需要校验。

下载种子

写入TF卡

官方推荐使用Etcher来写入,试用了一下,简单快捷,不过有的情况会出错,没有查出来原因。

  • 下载 Etcher 并安装。
  • 把TF卡插入读卡器并连接电脑。
  • 打开 Etcher ,从硬盘上选择刚才下载的镜像。
  • 选择你要写入的TF卡。
  • 检查确认你的选项,并点击“Flash!”开始写入。

写入时系统可能会提示驱动器未格式化,千万不要格式化
写入完成后,可以看到TF卡有两个分区(驱动器):一个是启动分区,可以打开;另一个是系统分区,Windows不能识别,显示未格式化。

开启SSH

单独为树莓派3准备一套键鼠和显示器是很奢侈的事情,所以开启SSH就变成了通常做法。
打开启动分区,在里面新建一个文件夹,命名为 SSH 。

~回顾一下

上面大部分内容其实都是在解释说明,要做的其实很少,只有以下3步:

  1. 去官网下载镜像
  2. 安装Etcher,并把镜像写入TF卡
  3. 在启动分区新建一个名为 SSH 的文件夹

配置 Raspbian

配置时需要说明的更多一些,但其实要做的东西也很少,熟悉之后几分钟就能搞定。
在这部分需要做的事情是:

  • 将树莓派接入网络
  • 设置SSH
  • 更改Host和密码
  • 设置语言与时区
  • 调整分辨率并开启VNCServer
  • 配置FTP

将树莓派接入网络

注意,在这部分,你最好使用路由器来建立局域网。
一开始如果能用键鼠和显示器,就能很轻松的连接上无线网络。如果没有,也可以先通过网线将树莓派连接入局域网(需要有DHCP分配IP地址,所以校园网不行)。
接好网线后,装上刚才制作好的TF卡,然后连接电源。大约20秒后,就可以通过SSH访问树莓派了。
Windows下常用的SSH软件是PuTTY,但是这个官网是“不存在的”,所以从这里下载。绿色软件,解压即可使用。
运行putty.exe,填入主机名称 raspberrypi,点击 open 按钮,即可开启链接。

PuTTY的界面

首次连接会提示Host key未知(或不一致),因为是自己的树莓派,添加即可。

Paste_Image.png

提示 login as: 时,输入用户名 pi
提示 pi@raspberrypi's password: 时,输入密码,默认是raspberry

Paste_Image.png

登录成功是这样的:

Paste_Image.png

这时,树莓派的命令行界面(终端)就显示在putty中了,在putty中的操作和在树莓派上直接操作的效果是一样的。输入exit可以退出终端,如果putty界面关闭,终端内运行的命令也都会结束。

配置SSH

生成SSH的密钥

因为使用PuTTY登陆,所以此时最好使用PuTTY自带的生成器来生成密钥。打开puttygen.exe,并选择Generate,之后会提示在空白处随意移动鼠标以生成随机数。

Paste_Image.png

之后会显示生成的密钥信息,如下图:


Paste_Image.png

图中①是公钥(锁),私钥(钥匙)并不会显示出来。在②处设置使用此私钥时需要输入的密码(可以不设置密码),在③处保存私钥,一般不需要保存公钥(因为载入私钥后就会显示公钥)。

设置SSH公钥

存储私钥后复制①处的公钥,然后在putty界面中依次输入以下命令:

$ mkdir ~/.ssh
$ echo ssh-rsa AAAAB3……把本行ssh到最后的部分替换成自己的公钥……8xyFzQ== rsa-key-20170521
$ chmod 600 ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh

** 解释一下上面的命令:**

  • $ 表示行首的提示符,在终端会以“用户名@计算机名: 路径 $”的格式显示,比如 pi@raspberrypi:~ $,表示用户pi在计算机raspberrypi上,当前路径是pi的home目录。
    ~ 表示用户的home目录,也就是每个用户自己的主目录,用户所有的文件都会存在这个主目录下面。
    / 表示系统的根目录,所有的文件都“放”在这个根目录下面。
    在教程中为了避免混乱,一般不写$之前的信息,写$以区分每一行命令。
  • 以$开头的每一行都是一行命令,一行命令会包含命令参数
    每一行命令第一个空格之前是命令,之后是参数,参数以空格分隔。一个命令可以使用参数调用另一个命令。
    使用 “man 命令名”,可以查看命令的使用方法;也可以使用“命令名 --help” 来查看帮助。
  • 如果一行命令执行中不需要输入内容,比如确定yes or no,那么可以将这样的多行命令同时复制入putty,在putty中,右键为粘贴,左键框选复制。上面这几行内容都没有确认提示,所以可以先在笔记中编辑好,然后一起复制到终端里,注意最后一行可能需要手动回车。
  • 上面使用的几条命令中:
    mkdir 的功能是建立目录,
    echo显示内容,常与 > 或者 >> 配合使用来更改文件内容。> 功能是将输出内容保存为文件,>> 功能是将输出内容追加到文件。
    chmod 的功能是改变文件或目录属性。

上述命令执行后,可以新打开一个putty,使用私钥登陆。

测试使用私钥登陆

先填入主机名,


Paste_Image.png

先填入主机名,然后在putty的左侧选择 Connection 中 SSH 的 Auth,在右侧最下方 Private key file for authentication中选择刚才保存的私钥。点右下角Open,启动终端,在输入用户名后若显示 Authenticating with public key "……" 则说明私钥认证成功。若私钥没有密码,则直接登陆成功。若有密码,则提示输入:

Paste_Image.png

若使用私钥登陆成功,则可以关闭SSH的密码登陆,以提高安全性。

$ sudo nano /etc/ssh/sshd_config

找到:
PasswordAuthentication yes
修改为:
PasswordAuthentication no
按Ctrl+X退出,按y保存,回车确定保存名称。

nano 是 linux 中常用的文本编辑器,没有vim那么高大上,但是简单易用。

更改设置后重启ssh服务以使设置生效。

$ sudo systemctl restart ssh.service

更改Host和密码

在网络中,每个计算机都拥有自己唯一的名称(主机名 Hostname,常简称Host),树莓派系统默认的Host是raspberrypi,不具有唯一性,因此需要修改这个值。树莓派有更改设置的命令行程序raspi-config

$ sudo raspi-config
Paste_Image.png

选择第一项更改密码,确认后,输入密码回车,再次输入密码回车。成功会显示密码更改成功。确认后返回程序主界面。

Paste_Image.png

选择第二项更改 Hostname ,提示只能使用小写字母及0~9的数字及连字符 -,确认后输入,按回车确认。

设置语言与时区

选择第四项 Localisation Options

Paste_Image.png

其中第一项是更改语言设置,第二项是更改时区。
按空格取消或选中选项,选中zh_CN.UTF-8

Paste_Image.png

按 Tab键 移动光标至 Ok,回车。
按下键移动光标至zh_CN.UTF-8,回车。
稍等片刻后会返回设置界面。

开启VNCServer并调整分辨率

选择第5项 Interfacing Options
其中第3项是开启VNCServer(远程桌面)
选择第3项,并移动到Yes,回车。确认后返回主界面。
选择第7项 Advanced Options
其中第5项是更改分辨率
选择第5项,选择1280x720,回车。确认后返回主界面。
按Tab键移动到Finish,回车,会提示重启,选择Yes,回车。
由于树莓派重启,终端连接断开,会提示网络连接意外断开,如下图:


Paste_Image.png

确认后PuTTY会进入非激活状态,关闭窗口,如下图:


Paste_Image.png

配置连接设置

重新打开putty.exe,输入新的主机名,设置私钥。
在左侧 Connection 中选择 Data ,在右侧中第一项中输入自动登陆用户名 pi 。

Paste_Image.png

在左侧选择 Session,在 Save Sessions 中输入登录设置名称,点右侧Save保存设置。

Paste_Image.png

然后双击配置名启动终端。

设置VNC Viewer并连接无线网络

我们常用VNC Viewer来连接树莓派,来使用桌面功能。
新建一个链接,并在VNC Server中输入主机名,点Ok开启链接
会提示认证失败,可能不安全,点继续。
然后输入登录的用户名和密码。


Paste_Image.png

在右上角设置无线连接,选择自己的网络,并输入密码。

配置FTP

执行下列命令以安装vsftpd FTP服务器

$ sudo apt update
$ sudo apt install vsftpd -y
$ sudo service vsftpd start
$ sudo nano /etc/vsftpd.conf

找到以下项,并更改。# 开头的行表示注释,常用#来关闭某项设置,可以删除设置前的 #,以使该项生效。
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022

$ sudo service vsftpd restart

之后可以使用WinSCP等软件以FTP方式登录树莓派。

建议在配置完后备份TF卡。

安装 ROS Kinetic

调整页面文件大小

增加页面文件大小是为了解决编译时内存不足的问题。

$ sudo nano /etc/dphys-swapfile

找到 CONF_SWAPSIZE ,并将值修改为2048,保存退出并重启树莓派。

配置源

$ sudo sh -c 'echo "deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

然后更新一下

$ sudo apt-get update
$ sudo apt-get upgrade

安装依赖

$ sudo apt-get install -y python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential cmake

然后初始化一下

$ sudo rosdep init
$ rosdep update

编译源码

首先建立工作空间

$ mkdir -p ~/ros_catkin_ws
$ cd ~/ros_catkin_ws

然后配置一下安装文件,初始化工作空间,并下载源码

$ rosinstall_generator desktop rosserial perception joystick_drivers --rosdistro kinetic --deps --wet-only --exclude perception_pcl --tar > kinetic-custom_ros.rosinstall
$ wstool init src kinetic-custom_ros.rosinstall
$ wstool update -t src

为源码添加依赖

$ rosdep install --from-paths src --ignore-src --rosdistro kinetic -y -r --os=debian:jessie
$ sudo cp /usr/share/cmake-2.8/Modules/FindEigen3.cmake /usr/share/cmake-3.6/Modules/

开始编译

$ sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic

编译之后添加ROS配置到bash启动项

$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
$ echo "export EDITOR='nano -w'" >> ~/.bashrc

如果不用蓝牙,可以选择Ubuntu Mate

安装可以按照x64下面的Ubuntu安装,会简单很多。

$ sudo sh -c 'echo "deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

$ sudo apt-get update
$ sudo apt-get install ros-kinetic-desktop-full

$ sudo rosdep init
$ rosdep update

$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
$ sudo apt install python-rosinstall

推荐阅读更多精彩内容