说在前面的话,这是一个系列文章,研究从零落地 slam 小车,以下内容的 markdown 形式上传Gitee / Github 了可以直接 down 下来用捏
Gitee 从零落地 slam 小车: 从烧录系统开始的 slam 小车之旅 (gitee.com)
Github xiao-ge4/slam-car-begin-with-0: 从烧录系统开始的 slam 小车制作之旅 (github.com)
B站 Up xiaoGe4(在你看见这个文章的时候,还不一定录了捏QAQ)
这篇文章的逻辑
好捏,开始正文吧
下载镜像
现在 Ubuntu 官网只会放最新的版本,这里可以下载 18.04 的历史版本(其他版本第二个链接),树莓派4(其他版本,看链接内容)则选择以下来中其中一种(armhf 与 arm64 的区别也有列出)
下载18.04 或其他版本的链接
Ubuntu 18.04.6 LTS (Bionic Beaver)
Index of /releases
armhf 与 arm64 的区别
armhf =硬件浮点指令+ 32位指令集
一些树莓派尚不支持 64 位,4B 是都支持,我选的是armhf
格式化 SD 卡
使用 Ventoy 格式化 SD 卡,为烧录系统做准备
SD 卡是什么 SD卡?TF卡?傻傻分不清楚? - 知乎 (zhihu.com)
Ventoy 及其使用 超级好用的装机神器——Ventoy - 知乎 (zhihu.com)
系统烧录
用 Win32DiskImager 烧录
选择 Imager
选择硬盘,
点击“写入”
等待出现“成功”-->关闭窗口,结束烧录
以树莓派4B为例了解树莓派的结构和接口 - 知乎
连接外设(屏幕、键盘、鼠标),通电
注意:屏幕需要在通电之前接树莓派,关于如何连接,请看《树莓派接口》
通电后,初始 账户+密码 都是 ubuntu,输入成功后需要再设置,这个地方过于简单不会通过
这个地方我想理一理逻辑,此时的树莓派依赖于外接设备可以开始工作
但是
当你没有携带外接设备时,你无法使用
此时,update 这样的指令(但凡需要联网),你都无法使用
解决
ssh 是一种网络安全协议,你可以通过它来控制你的树莓派
VNC 是虚拟网络控制台,树莓派一端做vncserver,你的电脑做vncviewer 你可以 控制+查看界面(这里的桌面也需要你安装) 显而易见 ssh 是一个可选项,但仍然建议先配置,如果vncserver没有成功开启,vnc服务就会失败,但 ssh 仍然可以使用
首先我们得联网,但是 update 会默认使用国外的地址,非常容易访问超时,在此之前我们先更换网络源,同时我们需要网络(wifi)才能联系网络
总结
那么我们在配置ROS 之前,我们为了上网服务、控制树莓派、查看桌面,我们按照如下顺序进行
连接 wifi
更换源
配置 ssh
配置 vnc
这里别人总结的很好
参考文章 --> 非常好用 树莓派4B安装Ubuntu Server20.04(18.04)连接wifi(对于ubuntu server 99%适用)小白天才的博客-CSDN博客树莓派ubuntu连接wifi
我用的是第二个
直接上指令
编辑文件 #你要是熟悉其他编辑器 vi 等都可以
sudo vim /etc/apt/sources.list
点击键盘 i 进入 Insert 模式
应该有很多个 deb 开头的一行,其他的被 # 注释掉了,删掉未被注释的 deb 下面的 #deb-src 前面的#
将现在没被注释的每行 https://到/Ubuntu-ports之间的网址替换成mirrors.aliyun.com 换完之后长这样
#注意:每个 sources.list 文件内容不一定完全一样,根据上面步骤更改,如下只是 样式 示例 deb http://mirrors.aliyun.com/ubuntu-ports/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic main restricted universe multiverse 当然,实际上有很多行
然后按键
Esc
,输入:wq
退出当前编辑输入如下命令,更新软件,同时验证配置成功
sudo apt-get update sudo apt-get upgrade
写在前面的话
如果暂时没有遇到该问题,可先跳过,在下面的几步,非常可能遇到超时问题,返回来寻求解决
另:防火墙只是超时问题的一种可能原因,不是的话,Google / Bing 一下,也欢迎反馈问题,我们一起完善文档
问题介绍
链接超时可能是树莓派没有允许你的电脑访问它,也就是被防火墙挡住了,有以下几个解决方式
ufw 设置
sudo apt-get install ufw #安装 sudo ufw enable #启用 sudo ufw status #查看防火墙状态 sudo ufw default deny #系统启动时自动开启 sudo ufw enable|disable #开启/关闭防火墙 sudo ufw allow|deny [service] #开启/禁用特定端口 例如: sudo ufw allow 53 #允许外部访问53端口(tcp/udp) sudo ufw allow 22/tcp #允许外部访问22端口(tcp) sudo ufw allow from 192.168.1.100 允许此IP访问所有的本机端口(这里可以设置称自己的电脑)
另:vnc 连接的话,需要输入的地址是
树莓派地址:端口号 例如 192.168.1.1:1
另,很多人可能知道 Ubuntu 的防火墙,以下是二者的关系
上命令
安装 ssh
sudo apt-get install openssh-server sudo apt-get remove openssh-server #卸载命令
启动SSH服务
sudo /etc/init.d/ssh start
查看进程,检查是否启动成功
ps -e | grep sshd #另:sshd 是否正常运行 sudo systemctl status ssh
配置允许 root 用户登录
sudo vim /etc/ssh/sshd_config #编辑文本 取消“PermitRootLogin yes”前面的 # 号 保存退出
设置开机启动(如果需要的话)
sudo systemctl enable ssh #开启开机自启动 sudo systemctl disable ssh #关闭开机自启动 sudo systemctl start ssh #单次开启 ssh sudo systemctl stop ssh #单次关闭 ssh #注意:每次设置自启动后 重启一次 reboot
补充:重启命令与关闭命令
sudo /etc/init.d/ssh restart #重启SSH服务 sudo /etc/init.d/ssh stop #关闭SSH服务
远程连接 工具putty
ssh name@ip_address
上命令
安装 mate 桌面
sudo apt-get install ubuntu-mate-desktop
重启
sudo reboot
若开机等待时间长 原因:安装时连接了网络,系统被自动设置成连接路由器自动通过DHCP来获取ip地址完成上网。但是由于网络断开,他会有个重连过程,等待时间为5分钟
sudo vim /etc/systemd/system/network-online.target.wants/networking.service 找到TimeoutStartSec=5min修改为TimeoutStartSec=2sec
server
安装 vncserver
sudo apt-get -y install vnc4server
此时,首次启动
vncserver
,需要设置密码,根据提示设置,目的是先打开一次服务,生成一个~/.vnc/xstartup
文件查看桌面环境
echo $DESKTOP_SESSION //如果显示mate就是mate桌面环境
打开
~/.vnc/xstartup
文件后在末尾添加:unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS mate-session & mate-panel &
重启 vnc 服务
vncserver -kill :1 #关闭“1”desktop vncserver :1 #开启“1”desktop #千万注意 “-kill”后有空格,“:”后无空格
设置 vnc 服务在树莓派开机时自启动 在
/etc/init.d/
文件夹下新建一个服务脚本文件vnc4server
,作用就是将vnc4server程序
作为一个服务在开机时启动。创建完后把下面的代码粘贴上去保存(其中,注明了可以自己更改的参数)#!/bin/sh ### BEGIN INIT INFO # Provides: vncserver # Required-Start: $local_fs # Required-Stop: $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start/stop vncserver ### END INIT INFO # More details see: # http://www.penguintutor.com/linux/vnc ### Customize this entry # Set the USER variable to the name of the user to start vncserver under export USER='pi' ### End customization required eval cd ~$USER case "$1" in start) # 启动命令行。此处自定义分辨率、控制台号码或其它参数。 su $USER -c '/usr/bin/vncserver -depth 16 -geometry 1024x768 :1' echo "Starting VNC server for $USER " ;; stop) # 终止命令行。此处控制台号码与启动一致。 su $USER -c '/usr/bin/vncserver -kill :1' echo "vncserver stopped" ;; *) echo "Usage: /etc/init.d/vncserver {start|stop}" exit 1 ;; esac exit 0 执行
sudo chmod 755 /etc/init.d/vnc4server # 修改脚本权限为可执行权限 sudo update-rc.d vnc4server defaults # 将该脚本作为一项服务,设置为开机自动加载:重启
sudo reboot #已经能自启动 vnc 服务了 #想要停止的话就执行:sudo service vnc4server stop一些其他vncserver相关指令
启动 vncserver :1 关闭 vncserver -kill :1 查看 vncserver -list 默认端口对应 vncserver :1 5901 vncserver :2 5902 依次类推
参考来源 树莓派ubuntu18.04 mate 安装VNC夏小正的鲜小海的博客-CSDN博客树莓派安装vnc
viewer
Windows 下载 Vnc Viwer
设置下载源
#注意:以下三个源下一个即可 #设置中科大源 sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list' #设置清华源 sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list' #设置上海交大源 sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.sjtug.sjtu.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list' #设置公钥 sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
安装 ROS
#先更新一下 sudo apt update sudo apt upgrade #没有更新可能会影响后面的安装 sudo apt install ros-melodic-desktop-full 包括ROS, rqt, rviz, 机器人通用库, 2D/3D simulators and 2D/3D perception #另有如下其他版本 sudo apt install ros-melodic-desktop 包括ROS, rqt, rviz, 和机器人通用库 sudo apt install ros-melodic-ros-base 包括ROS 包, build和通信库。没有GUI工具
设置环境变量
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc #编辑文本 source ~/.bashrc #执行 #这个步骤是让你的 bash 终端 以后可以识别 roscore,rosrun等命令 #如果你用的是 zsh 等其他终端更改一下命令,例如 echo "source /opt/ros/melodic/setup.zsh" >> ~/.zshrc source ~/.zshrc
下载必要功能组件
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
rosdep init
sudo rosdep init #来了来了,几乎都会报错的QAQ原因:访问外网 raw.githubusercontent.com ,很难的啦 解决:a. 梯子 b.解析服务其地址(访问外网时绕过去) 操作:
1.sudo chmod 777 /etc # 此指令为获取etc中的权限 2. 在etc中手动创建文件夹 /etc/ros/rosdep/sources.list.d 3. 解析 raw.githubusercontent.com 的服务器地址,工具https://site.ip138.com,打开该网站,根据提示输入要解析的网址,下面就会有地址(选一个) 我选的是 185.199.111.133 4. sudo vim /etc/hosts 将选择的服务器地址、网址加进去,格式如下 185.199.111.133 raw.githubusercontent.com 保存、退出 5. sudo rosdep init 若有报错ERROR: default sources list file already exists: /etc/ros/rosdep/sources.list.d/20-default.list Please delete if you wish to re-initialize 原因:/etc/ros/rosdep/sources.list.d目录下已经有20-default.list 解决:删除它 碎碎念:但是根据我刚刚的步骤,应该不会有这个问题
rosdep update
sudo rosdep update #可能又又又会报错原因:仍然是 raw.githubusercontent.com 被墙
解决:
a. 梯子
b. 多次执行/手机开热点
c.需要更新的文件下载到本地
其中:a/b方法 非常的易操作,b 方法不可小觑,网络好的话,就不需要 c 方法那么复杂了
详细讲讲 c 方法:将更新的文件下载到本地
先去 github (https://github.com/ros/rosdistro)将需要的包 down 下来,这里有一个小 Trick,因为 github 的服务器都在国外,访问速度较慢,当遇到这种情况时,我会把它导入 Gitee ,这样 访问速度 会快很多(授人以渔,下面有一个章节专门用来介绍如何 Github 转 Gitee) 附:我的仓库地址(rosdistro: Github上 github.com/ros/rosdistro 同步仓库,他人成果,国内服务器访问速度更快)
记录存放地址
修改 /etc/ros/rosdep/source.list.d/下的20-default.list,将文件中指向raw.githubusercontent.com的url地址全部修改为指向本地文件的地址
sudo vim /etc/ros/rosdep/source.list.d/20-default.list 更改后: # os-specific listings first yaml file://....../rosdep/osx-homebrew.yaml osx # generic yaml file://....../rosdep/base.yaml yaml file://....../rosdep/python.yaml yaml file://....../rosdep/ruby.yaml gbpdistro file://....../releases/fuerte.yaml fuerte # newer distributions (Groovy, Hydro, ...) must not be listed anymore, they are being fetched from the rosdistro index.yaml instead其中,......就是你的存放地址,例如我放在/home/leisp下,那么我 更改后就应该是
# os-specific listings first yaml file:///home/leisp/rosdistro/rosdep/osx-homebrew.yaml osx # generic yaml file:///home/leisp/rosdistro/rosdep/base.yaml yaml file:///home/leisp/rosdistro/rosdep/python.yaml yaml file:///home/leisp/rosdistro/rosdep/ruby.yaml gbpdistro file:///home/leisp/rosdistro/releases/fuerte.yaml fuerte # newer distributions (Groovy, Hydro, ...) must not be listed anymore, they are being fetched from the rosdistro index.yaml instead
修改
/usr/lib/python2.7/dist-packages/rosdep2/sources_list.py
中的默认的url的地址修改后: # default file to download with 'init' command in order to bootstrap # rosdep DEFAULT_SOURCES_LIST_URL = 'file:///home/leisp/rosdistro/rosdep/sources.list.d/20-default.list' # seconds to wait before aborting download of rosdep data修改
/usr/lib/python2.7/dist-packages/rosdep2/rep3.py
修改后: # location of targets file for processing gbpdistro files REP3_TARGETS_URL = 'file:///home/xxx/rosdistro/releases/targets.yaml' # seconds to wait before aborting download of gbpdistro data修改
/usr/lib/python2.7/dist-packages/rosdistro/__init__.py
修改后: # index information DEFAULT_INDEX_URL = 'file:///home/xxx/rosdistro/index-v4.yaml' def get_index_url():最后
sudo rosdep init
check --> 小海龟
roscore rosrun turtlesim turtlesim_node #启动节点 rosrun turtlesim turtle_teleop_key #注意:分别在三个终端输入以上命令
因为 github 的服务器都在国外,访问速度较慢,当遇到这种情况时,我会把它导入 Gitee ,这样 访问速度 会快很多
创建仓库
点击“导入已有仓库”
添加要导入项目的网址
点击创建,仓库生成
注意:如果想要仓库开源(所有人可见) 在仓库建立之后,点击管理,设置中更改信息