目錄
第 1 章 ROS概述與環(huán)境搭建
1.1 ROS簡(jiǎn)介
1.1.1 ROS概念
1.1.2 ROS設(shè)計(jì)目標(biāo)
1.1.3 ROS發(fā)展歷程
1.3 ROS快速體驗(yàn)
1.3.1 HelloWorld實(shí)現(xiàn)簡(jiǎn)介
1.3.2 HelloWorld(C++版)
步驟 1:創(chuàng)建工作空間
步驟 2:創(chuàng)建發(fā)布者節(jié)點(diǎn)
步驟 3:創(chuàng)建訂閱者節(jié)點(diǎn)
步驟4:C++版CMakeLists.txt配置
步驟 5:編譯和運(yùn)行
1.3.3 HelloWorld(Python版)
步驟 1:創(chuàng)建工作空間
步驟 2:創(chuàng)建發(fā)布者節(jié)點(diǎn)
步驟 3:創(chuàng)建訂閱者節(jié)點(diǎn)
步驟4:Python版CMakeLists.txt配置
步驟 5:編譯和運(yùn)行
第 1 章 ROS概述與環(huán)境搭建
1.1 ROS簡(jiǎn)介
ROS(Robot Operating System)是一個(gè)開源的機(jī)器人操作系統(tǒng),旨在為機(jī)器人開發(fā)提供一套強(qiáng)大的工具和框架。它采用分布式計(jì)算模型,允許開發(fā)者構(gòu)建復(fù)雜的機(jī)器人應(yīng)用程序。ROS提供了一系列的庫(kù)、工具和約定,用于簡(jiǎn)化機(jī)器人軟件的開發(fā)、測(cè)試和部署。
1.1.1 ROS概念
- 節(jié)點(diǎn)(Nodes):ROS中的基本執(zhí)行單元,每個(gè)節(jié)點(diǎn)都是一個(gè)獨(dú)立的進(jìn)程,可以執(zhí)行特定的任務(wù)。
- 話題(Topics):節(jié)點(diǎn)通過話題進(jìn)行異步通信,一個(gè)節(jié)點(diǎn)可以發(fā)布消息到話題,其他節(jié)點(diǎn)可以訂閱來(lái)接收消息。
- 服務(wù)(Services):節(jié)點(diǎn)可以提供服務(wù),并在其他節(jié)點(diǎn)請(qǐng)求時(shí)響應(yīng)特定的任務(wù)。
- 參數(shù)(Parameters):ROS節(jié)點(diǎn)可以使用參數(shù)來(lái)存儲(chǔ)配置信息,這些參數(shù)可以在運(yùn)行時(shí)進(jìn)行修改。
1.1.2 ROS設(shè)計(jì)目標(biāo)
ROS的設(shè)計(jì)目標(biāo)著重于以下幾點(diǎn):
- 模塊化:ROS鼓勵(lì)開發(fā)者將系統(tǒng)拆分為多個(gè)模塊,每個(gè)模塊都是一個(gè)獨(dú)立的節(jié)點(diǎn),可以并行開發(fā)和測(cè)試。
- 重用性:ROS支持代碼和功能的重用,這有助于加快開發(fā)速度。
- 工具豐富:ROS提供了一系列的工具,包括可視化工具、調(diào)試工具、仿真工具等,用于開發(fā)和調(diào)試機(jī)器人應(yīng)用程序。
- 分布式計(jì)算:ROS采用分布式計(jì)算模型,允許節(jié)點(diǎn)在不同的計(jì)算機(jī)上運(yùn)行,通過網(wǎng)絡(luò)通信進(jìn)行交互。
1.1.3 ROS發(fā)展歷程
ROS從最初的構(gòu)想逐步發(fā)展為一個(gè)廣泛應(yīng)用的機(jī)器人操作系統(tǒng):
- 初期階段:ROS最早由斯坦福大學(xué)的人工智能實(shí)驗(yàn)室開發(fā),作為一個(gè)實(shí)驗(yàn)性項(xiàng)目。
- 開源發(fā)布:2007年,ROS作為開源項(xiàng)目發(fā)布,逐漸吸引了全球的機(jī)器人開發(fā)者和研究人員。
- 發(fā)展壯大:隨著時(shí)間的推移,ROS不斷增加了新的功能、庫(kù)和工具,廣泛應(yīng)用于各種機(jī)器人領(lǐng)域,如工業(yè)、服務(wù)、農(nóng)業(yè)等。
- 版本迭代:ROS的不同版本(如Kinetic、Melodic、Noetic等)推出,不斷引入新特性,改進(jìn)性能,提高穩(wěn)定性。
1.3 ROS快速體驗(yàn)
在本章中,我們將通過一個(gè)簡(jiǎn)單的HelloWorld例子來(lái)體驗(yàn)ROS的基本功能和流程。我們將分別使用C++和Python來(lái)實(shí)現(xiàn)HelloWorld示例,以展示ROS在不同編程語(yǔ)言下的使用方法。
1.3.1 HelloWorld實(shí)現(xiàn)簡(jiǎn)介
HelloWorld示例是一個(gè)經(jīng)典的起始點(diǎn),它幫助我們了解如何創(chuàng)建ROS節(jié)點(diǎn)、發(fā)布消息到話題以及訂閱話題來(lái)接收消息。我們將創(chuàng)建兩個(gè)節(jié)點(diǎn),一個(gè)發(fā)布者節(jié)點(diǎn)負(fù)責(zé)發(fā)布消息,一個(gè)訂閱者節(jié)點(diǎn)負(fù)責(zé)接收消息。
1.3.2 HelloWorld(C++版)
步驟 1:創(chuàng)建工作空間
首先,在您的工作目錄中創(chuàng)建一個(gè)新的ROS工作空間:
mkdir -p ~/ros_hello_world_ws/src
cd ~/ros_hello_world_ws/src
catkin_init_workspace
cd ..
catkin_make
步驟 2:創(chuàng)建發(fā)布者節(jié)點(diǎn)
在src
文件夾下創(chuàng)建一個(gè)新的包并切換到該包:
cd ~/ros_hello_world_ws/src
catkin_create_pkg hello_world_cpp roscpp std_msgs
在src
文件夾中創(chuàng)建一個(gè)新的C++文件,例如publisher.cpp
,并編寫發(fā)布者節(jié)點(diǎn)的代碼:
#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:創(chuàng)建訂閱者節(jié)點(diǎn)
在同一包中創(chuàng)建另一個(gè)C++文件,例如subscriber.cpp
,并編寫訂閱者節(jié)點(diǎn)的代碼:
#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++版的示例中,假設(shè)您的工作空間位于~/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:編譯和運(yùn)行
回到工作空間的根目錄,編譯工作空間并運(yùn)行發(fā)布者和訂閱者節(jié)點(diǎn):
cd ~/ros_hello_world_ws
catkin_make
source devel/setup.bash
# 啟動(dòng)發(fā)布者節(jié)點(diǎn)
rosrun hello_world_cpp publisher
# 在新的終端中啟動(dòng)訂閱者節(jié)點(diǎn)
rosrun hello_world_cpp subscriber
1.3.3 HelloWorld(Python版)
步驟 1:創(chuàng)建工作空間
同樣,在您的工作目錄中創(chuàng)建一個(gè)新的ROS工作空間(如果您之前沒有創(chuàng)建):
mkdir -p ~/ros_hello_world_ws/src
cd ~/ros_hello_world_ws/src
catkin_init_workspace
cd ..
catkin_make
步驟 2:創(chuàng)建發(fā)布者節(jié)點(diǎn)
在src
文件夾下創(chuàng)建一個(gè)新的包并切換到該包:
cd ~/ros_hello_world_ws/src
catkin_create_pkg hello_world_py rospy std_msgs
在src
文件夾中創(chuàng)建一個(gè)新的Python文件,例如publisher.py
,并編寫發(fā)布者節(jié)點(diǎn)的代碼:
#!/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:創(chuàng)建訂閱者節(jié)點(diǎn)
在同一包中創(chuàng)建另一個(gè)Python文件,例如subscriber.py
,并編寫訂閱者節(jié)點(diǎn)的代碼:
#!/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版的示例中,假設(shè)您的工作空間位于~/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:編譯和運(yùn)行
回到工作空間的根目錄,編譯工作空間并運(yùn)行發(fā)布者和訂閱者節(jié)點(diǎn):
cd ~/ros_hello_world_ws
catkin_make
source devel/setup.bash
# 啟動(dòng)發(fā)布者節(jié)點(diǎn)
rosrun hello_world_py publisher.py
# 在新的終端中啟動(dòng)訂閱者節(jié)點(diǎn)
rosrun hello_world_py subscriber.py
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-641107.html
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-641107.html
到了這里,關(guān)于ROS入門-第 1 章 ROS概述與環(huán)境搭建的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!