了解什么是ROS,为什么要学习ROS
了解ROS的发展历程
了解ROS的系统架构
本实验主要学习以下几方面的内容:
了解ROS系统相关的基础知识
基于ROS系统,建立一个工作空间;
基于ROS系统,建立一个功能包;
基于ROS系统,创建一个节点;
1.所需仪器设备
(1)“卓越之星”设备-用于功能调试;
(2)个人PC-用于应用程序的开发与展示;
2.注意事项
(1)个人PC需要安装NoMachine或者VSCode支持远程编程开发;
(2)运动实验尽可能将设备平放在地面上;
(3)实验开始前确保设备电量为满电,实验完成后关闭设备电源;
机器人是一个系统工程,它涉及机械、电子、控制、通信、软件等诸多学科。以前,开发一个机器人需要花很大的工夫,你需要设计机械、画电路板、写驱动程序、设计通信架构、组装集成、调试,以及编写各种感知决策和控制算法,每一个任务都需要花费大量的时间。因此像电影《钢铁侠》中那样,仅靠一个人的力量造出一个动力超强的人形机器人机甲是不可能的。
然而随着技术进步,机器人产业分工开始走向细致化、多层次化,如今的电机、底盘、激光雷达、摄像头、机械臂等等元器件都有不同厂家专门生产。社会分工加速了机器人行业的发展。而各个部件的集成就需要一个统一的软件平台,在机器人领域,这个平台就是机器人操作系统
ROS。
机器人操作系统(Robot Operating System),一般简称为
ROS,是一个开源的机器人操作系统,一个适用于机器人编程的框架,这个框架把原本松散的零部件耦合在了一起,为他们提供了通信架构。ROS虽然叫做操作系统,但并非
Windows、Mac 那样通常意义的操作系统,它只是连接了操作系统和你开发的
ROS应用程序,所以它也算是一个中间件,基于ROS的应用程序之间建立起了沟通的桥梁,它提供了一系列的工具和库,用于帮助开发者创建机器人应用程序。ROS的目标是使机器人软件开发更加简单、可重用和可扩展。ROS提供了一系列的功能模块,包括硬件抽象、设备驱动、消息传递、3D感知、SLAM、路径规划、控制算法、仿真等,为机器人应用程序的开发提供了强大的支持。ROS中的一些主要功能模块:
这些模块和库构成了ROS的核心功能,使得机器人开发者可以更加容易地开发出高质量的机器人应用程序。
ROS被广泛应用于机器人领域,包括机器人控制、感知、导航、操作、任务规划等方面。ROS的开源特性和丰富的社区支持,使得机器人开发者可以快速地创建出高质量的机器人应用程序,同时也可以与全世界的机器人开发者分享自己的经验和思路。
ROS具有以下特点:
分布式 点对点
ROS采用了分布式的框架,通过点对点的设计让机器人的进程可以分别运行,便于模块化的修改和定制,各个模块之间为松耦合机制,独立存在,不受其他进程影响,提高了系统的容错能力。
多种语言支持
ROS支持多种编程语言。C++、Pyhton 和已经在 ROS 中实现编译,是目前应用最广的ROS开发语言,Lisp、C#、Java等语言的测试库也已经实现,甚至
Matlab等工具也提供了ROS支持。为了支持多语言编程,ROS采用了一种语言中立的接口定义语言来实现各模块之间消息传送。通俗地理解就是,ROS的通信格式和用哪种编程语言来写无关,它使用的是自身定义的一套通信接口。
开源社区
ROS具有一个庞大的社区 ROS WIKI(http://wiki.ros.org/ ),这个网站将会始终伴随着你
ROS开发,无论是查阅功能包的参数、还是搜索问题,都能得到有效的反馈,同时,全世界的ROS开发者也在共同维护并支持着该网站内容,当前使用ROS开发的软件包已经达到数千万个,相关的机器人已经多达上千款。此外,ROS遵从BSD协议,对个人和商业应用及修改完全免费。这也促进了
ROS 的流行。
作为一名机器人开发者,学习 ROS 的好处很多:
ROS 是一个开源的机器人操作系统,拥有强大的社区支持和广泛的用户基础。学习 ROS 可以让你获得更多的机器人开发资源和经验。
ROS 提供了一系列的功能模块和库,包括硬件抽象、设备驱动、消息传递、3D 感知、路径规划、控制算法、仿真等,可以帮助机器人开发者快速地创建出高质量的机器人应用程序。
ROS 支持多种编程语言,包括 C++、Python 等,可以满足不同机器人开发者的需求。
ROS 的消息传递机制和分布式计算能力,使得机器人开发者可以更加方便地进行协作开发和并行计算。
ROS 的模块化设计和可重用性,使得机器人开发者可以更加容易地进行代码复用和模块化开发。
总之,学习 ROS 对于机器人开发者来说是非常重要的,它可以帮助开发者更好地进行机器人软件开发、提高开发效率和代码质量。
本世纪开始,随着人工智能的研究进入了大发展,将智慧赋予机器人的“AI+Robot“概念广泛兴起,在国外涌现了一批优秀的智能机器人项目。例如斯坦福大学人工智能实验室
STAIR(Stanford Artificial Intelligence Robot)项目,该项目组创建了灵活的、动态的软件系统的原型,用于将机器人技术与人工智能技术相结合。
在2007年,机器人公司 Willow Garage 和该项目组合作,他们十分具有前瞻性的,提供了大量资源进一步扩展了这些概念,经过具体的研究测试实现之后,无数的研究人员将他们的专业性研究贡献到
ROS 核心概念和其基础软件包,这期间积累了众多的科学研究成果。ROS 软件的开发自始至终采用开放的 BSD
协议,在机器人技术研究领域逐渐成为一个被广泛使用的平台。
Willow Garage 公司和斯坦福大学人工智能实验室合作以后,在 2009 年初推出了 ROS-0.4,这是一个测试版的
ROS,现在所用的系统框架在这个版本中已经具有了初步的雏形。之后的版本才正式开启了 ROS 的发展成熟之路。ROS-1.0 版本发布于 2010
年,基于 PR2 机器人开发了一系列机器人相关的基础软件包。随后 ROS 版本迭代频繁,目前已经发布到了 Noetic,并在 ROS 基础上发展出了
ROS2。 目前使用人数最多的是 Kinetic 和 Melodic 这两个长期支持版本。
ROS 版本 | 发布时间 | 对应 Ubuntu 版本 |
---|---|---|
Noetic Ninjemys( LTS) | 2020.5 | Ubuntu 20.04 |
Melodic Morenia( LTS) | 2018.5 | Ubuntu 18.04 |
Lunar Loggerhead | 2017.5 | |
Kinetic Kame( LTS) | 2016.5 | Ubuntu 16.04 |
Jade Turtle | 2015.5 | |
Indigo lgloo( LTS) | 2014.7 | Ubuntu 14.04 |
Hydro Medusa | 2013.9 | Ubuntu 12.04 |
Groovy Galapagos | 2012.12 | |
Fuerte Turtle | 2012.4 | |
Electric Emys | 2011.8 | |
Diamondback | 2011.3 | |
C Turtle | 2010.8 | |
Box TurtleBox Turtle | 2010.3 |
ROS 的发展逐渐地趋于成熟,近年来也逐步是跟随着 Ubuntu 发行版的更新而更新,这说明 ROS
已经初步进入一种稳定的发展状态,每年进行一次更新的频率同时还保留着长期支持的版本,这使得 ROS
在稳步的前进发展同时,也有着开拓创新的方向。目前越来越多的机器人、无人机甚至无人车都开始采用 ROS 作为开发平台,尽管 ROS
在实用方面目前还存在一些限制,但前途非常光明。
为了更好地使 ROS 支持机器人开发与应用落地,ROS2 发展了起来,ROS2 的发展历史可以追溯到 2012 年,当时 ROS1
已经成为机器人领域最流行的开源机器人操作系统。然而,ROS1 存在一些问题,例如对实时性的支持不够好,以及对分布式系统的支持有限。为了解决这些问题,ROS2
项目开始启动。ROS2 项目最初由 OSRF(Open Source Robotics Foundation)发起,旨在为机器人开发者提供更好的实时性和分布式计算支持。ROS2
的设计原则与 ROS1 相似,但是采用了一些新的技术和架构,例如 DDS(Data Distribution Service)协议、支持多编程语言的接口、更加灵活的执行环境等。ROS2
的第一个版本于 2015 年发布,当时只支持 Python 和 C++编程语言,并且只能在 Linux 平台上运行。随着时间的推移,ROS2
逐渐成为了机器人领域的热门开源操作系统之一,吸引了全球各地的机器人开发者和公司的关注。
到目前为止,ROS2 已经发布了多个版本,支持多个编程语言和平台,同时也不断完善自己的功能和性能。ROS2
的发展历史表明,它是一个充满活力和创新的开源项目,将为机器人领域的发展做出重要贡献。
ROS1 和 ROS2 有以下几点区别:
实时性支持:ROS1 对实时性的支持不够好,而 ROS2 采用了 DDS 协议,可以提供更好的实时性支持。
多编程语言支持:ROS1 只支持 C++和 Python 编程语言,而 ROS2 支持多种编程语言,包括 C++, Python, JavaScript, Rust 等。
更加灵活的执行环境:ROS1 采用了 roslaunch 工具来启动节点,而 ROS2 可以灵活地选择不同的执行环境,包括命令行、Python
API、launch 文件、docker 容器等。
分布式系统支持:ROS1 对分布式系统的支持有限,而 ROS2 支持多种分布式系统,包括多机器人系统、多机器人集群等。
通信机制:ROS1 采用的是 TCPROS 和 UDPROS 协议,而 ROS2 采用的是 DDS 协议,DDS 协议可以提供更加可靠和高效的通信。
兼容性:ROS2 和 ROS1 不完全兼容,但是 ROS2 提供了一些兼容性工具,可以帮助 ROS1 用户迁移到 ROS2。
总之,ROS2 是 ROS1 的升级版,它在实时性、多编程语言支持、灵活的执行环境、分布式系统和通信机制等方面都有所改进,可以更好地满足现代机器人应用的需求。
学习 ROS 机器人操作系统的步骤如下:
总之,学习 ROS 需要不断地学习和实践。不要害怕犯错,多试多错,不断提高自己的技能。
在文件层面,ROS 则是按照工作空间(catkin_workspace),功能包(package),节点(node)来分级管理的:
在 ROS 的系统架构中,节点是整个系统的基本单元,每个节点都是一个独立的进程,可以理解成为一个程序或 APP,节点之间可以通过 ROS
中间件层进行通信和消息传递,节点是通过工作空间和功能包来进行管理,同时,ROS 还提供了大量的工具和库,如 rviz、gazebo、MoveIt
等,可以方便地进行机器人控制和仿真、机器人路径规划和运动控制、机器人感知和视觉处理等。
应用层面,ROS 的节点主要分为三个层次:
总之,ROS 的系统架构是一个分布式、模块化的系统,通过节点之间的通信和消息传递实现功能的协同。这种架构使得 ROS
具有高度的灵活性和可扩展性,可以应用于各种类型的机器人系统和机器人应用。接下来我们按照由上到下的方式介绍 ROS 文件系统。
在 ROS 中,工作空间(Workspace)是指一个目录,用于存放 ROS 的源代码和编译后的二进制文件。ROS 工作空间可以包含多个 ROS
软件包,每个软件包都是一个独立的模块,可以包含节点、库、消息、服务等。
ROS 工作空间的目录结构如下:
my_workspace/
src/
CMakeLists.txt
package_1/
CMakeLists.txt
package.xml
include/
src/
...
package_2/
CMakeLists.txt
package.xml
include/
src/
...
...
在 ROS 中,需要先创建一个工作空间,然后将需要的 ROS 软件包放入该工作空间下的src目录中,使用catkin_make命令进行编译。编译完成后,ROS
会自动将编译后的二进制文件存放在工作空间下的devel目录中,可以通过设置环境变量$ROS_PACKAGE_PATH来指定 ROS 工作空间的路径。
总之,ROS 工作空间是 ROS 软件包的集合,用于管理 ROS 的源代码和编译后的二进制文件,是 ROS 开发和管理的基础。
在 ROS 中,创建一个新的工作空间可以按照以下步骤进行:
创建一个新目录,作为 ROS 工作空间的根目录,例如:mkdir -p ~/ros_ws/src。
进入src目录,使用 catkin 工具初始化一个新的 ROS 软件包,例如:cd ~/ros_ws/src && catkin_init_workspace。
回到工作空间的根目录,使用 catkin 工具进行编译,例如:cd ~/ros_ws && catkin_make。
环境变量配置:使用source命令激活 ROS 环境变量,例如:source ~/ros_ws/devel/setup.bash。
完成以上步骤后,你就成功创建了一个新的 ROS 工作空间。
需要注意的是,ROS 工作空间的根目录名称可以根据实际需求进行命名,但是 ROS 的源代码必须放在src目录下。
在 ROS 中,软件包(Package)是指一组相关的文件,它们一起实现了某个特定的功能。ROS 软件包通常包含节点、消息、服务、库等,用于完成特定的任务。ROS
软件包的开发和管理是 ROS 开发的基础,下面是一些关于 ROS 软件包的介绍:
软件包的组成:
ROS 软件包通常包含以下组成部分:
src目录:存放 ROS 节点源代码;
msg目录:存放 ROS 消息类型的定义;
srv目录:存放 ROS 服务类型的定义;
action目录:存放 ROS 动作库类型的定义;
launch目录:存放 ROS 启动文件;
CMakeLists.txt文件:ROS 软件包的编译脚本;
package.xml文件:ROS 软件包的元数据信息;
软件包的依赖关系:
ROS 软件包之间可以存在依赖关系,这些依赖关系定义了软件包之间的相互依赖关系。在 ROS
中,软件包的依赖关系定义在package.xml文件中,开发者可以在该文件中指定软件包所依赖的其他软件包及其版本号信息。
软件包的下载和安装:
ROS 社区提供了大量的开源 ROS 软件包,可以通过apt-get命令或者rosdep命令进行下载和安装。此外,开发者也可以在 GitHub
等代码托管平台上下载其他开源 ROS 软件包,并将其添加到自己的 ROS 工作空间中进行使用。
软件包的开发:
ROS 软件包的开发是 ROS 开发的核心内容之一。开发者可以使用 C++、Python 等编程语言进行 ROS
软件包的开发,然后通过catkin_make命令进行编译。编译完成后,ROS 会自动将编译后的二进制文件存放在工作空间下的devel目录中。
在 ROS 中,创建一个新的 ROS 软件包可以按照以下步骤进行:
进入 ROS 工作空间的src目录:cd ~/ros_ws/src。
使用catkin_create_pkg命令创建一个新的 ROS 软件包,例如:
catkin_create_pkg class_1_pkg rospy roscpp
其中,class_1_pkg是软件包的名称,rospy表示该软件包依赖 ROS 的 Python 库,roscpp表示该软件包依赖C++库。此命令将在当前目录下创建一个名为class_1_pkg的
ROS 软件包。
编辑CMakeLists.txt文件:打开CMakeLists.txt文件,可以看到 ROS
已经为新软件包生成了一个初始版本的CMakeLists.txt文件。根据需要,你可以在文件中添加其他编译选项和依赖关系。
编辑package.xml文件:打开package.xml文件,可以看到 ROS 已经为新软件包生成了一个初始版本的package.xml文件。根据需要,你可以在文件中修改软件包的元数据信息和依赖关系。
回到 ROS 工作空间的根目录,使用catkin_make命令进行编译:
cd ~/ros_ws && catkin_make。
激活 ROS 环境变量:
source ~/ros_ws/devel/setup.bash。
至此,你已经成功创建了一个新的 ROS 软件包,并可以在其中添加节点、消息、服务等功能。需要注意的是,如果在软件包中添加了新的节点、消息、服务等功能,需要重新运行catkin_make命令进行编译。
下面是一些可能经常会用到的软件包指令:
查看 ROS 软件包列表:
查看 ROS 软件包的详细信息:
查看 ROS 软件包的依赖关系:
其中,my_package是软件包的名称。
刷新软件包位置:
ROS 中的节点(Node)是指一个执行特定任务的进程,它可以与其他节点进行通信,例如通过发布和订阅消息(Message)来实现节点之间的信息交换。节点可以通过
ROS 命令行工具(例如rosrun)或 ROS launch 文件(例如roslaunch)启动。在 ROS 中,节点通常使用 ROS 客户端库(例如 roscpp 和
rospy)来编写,以便与 ROS 系统和其他节点进行通信和交互。
ROS 中的节点可以具有不同的角色和功能,例如传感器节点、执行器节点、控制节点、导航节点等,它们可以组成复杂的机器人软件系统,并通过
ROS 中的话题(Topic)、服务(Service)和动作(Action)等机制进行交互和协作。节点间的通信是基于 ROS
的分布式通信架构,它可以在机器人系统中实现高效、可靠和灵活的信息交换。
ROS 中的节点是 ROS 可执行的最小单元,一个工作空间含有多个功能包,一个功能包可以含有多个节点。关于 ROS
中如何编程节点,我们会在后续章节中详述。下面是一些节点的常见指令:
在 ROS 中,节点的常见指令包括以下几个方面:
启动节点:使用rosrun命令或roslaunch命令启动节点,例如:
rosrun package_name node_name
roslaunch package_name launch_file_name.launch
查看系统中正在运行的节点:使用rosnode list命令列出所有正在运行的节点,例如:
rosnode list
查看节点的详细信息:使用rosnode info命令查看节点的详细信息,例如:
rosnode info node_name
关闭节点:使用rosnode kill命令关闭指定的节点,例如:
rosnode kill node_name
使用rosnode ping命令测试节点是否在运行,以及使用rosnode monitor命令查看节点的日志消息,例如:
rosnode ping node_name
rosnode monitor node_name
以上是节点的一些常见指令,您可以根据自己的需要使用相应的指令来管理和调试 ROS 节点。
下面的程序是使用C++实现一个ROS节点的源码:
#include "ros/ros.h"
int main(int argc, char **argv) {
//初始化一个ROS节点
ros::init(argc, argv, "c_node");
//打印信息
ROS_INFO("Hello ROS C++ !!!");
//进入主循环
ros::spin();
}
在功能包 src 文件夹增加一个 ros_node.cpp,输入以上代码,上述代码实现了一个名为 c_node 的 ROS
节点,在节点初始化后,我们创建了一个节点句柄n,我们还使用ros::spin()函数循环运行节点。
因为这是我们实现的第一个ROS节点,因此给他取名first_node节点。
要编译上述代码,将以下内容添加到该软件包的CMakeLists.txt文件中:
add_executable(first_node src/ros_node.cpp)
target_link_libraries(first_node ${catkin_LIBRARIES})
然后,在工作空间的根目录中运行以下命令,以编译 ROS 节点:
catkin_make
首先,输入指令启动ROS:
roscore
然后,新打开一个终端中运行以下命令,启动 ROS 节点:
source ~/ros_ws/devel/setup.bash
rosrun class_1_pkg first_node
这样我们就完成了使用 C++对于节点的创建,效果如下图所示:
在使用 C++编译 ROS 节点时,我们必须要填写 CMakeLists.txt 文件,因为 ROS 采用的 CMake 编译系统。
CMake 是一种跨平台的构建系统,可以自动生成 Makefile 或其他构建系统所需的文件。ROS 使用 CMake 作为其默认构建系统,可以方便地构建
ROS 软件包中的程序。
在 ROS 中,CMakeLists.txt文件用于定义如何构建 ROS 软件包中的程序。以下是一些编写 ROS CMakeLists.txt文件的指南:
设置最低 CMake 版本
在CMakeLists.txt文件的开始处,应该设置最低 CMake 版本,以确保您的软件包可以在正确的 CMake 版本上构建。例如,以下代码设置最低
CMake 版本为 2.8:
cmake_minimum_required(VERSION 2.8)
声明要构建的软件包
project(class_1_pkg)
find_package(catkin REQUIRED COMPONENTS roscpp std_msgs)
在CMakeLists.txt文件中,您需要声明要构建的 ROS 软件包及其依赖项。以下代码声明了一个名为my_package的软件包,并由
find_package 宏列出了它所依赖的其他软件包:
添加头文件
如果您的源文件需要包含其他头文件,您可以使用include_directories命令添加这些头文件。例如,以下代码将include目录添加到构建中:
include_directories(include)
添加源文件
在CMakeLists.txt文件中,您需要指定要构建的源文件。以下代码将名为listener.cpp的源文件添加到构建中,listener_node
就是我们可执行文件的名称:
add_executable(listener_node src/listener.cpp)
链接其他库
如果您的程序需要链接其他库,您可以使用target_link_libraries命令来指定这些库。例如,以下代码将my_library库链接到my_program程序中:
add_library(my_library src/my_library.cpp)
add_executable(my_program src/my_program.cpp)
target_link_libraries(my_program my_library)
安装目标文件和其他文件
最后,您需要使用install命令将目标文件和其他文件安装到系统中。例如,以下代码安装名为my_program的程序:
install(TARGETS my_program RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
在上述代码中,RUNTIME DESTINATION指定将目标文件安装到${CATKIN_PACKAGE_BIN_DESTINATION}目录中。
在 ROS 中 packag.xml 同样是 ros 中很重要的文件,它是 ROS 软件包的元数据文件,它包含了有关软件包的重要信息和配置。这个文件的作用非常重要,以下是它的主要作用:
软件包描述:package.xml 文件包含了软件包的基本描述信息,如软件包的名称、版本、维护者和许可证等。这些信息有助于其他开发者或用户了解软件包的基本特性。
依赖关系声明:在 package.xml 中,您可以声明您的 ROS 软件包依赖的其他 ROS 软件包。这些依赖关系告诉 ROS
构建系统在构建您的软件包时需要包含哪些其他软件包。这有助于确保在构建和运行软件包时所有必需的依赖都可用。
编译和构建配置:package.xml 中可以包含有关如何构建软件包的信息。例如,您可以指定 CMake 构建配置选项、编译依赖库等。
导入外部依赖:通过 package.xml,您可以指定需要导入到您的 ROS 软件包中的外部依赖项。这些依赖项可以是 ROS 软件包或其他非
ROS 的依赖库,ROS 构建系统将尝试自动下载和安装这些依赖项。
运行依赖关系声明:类似于构建时的依赖关系,您可以在 package.xml 中声明运行时的依赖关系。这些声明有助于确保在运行时所需的依赖项都可用。
资源文件配置:您可以在 package.xml 中指定软件包中包含的资源文件,例如配置文件、启动文件、数据文件等。这有助于 ROS
工具找到和管理这些资源。
一个可用的 package.xml 文件如下所示:
<?xml version="1.0"?>
<package format="2">
<!--软件包名称-->
<name>class_1_pkg</name>
<!--软件版本-->
<version>0.0.0</version>
<!--软件描述-->
<description>The 博创 package</description>
<!--作者邮箱-->
<maintainer email="sg@163.com">songgang</maintainer>
<!--许可-->
<license>TODO</license>
<!--编译依赖-->
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>message_generation</build_depend>
<build_depend>cv_bridge</build_depend>
<build_depend>image_transport</build_depend>
<build_depend>sensor_msgs</build_depend>
<build_depend>tf2_geometry_msgs</build_depend>
<build_depend>tf2_sensor_msgs</build_depend>
<build_depend>image_geometry</build_depend>
<build_depend>nav_msgs</build_depend>
<build_depend>actionlib</build_depend>
<build_depend>actionlib_msgs</build_depend>
<build_depend>tf</build_depend>
<build_depend>pcl_ros</build_depend>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>rospy</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<!--运行依赖-->
<exec_depend>roscpp</exec_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>message_runtime</exec_depend>
<exec_depend>actionlib</exec_depend>
<exec_depend>actionlib_msgs</exec_depend>
<exec_depend>cv_bridge</exec_depend>
<exec_depend>image_transport</exec_depend>
<exec_depend>nav_msgs</exec_depend>
<exec_depend>image_geometry</exec_depend>
<exec_depend>tf2_geometry_msgs</exec_depend>
<exec_depend>tf2_sensor_msgs</exec_depend>
<exec_depend>tf</exec_depend>
<exec_depend>pcl_ros</exec_depend>
<!-- 其他 -->
<export>
</export>
</package>
总之,package.xml 文件在 ROS 软件包的管理和构建过程中起着关键的作用,它提供了有关软件包的元数据信息、依赖关系、构建和运行配置等重要信息,使得
ROS 系统能够有效地构建、部署和运行软件包。
我们在上面建立的ros功能包中,创建一个 scripts 文件夹,来保存 Python 脚本。
在 scripts 文件夹中,创建一个 Python 文件名为 ros_node.py,在该 py 文件中输入以下代码:
#!/usr/bin/env python3
import rospy
#初始化一个ROS节点
rospy.init_node('py_node', anonymous=True)
#打印消息
print("Hello ROS Python!!!")
#进入ROS主循环
rospy.spin()
上述代码实现了一个名为 py_node 的 ROS 节点,在节点初始化后,我们使用rospy.spin()函数循环运行节点,以便它可以接收和处理来自其他节点的消息,并完成一系列逻辑。
首先使用如下指令赋予该 py 文件可执行权限:
(首先确保终端位于 class_1_pkg 功能包的根目录下,没有就先cd过来)
cd scripts
chmod a+x ros_node.py
使用下面的指令启动节点:
在终端中运行以下命令,启动 ROS 节点:
source ~/ros_ws/devel/setup.bash
rosrun class_1_pkg ros_node.py
终端显示效果如下图所示:
首先打开卓越之星的电源,AI处理器与PC连接到同一个局域网,使用Nomachine或Remote-SSH进入开发模式;
然后打开一个终端,输入roscore,启动ros的master;
在ROS中创建一个工作空间;
在这个工作空间中创建一个功能包;
在功能包内,基于C++实现一个ROS节点;
在功能包内,基于Python实现一个ROS节点;
什么是ROS?它为什么对机器人开发重要?
ROS中的节点(Node)是什么?它们如何通信?
ROS与硬件的接口如何实现?怎样在ROS中集成和使用不同类型的硬件设备?
如何优化ROS系统的性能,以满足实时性和资源限制的要求?
请谈谈你对ROS未来发展的看法,以及你认为ROS在未来机器人技术中的角色是什么?