ROS入门-第 1 章 ROS概述与环境搭建

目录

[第 1 章 ROS概述与环境搭建](#第 1 章 ROS概述与环境搭建)

[1.1 ROS简介](#1.1 ROS简介)

[1.1.1 ROS概念](#1.1.1 ROS概念)

[1.1.2 ROS设计目标](#1.1.2 ROS设计目标)

[1.1.3 ROS发展历程](#1.1.3 ROS发展历程)

[1.3 ROS快速体验](#1.3 ROS快速体验)

[1.3.1 HelloWorld实现简介](#1.3.1 HelloWorld实现简介)

[1.3.2 HelloWorld(C++版)](#1.3.2 HelloWorld(C++版))

[步骤 1:创建工作空间](#步骤 1:创建工作空间)

[步骤 2:创建发布者节点](#步骤 2:创建发布者节点)

[步骤 3:创建订阅者节点](#步骤 3:创建订阅者节点)

步骤4:C++版CMakeLists.txt配置

[步骤 5:编译和运行](#步骤 5:编译和运行)

[1.3.3 HelloWorld(Python版)](#1.3.3 HelloWorld(Python版))

[步骤 1:创建工作空间](#步骤 1:创建工作空间)

[步骤 2:创建发布者节点](#步骤 2:创建发布者节点)

[步骤 3:创建订阅者节点](#步骤 3:创建订阅者节点)

步骤4:Python版CMakeLists.txt配置

[步骤 5:编译和运行](#步骤 5:编译和运行)


第 1 章 ROS概述与环境搭建

1.1 ROS简介

ROS(Robot Operating System)是一个开源的机器人操作系统,旨在为机器人开发提供一套强大的工具和框架。它采用分布式计算模型,允许开发者构建复杂的机器人应用程序。ROS提供了一系列的库、工具和约定,用于简化机器人软件的开发、测试和部署。

1.1.1 ROS概念

  • 节点(Nodes):ROS中的基本执行单元,每个节点都是一个独立的进程,可以执行特定的任务。
  • 话题(Topics):节点通过话题进行异步通信,一个节点可以发布消息到话题,其他节点可以订阅来接收消息。
  • 服务(Services):节点可以提供服务,并在其他节点请求时响应特定的任务。
  • 参数(Parameters):ROS节点可以使用参数来存储配置信息,这些参数可以在运行时进行修改。

1.1.2 ROS设计目标

ROS的设计目标着重于以下几点:

  • 模块化:ROS鼓励开发者将系统拆分为多个模块,每个模块都是一个独立的节点,可以并行开发和测试。
  • 重用性:ROS支持代码和功能的重用,这有助于加快开发速度。
  • 工具丰富:ROS提供了一系列的工具,包括可视化工具、调试工具、仿真工具等,用于开发和调试机器人应用程序。
  • 分布式计算:ROS采用分布式计算模型,允许节点在不同的计算机上运行,通过网络通信进行交互。

1.1.3 ROS发展历程

ROS从最初的构想逐步发展为一个广泛应用的机器人操作系统:

  • 初期阶段:ROS最早由斯坦福大学的人工智能实验室开发,作为一个实验性项目。
  • 开源发布:2007年,ROS作为开源项目发布,逐渐吸引了全球的机器人开发者和研究人员。
  • 发展壮大:随着时间的推移,ROS不断增加了新的功能、库和工具,广泛应用于各种机器人领域,如工业、服务、农业等。
  • 版本迭代:ROS的不同版本(如Kinetic、Melodic、Noetic等)推出,不断引入新特性,改进性能,提高稳定性。

1.3 ROS快速体验

在本章中,我们将通过一个简单的HelloWorld例子来体验ROS的基本功能和流程。我们将分别使用C++和Python来实现HelloWorld示例,以展示ROS在不同编程语言下的使用方法。

1.3.1 HelloWorld实现简介

HelloWorld示例是一个经典的起始点,它帮助我们了解如何创建ROS节点、发布消息到话题以及订阅话题来接收消息。我们将创建两个节点,一个发布者节点负责发布消息,一个订阅者节点负责接收消息。

1.3.2 HelloWorld(C++版)

步骤 1:创建工作空间

首先,在您的工作目录中创建一个新的ROS工作空间:

mkdir -p ~/ros_hello_world_ws/src
cd ~/ros_hello_world_ws/src
catkin_init_workspace
cd ..
catkin_make

步骤 2:创建发布者节点

src文件夹下创建一个新的包并切换到该包:

cd ~/ros_hello_world_ws/src
catkin_create_pkg hello_world_cpp roscpp std_msgs

src文件夹中创建一个新的C++文件,例如publisher.cpp,并编写发布者节点的代码:

cpp 复制代码
#include <ros/ros.h>
#include <std_msgs/String.h>

int main(int argc, char **argv) {
    ros::init(argc, argv, "hello_world_cpp_publisher");
    ros::NodeHandle nh;
    ros::Publisher pub = nh.advertise<std_msgs::String>("hello_topic", 10);

    ros::Rate rate(1);

    while (ros::ok()) {
        std_msgs::String msg;
        msg.data = "Hello, ROS from C++!";
        pub.publish(msg);

        ros::spinOnce();
        rate.sleep();
    }

    return 0;
}

步骤 3:创建订阅者节点

在同一包中创建另一个C++文件,例如subscriber.cpp,并编写订阅者节点的代码:

cpp 复制代码
#include <ros/ros.h>
#include <std_msgs/String.h>

void messageCallback(const std_msgs::String::ConstPtr &msg) {
    ROS_INFO("Received: %s", msg->data.c_str());
}

int main(int argc, char **argv) {
    ros::init(argc, argv, "hello_world_cpp_subscriber");
    ros::NodeHandle nh;
    ros::Subscriber sub = nh.subscribe("hello_topic", 10, messageCallback);

    ros::spin();

    return 0;
}

步骤4:C++版CMakeLists.txt配置

在C++版的示例中,假设您的工作空间位于~/ros_hello_world_ws,ROS软件包的名称是hello_world_cpp。以下是CMakeLists.txt文件的配置:

python 复制代码
cmake_minimum_required(VERSION 2.8.3)
project(hello_world_cpp)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)

catkin_package(
  CATKIN_DEPENDS roscpp std_msgs
)

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

add_executable(publisher_node src/publisher.cpp)
target_link_libraries(publisher_node ${catkin_LIBRARIES})

add_executable(subscriber_node src/subscriber.cpp)
target_link_libraries(subscriber_node ${catkin_LIBRARIES})

步骤 5:编译和运行

回到工作空间的根目录,编译工作空间并运行发布者和订阅者节点:

cpp 复制代码
cd ~/ros_hello_world_ws
catkin_make
source devel/setup.bash

# 启动发布者节点
rosrun hello_world_cpp publisher

# 在新的终端中启动订阅者节点
rosrun hello_world_cpp subscriber

1.3.3 HelloWorld(Python版)

步骤 1:创建工作空间

同样,在您的工作目录中创建一个新的ROS工作空间(如果您之前没有创建):

cpp 复制代码
mkdir -p ~/ros_hello_world_ws/src
cd ~/ros_hello_world_ws/src
catkin_init_workspace
cd ..
catkin_make

步骤 2:创建发布者节点

src文件夹下创建一个新的包并切换到该包:

cpp 复制代码
cd ~/ros_hello_world_ws/src
catkin_create_pkg hello_world_py rospy std_msgs

src文件夹中创建一个新的Python文件,例如publisher.py,并编写发布者节点的代码:

python 复制代码
#!/usr/bin/env python

import rospy
from std_msgs.msg import String

def publisher():
    pub = rospy.Publisher('hello_topic', String, queue_size=10)
    rospy.init_node('hello_world_py_publisher', anonymous=True)
    rate = rospy.Rate(1)

    while not rospy.is_shutdown():
        msg = "Hello, ROS from Python!"
        rospy.loginfo(msg)
        pub.publish(msg)
        rate.sleep()

if __name__ == '__main__':
    try:
        publisher()
    except rospy.ROSInterruptException:
        pass

步骤 3:创建订阅者节点

在同一包中创建另一个Python文件,例如subscriber.py,并编写订阅者节点的代码:

python 复制代码
#!/usr/bin/env python

import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo("Received: %s", data.data)

def subscriber():
    rospy.init_node('hello_world_py_subscriber', anonymous=True)
    rospy.Subscriber('hello_topic', String, callback)
    rospy.spin()

if __name__ == '__main__':
    subscriber()

步骤4:Python版CMakeLists.txt配置

在Python版的示例中,假设您的工作空间位于~/ros_hello_world_ws,ROS软件包的名称是hello_world_py。以下是CMakeLists.txt文件的配置:

python 复制代码
cmake_minimum_required(VERSION 2.8.3)
project(hello_world_py)

find_package(catkin REQUIRED COMPONENTS
  rospy
  std_msgs
)

catkin_package(
  CATKIN_DEPENDS rospy std_msgs
)

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

catkin_install_python(PROGRAMS
  scripts/publisher.py
  scripts/subscriber.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

步骤 5:编译和运行

回到工作空间的根目录,编译工作空间并运行发布者和订阅者节点:

python 复制代码
cd ~/ros_hello_world_ws
catkin_make
source devel/setup.bash

# 启动发布者节点
rosrun hello_world_py publisher.py

# 在新的终端中启动订阅者节点
rosrun hello_world_py subscriber.py
相关推荐
ephemerals__1 分钟前
【c++】动态内存管理
开发语言·c++
CVer儿11 分钟前
条件编译代码记录
开发语言·c++
凌不了云15 分钟前
windows环境下安装python第三方包
开发语言·python
大熊程序猿16 分钟前
python 读取excel数据存储到mysql
数据库·python·mysql
生椰拿铁You19 分钟前
Python
python
鸽芷咕21 分钟前
【Python报错已解决】python setup.py bdist_wheel did not run successfully.
开发语言·python·机器学习·bug
程序猿练习生37 分钟前
C++速通LeetCode简单第18题-杨辉三角(全网唯一递归法)
c++·算法·leetcode
汉字萌萌哒41 分钟前
【2022 CCF 非专业级别软件能力认证第一轮(CSP-J1)入门级 C++语言试题及解析】
数据结构·c++·算法
th新港43 分钟前
CCF201909_1
数据结构·c++·算法·ccf
意如流水任东西43 分钟前
[C++]类和对象(上)
开发语言·c++