前面的文章是在已安装的ROS基础上做的一些应用,这里我们从零开始安装ROS机器人操作系统。
机器人操作系统(Robot Operating System,ROS)是一个开发机器人软件的框架,里面包含了一系列的工具,库和惯例,目的在于简化在大量不同种类机器人平台之间构建复杂和稳定的机器人行为。
ROS遵循Unix的软件开发理念,所以对于有Unix背景知识的,会感到很熟悉,上手很快。ROS的一个显著特点是,可以使用多种语言来开发,包括C++、Python、Lisp、Java、Javascript、Matlab、Ruby、R语言等等,这也使得不同语言背景的程序员都能够很自然的进入到机器人领域。
更重要的是,ROS是开源且免费的,遵循BSD协议发布,所以是允许商用的,不需要授权,以及由于ROS模块之间的耦合度非常低,自己开发的模块等是可以细粒度的许可授权。
这里就介绍Ubuntu(一个流行且相对友好的Linux发行版)中如何是安装ROS的,本人的版本是18.04版本,这里着重说下版本号,是因为下面的安装跟你的系统版本是有关的。
1、更新软件源
首先就是将软件源添加到ros-latest.list文件,这样就可以让操作系统知道去哪个站点下载了:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'
我们可以查看下文件,源内容已被写入进去
cat /etc/apt/sources.list.d/ros-latest.list
deb http://packages.ros.org/ros/ubuntu trusty main
这里需要注意的是,如果想要安装,先不急着输入上述命令,全文看完之后再来安装,因为ROS的安装跟你的Ubuntu系统版本有关。
2、设置密钥
wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
这里的密钥,在后续进行安装的时候,第二行命令可以先不管它,应该是不需要
3、安装机器人开发库
安装完整桌面套装,包含了机器人开发所需的库和工具
sudo apt-get update
sudo apt-get install ros-indigo-desktop-full python-rosinstall
如果出现下面这样的错误:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:The following packages have unmet dependencies:
ros-indigo-desktop-full : Depends: ros-indigo-desktop but it is not going to be installed
Depends: ros-indigo-perception but it is not going to be installed
Depends: ros-indigo-simulators but it is not going to be installed
Depends: ros-indigo-urdf-tutorial but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
E:由于无法纠正问题,您持有损坏的包。所以这里其实是版本不匹配!
我的Ubuntu的发行版本是:
uname -v
#161~18.04.1-Ubuntu SMP Fri Feb 10 15:55:22 UTC 2023
可以看到是18.04的版本,这里列出Ubuntu对应的版本:
Ubuntu版本 | ros版本 |
Ubuntu 20.04 | noetic |
Ubuntu18.04 | melodic |
Ubuntu16.04 | kinetic |
Ubuntu14.04 | indigo |
所以需要将indigo修改成melodic,再次安装时,依然有问题:
sudo apt-get install ros-melodic-desktop-full python-rosinstall
报错:E: Unable to locate package ros-melodic-desktop-full
发现这里报错的原因除了版本对应的问题之外,更关键的是软件源的选择。
使用lsb_release -sc命令直接获取版本也可以,这里显示为bionic
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu bionic main" > /etc/apt/sources.list.d/ros-latest.list'
或者为了更好的在其他不确定的系统上进行移植,输入下面这样的命令(推荐):
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
再次查看ros-latest.list文件内容:
cat /etc/apt/sources.list.d/ros-latest.list
deb http://packages.ros.org/ros/ubuntu bionic main
然后sudo apt-get update更新之后,再次安装就没有问题了
安装好了ros之后,就会在opt目录下面出现ros目录,查看:ls /opt
nvidia ros
可以进入ros里面再去看看,是melodic版本,里面有哪些目录与文件:cd /opt/ros/melodic
bin include local_setup.sh setup.sh share
env.sh lib local_setup.zsh _setup_util.py
etc local_setup.bash setup.bash setup.zsh
4、安装依赖包
rosdep是ROS的依赖管理实用程序,rosdep可以与ROS包和外部库一起使用,是一个命令行实用程序,用于识别和安装依赖项以构建或安装包。
sudo rosdep init
如果出现 sudo: rosdep: command not found 这样的错误,就需要安装python-rosdep
安装命令: sudo apt-get install python-rosdep
rosdep update
如果因为网络而出现不能访问的错误
ERROR: cannot download default sources list from:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.
处理方法,新建目录与文件:
sudo mkdir -p /etc/ros/rosdep/sources.list.d
cd /etc/ros/rosdep/sources.list.d
sudo gedit 20-default.list
然后将下面的内容粘贴到这个20-default.list文件里面:
# os-specific listings first
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml osx# generic
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml
gbpdistro https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml fuerte# newer distributions (Groovy, Hydro, ...) must not be listed anymore, they are being fetched from the rosdistro index.yaml instead
如果在前面访问不了,同样的里面的站点也会访问不了,修改hosts文件:
sudo gedit /etc/hosts
#在文件末尾添加
151.101.84.133 raw.githubusercontent.com
然后再rosdep update,有时多试几次就可以了。
5、新开终端自启
最后将setup.bash添加到~/.bashrc,这样每次启动终端就会自动运行,从而可以在shell中运行ROS提供的命令了
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
不然每次开终端都需要source /opt/ros/melodic/setup.bash就显得比较麻烦。
6、检验ROS
ROS安装好了之后,我们输入命令:roscore 查看下是否能正常启动这个节点管理器,如图:
恩,没有问题,这个roscore可以理解成每个节点需要进行交互,必须向它报道,因为ROS是松耦合的一种组织方式,节点之间如果要进行消息的传递,就需要roscore来提供连接信息,也就是说每个节点在启动的时候,都会连接到roscore并注册该节点发布和订阅的消息。当新的节点出现的时候,roscore就会向其提供其他相同消息主题的节点,从而建立连接关系,如果没有roscore的话,节点之间就不能通信了。
另外我们也看到了ROS_MASTER_URI=http://YAB:11311/,其中YAB是主机名,11311是默认端口,这样我们就可以通过这个URI来进行访问了。
现在我们来开启两个节点测试下,新增的两个节点为talker和listener,一个说话,一个倾听,也就是一个发布,一个订阅,画张图来表示它们之间的关系如下:
需要注意的是,图中的节点是周期性的调用roscore提供的服务来找到其他节点,这里就是talker和listener周期性的调用roscore,而这两个节点之间的通信是直接完成的,节点跟roscore都只是短暂性的连接。
现在分别打开终端,并运行节点:
rosrun rospy_tutorials talker
rosrun rospy_tutorials listener
如图:
这个listener就会一直侦听talker发布的消息。如果将talker节点Ctrl+C终止,这个listener节点也将停止显示信息,仍将处于侦听状态。