ROS入门教程(二) 用C++ 实现Hello world

news/2024/10/22 18:30:39/

代码在git

link
Hello world实现流程
无论是C++还是Python其他编程语言,实现流程都是大同小异:

创建工作空间 → 创建功能包 → 编辑源文件 → 编辑配置文件 → 编译并执行

step1.创建工作空间

Ctrl+Alt+T打开终端分别输入:【在主目录下创建工作空间】

mkdir -p helloworld_ws/src
cd helloworld_ws
catkin_make

其中helloworld_ws为我们命名的工作空间名称,catkin_make是一个编译命令,该编译命令会帮我们创建好我们所需的文件并输出若干日志,成功结果如下:

step2.创建功能包

继续在该终端输入:【在工作空间的src文件中创建功能包】

cd src
catkin_create_pkg helloworld roscpp rospy std_msgs

其中helloworld为我们的功能包名称,roscpp 、rospy和std_msgs为添加的依赖,这些依赖是我们在ROS中运行程序最基本的一些依赖,成功结果如下:【低版本的ROS中message依赖可能为ros_msgs】

step3.编辑源文件

继续在终端输入:【在功能包中创建源文件】

cd helloworld/src
gedit Hello_pub.cpp

在空白文档中输入:【Hello world!】

/*需求: 实现基本的话题通信,一方发布数据,一方接收数据,实现的关键点:1.发送方2.接收方3.数据(此处为普通文本)PS: 二者需要设置相同的话题消息发布方:循环发布信息:HelloWorld 后缀数字编号实现流程:1.包含头文件 2.初始化 ROS 节点:命名(唯一)3.实例化 ROS 句柄4.实例化 发布者 对象5.组织被发布的数据,并编写逻辑发布数据*/
// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>int main(int argc, char  *argv[])
{   //设置编码setlocale(LC_ALL,"");//2.初始化 ROS 节点:命名(唯一)// 参数1和参数2 后期为节点传值会使用// 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一ros::init(argc,argv,"talker");//3.实例化 ROS 句柄ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能//4.实例化 发布者 对象//泛型: 发布的消息类型//参数1: 要发布到的话题//参数2: 队列中最大保存的消息数,超出此阀值时,先进的先销毁(时间早的先销毁)ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);//5.组织被发布的数据,并编写逻辑发布数据//数据(动态组织)std_msgs::String msg;// msg.data = "你好啊!!!";std::string msg_front = "Hello 你好!"; //消息前缀int count = 0; //消息计数器//逻辑(一秒10次)ros::Rate r(1);//节点不死while (ros::ok()){//使用 stringstream 拼接字符串与编号std::stringstream ss;ss << msg_front << count;msg.data = ss.str();//发布消息pub.publish(msg);//加入调试,打印发送的消息ROS_INFO("发送的消息:%s",msg.data.c_str());//根据前面制定的发送贫频率自动休眠 休眠时间 = 1/频率;r.sleep();count++;//循环结束前,让 count 自增//暂无应用ros::spinOnce();}return 0;
}
cd helloworld/src
gedit Hello_sub.cpp
/*需求: 实现基本的话题通信,一方发布数据,一方接收数据,实现的关键点:1.发送方2.接收方3.数据(此处为普通文本)消息订阅方:订阅话题并打印接收到的消息实现流程:1.包含头文件 2.初始化 ROS 节点:命名(唯一)3.实例化 ROS 句柄4.实例化 订阅者 对象5.处理订阅的消息(回调函数)6.设置循环调用回调函数*/
// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h"void doMsg(const std_msgs::String::ConstPtr& msg_p){ROS_INFO("我听见:%s",msg_p->data.c_str());// ROS_INFO("我听见:%s",(*msg_p).data.c_str());
}
int main(int argc, char  *argv[])
{setlocale(LC_ALL,"");//2.初始化 ROS 节点:命名(唯一)ros::init(argc,argv,"listener");//3.实例化 ROS 句柄ros::NodeHandle nh;//4.实例化 订阅者 对象ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);//5.处理订阅的消息(回调函数)//     6.设置循环调用回调函数ros::spin();//循环读取接收的数据,并调用回调函数处理return 0;
}
step4.编辑配置文件

打开helloworld功能包中的CMakeLists.txt【helloworld_ws/src/helloword/CMakeLists.txt】

add_executable(Hello_pubsrc/Hello_pub.cpp
)
add_executable(Hello_subsrc/Hello_sub.cpp
)target_link_libraries(Hello_pub${catkin_LIBRARIES}
)
target_link_libraries(Hello_sub${catkin_LIBRARIES}
)

step5.编译并执行

新打开一个输入:【启动ros核心】

roscore

重新打开另一个终端输入:【在工作空间中编译并执行】

cd ~/helloworld_ws
catkin_make
source ./devel/setup.bash
rosrun helloworld Hello_pub 

其中,source命令为修改环境变量,helloworld为功能包名称,hello为映射变量名称,成功结果如下:

再重新打开另一个终端输入:【在工作空间中编译并执行】

cd ~/helloworld_ws
catkin_make
source ./devel/setup.bash
rosrun helloworld Hello_sub 

在这里插入图片描述


http://www.ppmy.cn/news/39311.html

相关文章

最佳实践:千巡翼Q30+机载LiDAR在水域三维数据采集中的应用

机载LiDAR是近年来兴起的获取高精度地理信息数据的重要手段&#xff0c;具有成果精度高、数据生成快、植被穿透强等特点&#xff0c;日益受到作业单位的青睐。2022年7月份&#xff0c;千寻位置数字网格合作伙伴携千巡翼Q30复合翼无人机、QX-1845R机载LiDAR赴山东泰安某流域进行…

HTML5 <form> 标签

HTML5 <form> 标签 实例 带有两个输入字段和一个提交按钮的 HTML 表单&#xff1a; <form action"demo_form.php" method"get">First name: <input type"text" name"fname"><br>Last name: <input type&qu…

C++ Primer第五版_第十一章习题答案(11~20)

文章目录练习11.11练习11.12练习11.13练习11.14练习11.15练习11.16练习11.17练习11.18练习11.19练习11.20练习11.11 不使用decltype 重新定义 bookstore。 using Less bool (*)(Sales_data const&, Sales_data const&); std::multiset<Sales_data, Less> bookst…

AtCoder Regular Contest 159(A)

A 题目大意&#xff1a; 给你一个nn的矩阵&#xff0c;矩阵中只有0和1&#xff0c;然后给的k是可以复制2 k^ kk 个所给的nn矩阵。算最短路&#xff08;0为没路&#xff0c;1为边权为1的路。 思路&#xff1a; n很小&#xff0c;k很大&#xff0c;复制2k^kk个肯定做不到&#xf…

【运维】nginx的安装、配置,支持tls1.2,1.3,以及限流、降级等

以下是 CentOS 上安装、配置和优化 Nginx&#xff0c;支持 TLS 1.2 和 1.3&#xff0c;以及限流和降级的步骤&#xff1a; 安装 Nginx&#xff1a; sudo yum install nginx配置 TLS 1.2 和 1.3&#xff1a; 编辑 /etc/nginx/nginx.conf 文件&#xff0c;在 http 部分下添加以…

关于信号源有哪些参数与功能(二)

在上期文章中&#xff0c;我们介绍了信号发生器的频率范围、相位噪声、频率分辨率、频率切换速度和输出功率范围五大功能&#xff0c;本期文章将继续介绍另外五大关键功能。 谐波 谐波是信号产生的自然结果&#xff0c;对于所有类型的信号发生器来说都是不可避免的。第二次、第…

c和c++区别

在很大程度上&#xff0c;C是C的超集&#xff0c;这意味着一个有效的C程序也是一个有效的C程序。 C和C的主要区别是&#xff0c;C支持许多附加特性。但是&#xff0c;C中有许多规则与C稍有不同。这些不同使得C程序作为C程序编译时可能以不同的方式运行或根本不能运行。 本节着重…

华为OD机试-最佳对手-2022Q4 A卷-Py/Java/JS

游戏里面&#xff0c;队伍通过匹配实力相近的对手进行对战。但是如果匹配的队伍实力相差太大&#xff0c;对于双方游戏体验都不会太好。 给定n个队伍的实力值&#xff0c;对其进行两两实力匹配&#xff0c;两支队伍实例差距在允许的最大差距d内&#xff0c;则可以匹配。要求在匹…