最近开始接触到基于DDS的这个系统,是在稚晖君的机器人项目中了解和认识到。于是便开始自己买书学习起来,感觉挺有意思的,但是只是单纯的看书籍,总会显得枯燥无味,于是自己又开始在网上找了一些视频教程结合书籍一起来看,便让我对ROS系统有了更深的认识和理解。
ROS诞生于2007年的斯坦福大学,这是早期PR2机器人的原型,这个项目很快被一家商业公司Willow Garage看中,类似现在的风险投资一样,他们投了一大笔钱给这群年轻人,PR2机器人在资本的助推下成功诞生。
2010年,随着PR2机器人的发布,其中的软件正式确定了名称,就叫做机器人操作系统,Robot Operating System,简称为ROS。
2014年起,ROS跟随Ubuntu系统,每两年推出一个长期支持版,每个版本支持五年时间,这标志着ROS的成熟,也让ROS加快了普及的步伐。
在2022年5月底,迎来了ROS2第一个长期支持版——ROS2 Humble,ROS2已经成熟,我们也进入了一个全新的ROS2时代。
提高机器人软件复用率,这个目标简单来讲就是不要重新造轮子。
围绕这个核心目标,ROS在自身的设计上也尽量做到了模块化,由通信机制、开发工具、应用功能、生态系统四大部分组成。
ROS全球社区有几个重要网站:
ROS最早的设计目标就是开发这样一款PR2家庭服务机器人,这款机器人绝大部分时间都是独立工作,为了让他具备充足的能力:
它搭载了工作站级别的计算平台和各种先进的通信设备,不用担忧算力不够,有足够的实力支持各种复杂的实时运算和处理;由于是单兵作战,通信绝大部分都自己内部完成,那就可以用有线连接,保证了良好的网络连接,没有丢数据或者黑客入侵的风险;这台机器人最终虽然小批量生产,但是由于高昂的成本和售价,也只能用于学术研究。
随着ROS的普及,应用ROS的机器人类型已经和PR2机器人有了天翻地覆的问题,也并不具备PR2这样的条件,那原本针对PR2设计的软件框架,就会出现一些问题,比如:要在资源有限的嵌入式系统中运行;要在有干扰的地方保证通信的可靠性;要做成产品走向市场,甚至用在自动驾驶汽车和航天机器人上。
类似的问题不断涌现,致使更加适合各种机器人应用的新一代ROS2顺势而生。
其具备以下优势:
ROS2推翻了ROS,全部进行了重构。
DDS其实是物联网中广泛应用的一种通信协议,类似于我们常听说的5G通信一样,DDS是一个国际标准,能够实现该标准的软件系统并不是唯一的,所以我们可以选择多个厂家提供的DDS系统,比如这里的OpenSplice、FastRTPS,还有更多厂家提供的,每一家的性能不同,适用的场景也不同。
不过这就带来一个问题,每个DDS厂家的软件接口肯定是不一样的,如果我们按照某一家的接口写完了程序,想要切换其他厂家的DDS,不是要重新写代码么?这当然不符合ROS提高软件复用率的目标。
为了解决这个问题,ROS2设计了一个ROS Middleware,简称RMW,也就是指定一个标准的接口,比如如何发数据,如何收数据,数据的各种属性如何配置,都定义好了,如果厂家想要接入ROS社区,就得按照这个标准写一个适配的接口,把自家的DDS给移植过来,这样就把问题交给了最熟悉自家DDS的厂商。对于我们这些用户来讲,某一个DDS用的不爽,只要安装另一个,然后做一个简单的配置,程序一行的都不用改,轻松更换底层的通信系统。
总之,DDS的加入,让ROS2系统更加稳定,也更加灵活,当然复杂度也会高一些。这样,我们不用再纠结ROS的通信系统是否稳定、该如何优化等问题,更多精力都可以放在其他三个部分,专注优化我们的机器人应用功能。
主要的核心概念:
目前手上用的是ubuntu20.04版本的PC,因而不是用最新版本的ROS2,但安装的方法都是一摸一样的。
$ sudo apt update && sudo apt install locales
$ sudo locale-gen en_US en_US.UTF-8
$ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
$ export LANG=en_US.UTF-8
$ sudo apt update && sudo apt install curl gnupg lsb-release
$ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
在安装和配置ROS的过程中遇到类似这样的报错:
curl: (7) Failed to connect to raw.githubusercontent.com port 443 after 16 ms: Connection refused
就自己改一下host
sudo vi /etc/hosts
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install ros-foxy-desktop
$ source /opt/ros/foxy/setup.bash
$ echo " source /opt/ros/foxy/setup.bash" >> ~/.bashrc
至此,ROS2就已经在系统中安装好了。
先试试ROS2底层通信系统DDS是否正常
启动第一个终端,通过以下命令启动一个数据的发布者节点:
$ ros2 run demo_nodes_cpp talker
启动第二个终端,通过以下命令启动一个数据的订阅者节点:
$ ros2 run demo_nodes_py listener
看到一直报hello world就说明成功了。
想要运行ROS2中某个节点,我们可以使用ros2 run命令进行操作
ros2 run turtlesim turtlesim_node
查看节点信息
ros2 node list
如果对某一个节点感兴趣,加上一个info子命令
ros2 node info /turtlesim
查看话题信息
ros2 topic list
看到某一个话题中的消息数据,加上echo子命令试一试
ros2 topic echo /turtle1/pose
目前我都是用的vscode,推荐以下插件使用: