0×0
写在前面
有关ROS系统的相关知识已经在上一篇文章中进行了阐述,在本篇文章中,将就ROS的进一步搭建方法做阐述。
⚠️:本文中“消息代理”、“主服务器”、“Master Server”是相同的意思,可以互换。
0×1
关于版本选择
目前稳定的ROS系统有三个版本可供选择
我们此处以ROS Melodic Morenia为例进行本地环境的搭建,选用Ubuntu 18.04 LTS。
⚠️:尽管实际的ROS交互并不需要任何的图形化界面,但是为了演示方便,我们此处还是选用带有用户图形界面的Desktop版本。
0×2
本地搭建ROS环境
- 配置apt仓库
使用以下命令启用restricted、universe和multiverse存储库。
这里也可以换成阿狸云的存储库链接,但是必须是包含restricted、universe和multiverse的。
- 配置sources.list
使用以下命令启用ros存储库。
这里给出一些其他的镜像源以供选择:
- 设置GPG密钥
使用以下命令启用GPG密钥。
若多次超时,可以使用如下命令进行替换:
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软件包
使用如下命令更新软件源与软件包
然后安装ROS系统(完整版):包括ROS基本通讯协议包、rqt工具包、rviz工具、机器人通用库、2D/3D模拟器、导航以及2D/3D感知包。
除了完整版我们还可以选择安装非完整版的子包
桌面版(Desktop):包括ROS基本通讯协议包、rqt工具包、rviz工具、机器人通用库
核心版(Core):包括ROS基本通讯协议包
独立版:
例如:
若想知道所有的可安装独立模块,可使用以下命令查询
- 初始化rosdep
接下来因为要与raw.githubusercontent.com交互获取内容以完成初始化动作,因此需要先对host配置进行修改
执行sudo vi /etc/hosts
在最后添加一行151.101.84.133 raw.githubusercontent.com
接下来执行以下命令以完成初始化
🚫:在执行rosdep update时切勿使用sudo。
至此,我们对于ROS环境的安装全部完成。
- 配置环境变量(非必须)
可以使用以下命令来自动的添加环境变量的配置
⚠️:若不进行此步骤,在接下来进行测试操作以及后续构建工程时都需要执行source /opt/ros/melodic/setup.bash来使环境变量生效。
- 安装必要小工具
可以使用以下命令来安装一些工具以方便我们后续构建项目。
0×3
测试小乌龟项目
- 启动Master Server
首先,若还记得之前在”物联网协议——MQTT与ROS”一文中提到的消息代理的概念,对于ROS系统,不论是使用了哪种消息模式都需要启动一个消息代理用于将消息分发到合适的消息接收端。
那么,我们需要使用roscore启动一个主服务器以充当master server。
这里我们做以下几点补充说明:
- roscore会默认将计算机名作为主服务器的host,此时,ROS系统仅能用于本地测试。
- 可以使用环境变量来控制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)
如果不使用&标志符限定,默认此服务将会在前台运行,在进行接下来的测试时请务必不要关闭一开始的窗口。
- 启动node观察器
现在我们可以使用rosnode这个小工具来查看目前的ROS系统中存在哪些节点
这个节点就是由消息代理启动的一个用于管理消息发送接收的节点,正如之前说过的,ROS系统与MQTT不同,他是一个高度集成的系统,同时支持两种消息模式。那么,/rosout事实上就拥有了三种属性:
发布者:/rosout可以作为发布者,向其他若干节点发布消息,用于具有多播特性的Pub-Sub mode。
服务者:/rosout可以作为服务端,提供若干服务以供其他节点发起调用,用于具有单播特性的CS mode。
⚠️:在ROS系统中,为了最高效的利用资源,当我们启动一个新节点时,默认策略会使得主服务器随机选择一个可用端口进行节点绑定,当有其他节点想要链接此节点时只需要向消息代理询问即可,这个策略尽管实现了空间解耦,但是阻碍了我们利用ROS系统进行CTF竞赛的命题,因为无法动态的进行docker的端口映射,如果有读者可以解决此问题,请在本文评论区发布评论,笔者在此感激不尽。
- 启动小乌龟节点【需要桌面环境】
接下来我们使用rosrun turtlesim turtlesim_node命令启动小乌龟节点
此时或许可以发现,每次启动小乌龟节点时,小乌龟的皮肤都不相同,我们重新使用rosnode命令观察节点
我们可以发现以下几点:
- /turtlesim同样提供了若干话题以及若干服务。
那么,如果我们不想用/turtlesim这个节点名,ROS系统事实上提供了自定义节点名称的参数。
首先关闭小乌龟节点启动的节点或者在小乌龟节点的终端使用Ctrl + C来终止,之后使用命令rosrun turtlesim turtlesim_node __name:=myturtle1启动,启动后再次查看node信息:
可以发现,这个节点的名字已经改变了。
- 结尾 -
【技术分享】堆中index溢出类漏洞利用思路总结
【技术分享】非PE恶意代码分析之Gorgon组合拳
【技术分享】谈谈Office Moniker类漏洞和公式编辑器类漏洞
戳“阅读原文”查看更多内容返回搜狐,查看更多