raspberry pi3B+ 从刷系统到安装ros1.0-kinetic+远程连接pc+调试turtlebot

版权声明:转载请标明出处,谢谢! https://blog.csdn.net/SimileciWH/article/details/82453547

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修改后的镜像文件

[email protected]

当然你也可以参考这个地址,来解决你的问题,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......

猜你喜欢

转载自blog.csdn.net/SimileciWH/article/details/82453547