ROS系统的本地搭建

阅读量    116734 |

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

0x00 写在前面

有关ROS系统的相关知识已经在上一篇文章中进行了阐述,在本篇文章中,将就ROS的进一步搭建方法做阐述。

⚠️:本文中“消息代理”、“主服务器”、“Master Server”是相同的意思,可以互换。

 

0x01 关于版本选择

目前稳定的ROS系统有三个版本可供选择

ROS 系统版本号 最后支持期限 对应的Ubuntu系统 Logo
ROS Kinetic Kame 2021年4月 Ubuntu 16.04 LTS
ROS Melodic Morenia 2023年5月 Ubuntu 18.04 LTS
ROS Noetic Ninjemys 2025年5月 Ubuntu 20.04 LTS

我们此处以ROS Melodic Morenia为例进行本地环境的搭建,选用Ubuntu 18.04 LTS

⚠️:尽管实际的ROS交互并不需要任何的图形化界面,但是为了演示方便,我们此处还是选用带有用户图形界面的Desktop版本。

 

0x02 本地搭建ROS环境

配置apt仓库

使用以下命令启用restricteduniversemultiverse存储库。

sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) main universe restricted multiverse"

这里也可以换成阿狸云的存储库链接,但是必须是包含restricteduniversemultiverse的。

配置sources.list

使用以下命令启用ros存储库。

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'

这里给出一些其他的镜像源以供选择:

🇨🇳中国科学技术大学:http://mirrors.ustc.edu.cn/ros/ubuntu/
🇨🇳清华大学:http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/
🇨🇳北京外国语大学:http://mirrors.bfsu.edu.cn/ros/ubuntu/
🇨🇳上海交通大学:http://mirrors.sjtug.sjtu.edu.cn/ros/ubuntu/
🇺🇸官方:http://packages.ros.org/ros/ubuntu

设置GPG密钥

使用以下命令启用GPG密钥。

sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

若多次超时,可以使用如下命令进行替换:

sudo apt-key adv --keyserver 'hkp://pgp.mit.edu:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add -
curl -sSL 'http://pgp.mit.edu/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add -

更新软件包并安装完整版的ROS软件包

使用如下命令更新软件源与软件包

sudo apt-get update && sudo apt-get upgrade

然后安装ROS系统(完整版):包括ROS基本通讯协议包、rqt工具包、rviz工具、机器人通用库、2D/3D模拟器、导航以及2D/3D感知包。

sudo apt install ros-melodic-desktop-full

除了完整版我们还可以选择安装非完整版的子包

  • 桌面版(Desktop):包括ROS基本通讯协议包、rqt工具包、rviz工具、机器人通用库
    sudo apt install ros-melodic-desktop
    
  • 核心版(Core):包括ROS基本通讯协议包
    sudo apt install ros-melodic-ros-base
    
  • 独立版:
    sudo apt install ros-melodic-PACKAGE
    

    例如:

    sudo apt install ros-melodic-slam-gmapping
    

    若想知道所有的可安装独立模块,可使用以下命令查询

    sudo apt search ros-melodic
    

初始化rosdep

接下来因为要与raw.githubusercontent.com交互获取内容以完成初始化动作,因此需要先对host配置进行修改

执行sudo vi /etc/hosts

在最后添加一行151.101.84.133 raw.githubusercontent.com

接下来执行以下命令以完成初始化

sudo rosdep init
rosdep update

🚫:在执行rosdep update时切勿使用sudo

至此,我们对于ROS环境的安装全部完成。

配置环境变量(非必须)

可以使用以下命令来自动的添加环境变量的配置

echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc

⚠️:若不进行此步骤,在接下来进行测试操作以及后续构建工程时都需要执行source /opt/ros/melodic/setup.bash来使环境变量生效。

安装必要小工具

可以使用以下命令来安装一些工具以方便我们后续构建项目。

sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential

 

0x03 测试小乌龟项目【需要桌面环境】

小乌龟项目是内置在ROS系统中的用于测试的项目,此项目中同时用到了发布者-订阅者消息模式和客户端-服务端消息模式。

启动Master Server

首先,若还记得之前在”物联网协议——MQTT与ROS”一文中提到的消息代理的概念,对于ROS系统,不论是使用了哪种消息模式都需要启动一个消息代理用于将消息分发到合适的消息接收端。

那么,我们需要使用roscore启动一个主服务器以充当master server

这里我们做以下几点补充说明:

  1. roscore会默认将计算机名作为主服务器的host,此时,ROS系统仅能用于本地测试
  2. 可以使用环境变量来控制roscore的启动行为,其中,最重要的三个环境变量是:
    • ROS_ROOT:此环境变量必须指向ROS环境的安装位置,当系统中安装了多个版本的ROS软件包时,需要使用此环境变量进行手动指定。(默认值:/opt/ros/melodic/share/ros)
    • ROS_MASTER_URI:此环境变量必须指向ROS主服务器的完整地址,当我们想把主服务器暴露在网络中时,需要使用此环境变量进行手动指定。(默认值:(空),建议值:http://0.0.0.0:11311)
    • PYTHONPATH:此环境变量必须指向ROS系统所使用的Python环境位置,由于ROS系统底层的部分模块需要依赖Python,因此尽管我们可以使用其他语言构建项目,但是为了保证运行无误必须配置Python环境,ROS系统安装时已经默认一并安装了Python,当我们需要更换时需要手动指定。(默认值:/opt/ros/melodic/lib/python2.7/dist-packages)
  3. 如果不使用&标志符限定,默认此服务将会在前台运行,在进行接下来的测试时请务必不要关闭一开始的窗口。

启动node观察器

现在我们可以使用rosnode这个小工具来查看目前的ROS系统中存在哪些节点

这个节点就是由消息代理启动的一个用于管理消息发送接收的节点,正如之前说过的,ROS系统与MQTT不同,他是一个高度集成的系统,同时支持两种消息模式。那么,/rosout事实上就拥有了三种属性:

  • 订阅者:/rosout可以作为订阅者,订阅若干其他节点,用于具有多播特性的Pub-Sub mode
  • 发布者:/rosout可以作为发布者,向其他若干节点发布消息,用于具有多播特性的Pub-Sub mode
  • 服务者:/rosout可以作为服务端,提供若干服务以供其他节点发起调用,用于具有单播特性的CS mode

我们可以使用rosnode info命令去看到其所有的订阅者、发布目标以及服务列表,此外,还能看到此节点的位置以及PID。

⚠️:在ROS系统中,为了最高效的利用资源,当我们启动一个新节点时,默认策略会使得主服务器随机选择一个可用端口进行节点绑定,当有其他节点想要链接此节点时只需要向消息代理询问即可,这个策略尽管实现了空间解耦,但是阻碍了我们利用ROS系统进行CTF竞赛的命题,因为无法动态的进行docker的端口映射,如果有读者可以解决此问题,请在本文评论区发布评论,笔者在此感激不尽。

启动小乌龟节点【需要桌面环境】

接下来我们使用rosrun turtlesim turtlesim_node命令启动小乌龟节点

此时或许可以发现,每次启动小乌龟节点时,小乌龟的皮肤都不相同,我们重新使用rosnode命令观察节点

我们可以发现以下几点:

  • 小乌龟节点/turtlesim已经对/rosout这个节点产生了订阅关系。
  • /turtlesim同样提供了若干话题以及若干服务。

那么,如果我们不想用/turtlesim这个节点名,ROS系统事实上提供了自定义节点名称的参数。

首先关闭小乌龟节点启动的节点或者在小乌龟节点的终端使用Ctrl + C来终止,之后使用命令rosrun turtlesim turtlesim_node __name:=myturtle1启动,启动后再次查看node信息:

可以发现,这个节点的名字已经改变了。

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多