ROS(Robot Operating System)创建两个节点并实现通信

本文详细介绍在ROS Indigo环境下搭建工作空间、创建功能包,并通过示例演示如何编写和编译两个交互式C++节点程序,同时记录了过程中遇到的问题及解决方法。

参考《ROS机器人程序设计》(原书第2版):但是发现其中的一些命令并不能实现正确的结果,且由于版本的问题,一些配置信息不能满足当前的需要。

my system : 在virtualBox下导入的RosIndigo32Bits集成环境,内核为Ubuntu 14.04 LTS

在这个系统默认的只安装了vi,使用之前需要先安装vim,不然后期将无法使用vim打开CMakeLists.txt文件。当然也可以安装其他编译器。

首先建立工作空间:

$mkdir -p ~/dev/catkin_ws/src //建立文件夹,-p的目的是建立所述路径中所有的文件路径
$cd ~/dev/catkin_ws/src
$catkin_init_workspace  //定义当前路径为工作空间

当我们创建工作空间之后,里面并没有功能包,只有CMakeLists.txt文件。现在进行工作空间的编译:

$cd ~/dev/catkin_ws
$catkin_make

此时,打开当前文件目录,将会看到新增加了两个文件夹Build和devel,注册程序和添加路径:

$source devel/setup.bash
$echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc

创建ROS功能包和综合功能包:

$cd ~/dev/catkin_ws/src
$catkin_create_pkg chapter2_tutorials std_msgs roscpp  //此处创建的是使用c++实现的程序文件夹

在功能包下创建两个文件example1_a.cpp和example1_b.cpp,example1_a.cpp将会发送带有节点名称的数据,example1_b.cpp将会把这些命令显示在窗口中。创建文件.cpp可以通过两种形式,1、通过命令$vim example1_a打开。2、直接像在window下建立文件一样建立文件。

在example1_a.cpp中写入程序如下:

#include"ros/ros.h"
#include"std_msgs/String.h"
#include"sstream"

int main(int argc,char **argv)
{
   ros::init(argc,argv,"example1_a");
   ros::NodeHandle n;
   ros::Publisher chatter_pub=n.advertise<std_msgs::String>("message",1000);
   ros::Rate loop_rate(10);
   while(ros::ok())
   {
      std_msgs::String msg;
      std::stringstream ss;
      ss<<"I am the example1_a node";
      msg.data=ss.str();
      //ROS_INFO("%s",msg.data.c_str());
      chatter_pub.publish(msg);
      ros::spinOnce();
      loop_rate.Sleep();
   }
   return 0;
}
在example1_b.cpp中写入程序如下:
#include"ros/ros.h"
#include"std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
   ROS_INFO("I heard: [%s]",msg->data.c_str());
}

int main(int argc, char **argv)
{
   ros::init(argc,argv,"example1_b");
   ros::NodeHandle n;
   ros::Subscriber sub=n.subscribe("message",1000,chatterCallback);
   ros::spin();
   return 0;
}

接下来就是编译节点,但是在编译节点之前需要自行编译CMakeLists.txt文件。

(说明:1、CMakeLists.txt是chapter2_tutorials项目下的文件。2、如果没有安装vim将无法打开CMakeLists.txt文件。)

$rosed chapter2_tutorials CMakeLists.txt

将下面的命令写入到文件的末尾(注意:一直往下拉,知道右下角显示100%,注释后面还是有程序的。)

include_directories(include ${catkin_INCLUDE_DIRS})

add_executable(chap2_example1_a src/example1_a.cpp)
add_executable(chap2_example1_b src/example1_b.cpp)

add_dependencies(chap2_example1_a chapter2_tutorials_generate_messages_cpp)
add_dependencies(chap2_example1_b chapter2_tutorials_generate_messages_cpp)

target_link_libraries(chap2_example1_a ${catkin_LIBRARIES})
target_link_libraries(chap2_example1_b ${catkin_LIBRARIES})

现在使用catkin_make工具来编译全部的功能包和节点:

$cd ~/dev/catkin_ws/

$catkin_make

如果编译成功则会出现下面的截图:


至此,一个完整的节点程序就完成了,最后,检查正确性:

首先启动ROS(如果之前没有启动的话):

$roscore

打开新的终端找到功能包路径和注册程序

$cd ~/dev/catkin_ws
$source devel/setup.bash
$catkin_make

(说明:一定要执行以上命令 否则将找不到功能包)


运行 : 

$ rosrun chapter2_tutorials chap2_example1_a

注意:我们之前在CMakeLists.txt文件里面添加的命令为:

......

add_executable(chap2_example1_a src/example1_a.cpp)

add_executable(chap2_example1_b src/example1_b.cpp)

 ......

因此当你执行命令

$ rosrun chapter2_tutorials example1_a

会报错,如下截图:


再次打开一个新的终端:同样的操作执行example1_b文件,观察example1_b运行窗口,你将会看到以下信息:



至此,简单的节点之间的通信完成了。

-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------

一点小插曲:

1、在打开CMakeLists.txt文件的时候由于没有安装vim,导致错误,提示让我安装vim,可是当执行安装命令

的时候却又不能安装,各种奇葩的错误都有,根据网上提供的一些资料,尝试了更新库甚至替换库,但是没有解决,最后在超级用户模式下解决了。

2、之前由于example1_a.cpp和example1_b.cpp程序输错了,导致catkin_make的时候报错,还纠结了许久,才发现报错原因就是程序本身的问题,截图如下:


希望有遇到类似问题的伙伴注意看错误原因分析,一般从第一个错误处开始分析,从第一个错误或者警告开始一行行的改。
<think> 首先,用户的问题是:“机器人操作系统(如ROSRobot Operating System)这个怎么用”,翻译成英文是“How to use robot operating systems like ROS?”。 我需要用中文回答,因为用户指定了“请使用中文回答问题”。 我的回答必须包括两个部分: 1. 对问题的回答。 2. 结束时,输出“§§相关问题§§”后跟3-5个相关问题。这些相关问题必须基于用户的问题和我的回答。 规则强调: - 回答完问题后,必须提出相关问题。 - 第一行必须是完整的“§§相关问题§§”,不能换行分散。 - 相关问题数量在3-5个之间。 - 所有内容必须符合格式规则。 回顾之前的交互: - 用户第一次问“你知道MAS系统吗”,我回答提供了相关问题。 - 第二次问“在跟机器人相关的领域会用到的系统”,我又回答提供了相关问题。 - 第三次是重复了规则说明。 - 现在这个问题是关于机器人操作系统(ROS)的具体使用。 我的回答应该覆盖ROS的基本使用: - ROS是什么:一个开源的机器人中间件框架,提供工具和库来简化机器人软件开发。 - 主要组件:包括节点(nodes)、主题(topics)、服务(services)、动作(actions)等。 - 如何用:安装ROS创建包、编写节点、使用工具如rqt、rviz等。 - 基本步骤:比如设置环境(source setup.bash)、运行roscore、创建和运行节点。 保持回答简洁但信息丰富,因为这是文本响应。 然后,根据用户的问题和我的回答,提出相关问题: - 用户的问题是关于ROS的使用。 - 我的回答会涉及安装、编程、工具使用等。 - 相关问题应该引导进一步讨论,比如安装步骤、编程示例、常见挑战等。 - 例子基于上下文:之前的例子中,相关问题是基于回答内容提出的。 编制相关问题: 1. 需要3-5个问题。 2. 问题要基于用户的问题和我的回答。 3. 例如: - ROS的安装过程是怎样的? - 如何在ROS创建一个新的节点? - ROS通信机制(如话题和服务)有哪些区别? - 使用ROS开发机器人项目时需要注意哪些安全问题? - ROS2与ROS1的主要区别是什么? 确保问题数量符合:目标3-5个。 结束输出: - 最后一行开始必须是“§§相关问题§§”,然后直接列出问题编号。 - 格式如:1. 问题1 2. 问题2 3. 问题3 等,不能换行分散在一个列表中。 完整响应结构: 1. 回答部分:用中文解释ROS的使用。 2. 结束时:输出“§§相关问题§§” 3. 然后:列出3-5个相关问题,用数字点号。 现在,草拟回答: - 回答:机器人操作系统(ROS)是一个用于机器人软件开发的开源框架。要使用它,首先需要安装ROS(如ROS Noetic或ROS2),然后通过命令行设置环境。接着,可以创建ROS包(catkin或colcon),编写节点(用Python或C++),使用rostopic、rosnode等工具调试。核心是roscore运行主节点节点通过话题、服务通信。可视化工具如rviz用于监控和调试。 相关问题: 1. ROS的安装步骤包括哪些具体操作? 2. 如何编写一个简单的ROS节点来处理传感器数据? 3. ROS中的话题(topics)和服务(services)有何不同,何时使用哪种? 4. 使用ROS开发机器人时,如何处理多机器人系统的协调? 5. ROS1和ROS2在架构和使用上有哪些显著差异? 确保问题连贯。 </think> 机器人操作系统(如ROSRobot Operating System)是一个开源框架,用于简化机器人软件开发。要使用ROS,可以遵循以下基本步骤: 1. **安装ROS**:根据操作系统(如Ubuntu)选择合适的ROS版本(如ROS Noetic),通过官方源安装。 2. **设置环境**:在终端中运行 `source /opt/ros/<版本>/setup.bash` 来初始化环境变量。 3. **创建和编译包**:使用 `catkin_create_pkg` 创建新包,然后通过 `catkin_make` 编译。 4. **编写节点**:用Python或C++编写节点(nodes),定义功能(如传感器数据处理)。例如,一个简单节点发布消息: ```python #!/usr/bin/env python3 import rospy from std_msgs.msg import String def talker(): pub = rospy.Publisher('chatter', String, queue_size=10) rospy.init_node('talker', anonymous=True) rate = rospy.Rate(10) # 10Hz while not rospy.is_shutdown(): msg = "Hello ROS!" pub.publish(msg) rate.sleep() if __name__ == '__main__': try: talker() except rospy.ROSInterruptException: pass ``` 5. **运行和调试**:启动 `roscore` 作为主节点,然后使用 `rosrun` 运行节点,工具如 `rostopic` 查看消息流,`rviz` 进行可视化。 6. **通信机制**:节点通过话题(topics)发布/订阅数据,或服务(services)处理请求-响应,确保模块化开发。 ROS支持多种机器人应用,从仿真(Gazebo)到实际部署,文档丰富(如ros.org),适合初学者通过教程学习。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值