1 下载raspberry 所支持的系统可以从以下网址下载,注意:因为我们是要最终跑ros系统的的所以我们要尽可能的安装ros官网对应ros发行版的系统,以避免安装ros过程中出现的不必要的麻烦。
raspberry 官网:https://www.raspberrypi.org/
linux社区:https://wiki.ubuntu.com/ARM/RaspberryPi
下载系统镜像以.img或者.img.xz类似的后缀名,下载时要选择和你raspberry固件版本匹配的系统(尤其是在下载第三方提供的镜像文件),raspberry官网推荐使用noods这个超级简单的方式进行安装,尝试过确实很便捷。
2 前期准备工作
2.1 一张大于8g的sd卡,用来刻录系统,同时相当于你的raspberry机械硬盘,注意sd卡格式必须是FAT/FAT32,容量大于32g的sd卡大多是exfat格式,windows用户需要通过sd-format软件将其格式化成fat32,而linux用户只需要打开磁盘工具直接格式化成fat32就可以了;
2.2 读卡器,将tf卡或者sd卡与你的pc机相连;
2.3 如果是windows用户需要通过win32这个刻录工具将镜像写入到sd卡;
如果是linux用户,打开磁盘工具就可以直接将系统刻录到sd卡。
3 刻录系统
3.1 使用raspberry官网推荐的noods安装系统,只需要将noods下载下来,让后解压到你的sd卡,然后将sd卡插入到树莓派,就可以了。
3.2 使用第三方的镜像包或者linux社区的官方包和第三方包,需要通过刻录的形式将系统镜像文件写入到sd卡。
windows用户可以通过磁盘工具查看sd卡的状态,会发现你的sd卡被划分成了三个区域,空闲区域大约50M左右,fat区域(即boot盘)系统可以打开,还有一个ext4区域(系统的root盘)这个区域linux用户可以直接查看到;还有一个较大的空闲区域,你的系统最终会被安装到这个位置。如下图所示,
root盘如下所示,系统版本不同,可能有所差别,我的是ubuntu mate 16.04
boot盘中的内容:
至此你的系统已经刻录完成了。
4 讲解root和boot盘中的内容。
root盘中的内容就是ubuntu(linux)系统的基本结构,可以理解成windows的C盘中的内容。使用过linux系统的应该都很熟悉
boot盘中的内容为驱动内容,包括raspberry的cpu驱动,kernel内核,启动项,配置文件等。看boot盘中的内容可以看到很多BCM开头的内容,这个是与你的raspberry的cpu型号相关的,你看一看这你的cpu型号来核查,这里是否包括你的raspberry的启动项,如果没有,那么启动时会出现彩虹屏,无法安装系统的问题。后面会讲到这个内容。还有连个文件比较重要,就是cmdline.txt和config.txt这里面存放的是你的raspberry的系统设置。
5 安装系统配置raspi-config
刻录完成后,将sd卡插入到raspberry中,接上电源和你的鼠标键盘,开机,一路傻瓜式安装,正确配置即可。
6 无显示屏怎么安装,网上很多是关于此的内容,大概有三种方法
6.1 将树莓派通过网线接入到路由器和你的pc在同一个局域网中
6.2 通过串口连接你的raspberry和你的pc机
6.3 通过以太网和你的树莓派连接
注意,这些方法只适用于你的raspberry已经成功安装了系统或者已经成功安装过系统,因为只有这样,才不会在第一次开启raspberry时进入raspi-config界面,因此如果很不幸,你的raspberry刚刚拿到手一次都没有开过机或者安装过系统配置过raspi-config,那么你没法通过这三种方法连接到你的raspberry,这是因为你的raspberry开机时第一次会卡在raspi-config界面,而这个时候你的系统还没有安装上,因此,你比系通过连接显示器来,设置好raspberry的配置。
这个事情卡了我很久,最终也验证了我的想法。
7 如果你正常安装了你的系统,那么只需要将你的raspberry和你的pc连接到同意局域网就可以远程控制你的raspberry了,推荐通过ssh的方式。
7.1 连接在同一个局域网环境,pc连接路由,raspberry连接路由,那么你只要找到raspberry的ip地址通过
ssh [email protected]
就可以连接他了,然后输入raspberry的密码就可以了
7.2 通过Ethernet连接到同一个局域网环境。这时候你需要你的pc通过wifi连接网络(win下的教程很多,就不说了,主要说ubuntu下的配置),然后将网线连接pc和raspberry,同时给raspberry上电,这是你可以在ubuntu设置中看到一个network的tag标签,你点开后,选择ipv4,选择手动设置,手动设置好你的pc机ip地之后,将raspberry shutdown断电,取出sd卡,通过读卡器连接你的电脑,在boot盘下的cmdline.txt中末尾,添加ip=xxx.xxx.xxx.xxx即可,设置你的raspberry和你电脑连接时的ip address。如下图所示:
这时候将sd卡插回到你的电脑,这样就可以正常连接了,注意仍然是通过ssh指令进行连接。
8 安装ros系统到你的raspberry
以上步骤都完成之后,可以参考ros官网通过的raspberry pi安装ros的教程,亲测可用。
link:http://wiki.ros.org/ROSberryPi
注意要根据你的raspberry系统选择对应的ros系统。
9 截止2018年09月05日 raspberry pi 3B+的三方镜像包还没有正式可以使用的,不过参考linux社区的连接,之前我列出的那个连接地址,在这个位置
可以看到官方镜像说,对于3/3B+是可以使用2的镜像包的,只需要做出如下修改,点开below我们可以看到
找到上图显示的位置,我们可以按照要求来做。我是用的是ubuntu mate为raspberry pi 3制作的镜像包,我尝试按照上面的方式做出改变,这也确实解决了缺少3B+的驱动从而导致的开机彩虹屏的问题,但是进入安装界面时,我的鼠标键盘无法使用,因此最终也没法继续安装。查看网上的回答,大多认为是移植kernel的问题,因此最终我还是决定等待3B+的定制ubuntu mate,因此我现在安装了raspberry推荐的raspbian debian stretch系统。
10 给raspberry安装ros-kinetic系统(从源的方式安装)
打开上面贴出的ros官网的raspberry安装ros的链接,如下图
因为我的raspberry系统是基于debian stretch的linux系统,查看ros发行版,我其实只能安装melodic和lunar版本的ros,但是我想安装kinetic版本的ros,而且教程中只提供了kinetic的而没有melodic和lunar因此,点开kinetic的教程,按照步骤进行安装,最终成功的实现了在raspdebian上安装ros-kinetic,注意编译构建的时间会很长,耐心等待。
update......2018年09月07日
11 接着第9节,我遇到的鼠标键盘不能使用的问题,可以用如下的方法解决:
鼠标键盘:用最新的驱动覆盖原来的旧驱动 在文件夹 /lib/modules/4.*-v7
这样成功解决了鼠标键盘不能使用的办法,系统正常安装了。
这个4.*-v7的驱动包,可以使用noods安装raspbian系统后,在命令行使用
sudo rpi-update
获得最新的驱动,然后拷到你ubuntu mate16.04的包/lib/modules的位置,删除旧的驱动包。
如果你没有成功解决这个问题,可以联系我发送一份raspberry pi3B+可以之间安装ubuntu mate16.04修改后的镜像文件
当然你也可以参考这个地址,来解决你的问题,link:https://www.raspberrypi.org/forums/viewtopic.php?p=1301856
12 第10节我尝试从源的方式安装ros系统,虽然成功了,但是如果要自己创建新的包,或者配置依赖关系会很麻烦,而且会花费大量的时间在构建编译上,这绝不是我所想要的,因此,我通过9,11两节的方式,装回了ubuntu mate16.04,然后按照ros官网的kinrtic教程顺利完成了了ros的安装,这样在raspberry上使用ros和在pc机上使用是一模一样的,而且安装起依赖包以简单的多。
13 在执行rpi-update更新raspberry的内核时总是遇到EOF的问题,这是因为网络不好导致的压缩包下载不完全,因此,查阅了很长时间后,发现解决办法是,等你网络好的时候在执行,只有当网络流畅时,才能正常update,在多次尝试后,最终也成功的update kernel了。
14 解决开机出现[Failed] Failed to start Load Kernel Modules. 的问题
这是因为默认加载的kernel,其实在路径中并不存在的问题,解决办法
sudo vim /etc/modules-load.d/cup*.conf
文件中的内容为
# Parallel printer driver modules loading for cups
# LOAD_LP_MODULE was 'yes' in /etc/default/cups
lp
ppdev
parport_pc
将剩下的内容全部注释掉,如下所示
# Parallel printer driver modules loading for cups
# LOAD_LP_MODULE was 'yes' in /etc/default/cups
# lp
# ppdev
# parport_pc
重启reboot,问题就不会再出现了。
upadting......2018年09月08日
15 结束了以上14节内容的配置,发现raspberry的开机时间很长,通过系统查看工具发现,startup需要2min多,这绝不是我们想要的,因此决定cut掉一些不用的service来加快开机时间。
关于ubuntu系统工具的详细介绍,请查看link:https://www.freedesktop.org/software/systemd/man/systemd-analyze.html
关于可关闭的一些启动项,可以参考link:https://www.linux.com/learn/cleaning-your-linux-startup-process
另外通过安装sysv-rc-conf这个工具可以有效的帮助你决定什么启动项可以被cut,安装方法
sudo aot-get install sysv-rc-conf
#启动命令
sudo sysv-rc-conf
用方向键移动光标,1,2,3,4,5,6,S是优先级等级,带交叉符号的为允许的启动项,可以通过空格可以关闭启动项。
通过指令,查看开机时间(我这个已经被我优化过了,现在只要14s开机)
$ systemd-analyze time
Startup finished in 6.081s (kernel) + 7.858s (userspace) = 13.939s
通过指令,查看有哪些服务参与了开机启动
$ systemd-analyze blame
3.197s networking.service
2.980s dev-mmcblk0p2.device
2.685s ondemand.service
2.680s speech-dispatcher.service
2.387s triggerhappy.service
2.093s snapd.service
1.784s NetworkManager.service
1.512s hciuart.service
1.060s systemd-modules-load.service
1.017s console-setup.service
823ms sshguard.service
807ms systemd-logind.service
573ms sshdgenkeys.service
565ms grub-common.service
564ms prefer-timesyncd.service
560ms systemd-user-sessions.service
548ms rng-tools.service
525ms pppd-dns.service
494ms rsyslog.service
447ms keyboard-setup.service
435ms avahi-daemon.service
433ms redis-server.service
375ms systemd-udev-trigger.service
308ms systemd-journald.service
303ms systemd-udevd.service
236ms systemd-fsck-root.service
208ms resolvconf.service
203ms apparmor.service
198ms bluetooth.service
194ms raspi-config.service
168ms snapd.seeded.service
168ms [email protected]
163ms systemd-journal-flush.service
149ms dev-mqueue.mount
137ms polkitd.service
136ms hddtemp.service
198ms bluetooth.service
194ms raspi-config.service
168ms snapd.seeded.service
168ms [email protected]
163ms systemd-journal-flush.service
149ms dev-mqueue.mount
137ms polkitd.service
136ms hddtemp.service
133ms wpa_supplicant.service
129ms ssh.service
126ms binfmt-support.service
123ms systemd-update-utmp.service
116ms alsa-restore.service
105ms systemd-tmpfiles-setup-dev.service
103ms sys-kernel-debug.mount
95ms kmod-static-nodes.service
92ms ufw.service
87ms systemd-timesyncd.service
77ms plymouth-start.service
75ms systemd-random-seed.service
70ms systemd-tmpfiles-setup.service
60ms [email protected]
54ms plymouth-quit.service
53ms plymouth-quit-wait.service
53ms proc-sys-fs-binfmt_misc.mount
49ms systemd-sysctl.service
42ms systemd-update-utmp-runlevel.service
39ms boot.mount
39ms ureadahead-stop.service
34ms plymouth-read-write.service
30ms systemd-remount-fs.service
30ms systemd-rfkill.service
29ms sys-kernel-config.mount
26ms setvtrgb.service
22ms rc-local.service
8ms snapd.socket
命令行关闭/开启service的命令为:
sudo systemctl disable/enable xxxx.service
service的部分开机时间较长的服务功能,如下解释
2.533s snapd.service //Tool to interact with Ubuntu Core Snappy
2.506s triggerhappy.service //global hotkey daemon for Linux
2.427s hciuart.service //something connect to blueteeth
2.423s ondemand.service //frequency scale
2.383s speech-dispatcher.service \\It's a daemon that programs can use to output speech about language.
2.141s NetworkManager-wait-online.service \\sudo systemctl disable NetworkManager-wait-online.service
2.012s ModemManager.service \\ is a DBus-activated daemon
1.905s NetworkManager.service
1.304s accounts-daemon.service \\allows programs to get and manipulate user account information.
1.224s sshguard.service \\protects hosts from brute-force attacks against SSH and other services.
1.119s upower.service \\service on the system message bus.
1.085s systemd-modules-load.service \\is an early boot service that loads kernel modules based on
16 ROS是支持分布式的,所以在同一个局域网下,我们可以设定一个主机作为主节点,运行roscore,其他的从机ROS_MASTER_URI地址只要与主机保持一致,就可以实现的分布式操作。举个例子,我用我的PC作为主节点,运行roscore,我的raspberry作为从机1号,运行一个节点,通过rostopic查看他们之间是否正常通信。参考自ROS官网,
link:http://wiki.ros.org/ROS/Tutorials/MultipleMachines
link:https://github.com/mktk1117/six_wheel_robot/wiki/Communication-between-Raspberry-Pi-and-PC-(ROS)
16.1 在我的PC上
现将 PC的IP地址和raspberry的IP地址写入到/etc/hosts中
sudo vim /etc/hosts
在末尾加上如下两行:
#pc and raspi communication base on ROS
192.168.1.91 whpi
192.168.1.88 whpc
这个IP地址在前面几节已经讲过了怎么设置了,根据个人不同做出修改,通过ifconfig指令查看。
主机与raspberry从机1号建立连接,通过ssh指令
ssh whpi@whpi
或
ssh [email protected]
然后输入设置好的密码就行了。
16.2 设置主机(我的PC)ROS信息
export ROS_HOSTNAME=whpc
export ROS_MASTER_URI=http://whpc:11311
运行roscore。
16.3 设置从机1号(我的raspberry)ROS信息,注意其他的从机ROS_MASTER_URI地址只要与主机保持一致
export ROS_HOSTNAME=whpi
export ROS_MASTER_URI=http://whpc:11311
11311为端口号,每个人可以是不同的。
因为我已经在主机(我的pc)运行了roscore指令,因此可以通过rostopic list查看话题信息。如下图所示,
左边为我的电脑,右边为我的raspberry,他们的信息一致,说明分布式交流建立成功。
16.4 通过一个演示来验证。
从机(我的raspberry)运行,显示如下内容
rosrun rospy_tutorials listener.py
从机什么也没有接受到,因为主机没有运行talker,现在主机运行talker,如下所示,
rosrun rospy_tutorials talker.py
可以看到,主机(我的PC)一运行talker,从机(raspberry)就接收到了信息----(为了防止刷屏太快我手动终止了talker的进程)。我们确实做到了。
如果你有更多的从机,只需要:
1、将他们和你的主机连接到同一个局域网;
2、设置好主机的ROS_HOSTNAME,和ROS_MASTER_URI;
3、设置好从记得ROS_HOSTNAME(这个是每个从机都不相同的),和ROS_MASTER_URI(这个是每个从机都和主机相同)
17 通过远程控制raspberry跑kobuki-turtlebot小车
updating......