目录
第 1 章 ROS概述与环境搭建
1.1 ROS简介
1.1.1 ROS概念
1.1.2 ROS设计目标
1.1.3 ROS发展历程
1.3 ROS快速体验
1.3.1 HelloWorld实现简介
1.3.2 HelloWorld(C++版)
步骤 1:创建工作空间
步骤 2:创建发布者节点
步骤 3:创建订阅者节点
步骤4:C++版CMakeLists.txt配置
步骤 5:编译和运行
1.3.3 HelloWorld(Python版)
步骤 1:创建工作空间
步骤 2:创建发布者节点
步骤 3:创建订阅者节点
步骤4:Python版CMakeLists.txt配置
步骤 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
,并编写发布者节点的代码:
#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
,并编写订阅者节点的代码:
#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文件的配置:
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:编译和运行
回到工作空间的根目录,编译工作空间并运行发布者和订阅者节点:
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工作空间(如果您之前没有创建):
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_py rospy std_msgs
在src
文件夹中创建一个新的Python文件,例如publisher.py
,并编写发布者节点的代码:
#!/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
,并编写订阅者节点的代码:
#!/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文件的配置:
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:编译和运行
回到工作空间的根目录,编译工作空间并运行发布者和订阅者节点:
cd ~/ros_hello_world_ws
catkin_make
source devel/setup.bash
# 启动发布者节点
rosrun hello_world_py publisher.py
# 在新的终端中启动订阅者节点
rosrun hello_world_py subscriber.py