ROS学习:roscpp文件编写(初级)

更新时间:2023-06-27 18:47:03 阅读: 评论:0

ROS学习:roscpp⽂件编写(初级)
⼀、前期知识储备
1、创建msg和srv
1.1 msg和srv介绍
msg:msg⽂件是描述ros消息字段的简单⽂本⽂件。它⽤于为不同语⾔的消息⽣成源代码。
srv:srv⽂件描述了⼀个服务。它由两部分组成:请求和响应。
msg⽂件存储在包的msg⽬录中,srv⽂件存储在srv⽬录中。
msg只是简单的⽂本⽂件,每⾏有⼀个字段类型和字段名。可以使⽤的字段类型有:
int8, int16, int32, int64 (plus uint*)
float32, float64
string
time, duration
other msg files
variable-length array[] and fixed-length array[C]
ros中还有⼀种特殊类型:header,header包含ros中常⽤的时间戳和坐标帧信息。您经常会看到msg⽂件的第⼀⾏有头⽂件头。1.2、msg
1.2.1、创建msg
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
上⾯的msg⽂件只包含⼀⾏。当然,您可以通过添加多个元素来创建更复杂的⽂件,每⾏⼀个,如下所⽰:
string first_name
string last_name
uint8 age
uint32 score
1.2.2、修改l和
需要确保msg⽂件变成C++、Python和其他语⾔的源代码。打开l,并确保这两⾏位于其中且未注释。在构建时,我们需要“message_generation”,⽽在运⾏时,我们只需要“message_runtime”。
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
打开,添加以下内容:机电工程技术
message_generation
)
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)
add_message_files(
FILES
Num.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
1.2.3、使⽤msg
以上是创建msg所需要做的。让我们确保ros可以使⽤rosmsg show命令看到它。
$ rosmsg show beginner_tutorials/Num
or
$ rosmsg show Num
1.3、srv
1.3.1、创建srv
srv⽂件和msg⽂件⼀样,只是它们包含两部分:请求和响应。这两部分⽤⼀条“- - -”线隔开。
int64 A
int64 B
---
int64 Sum
1.3.2、修改l和
打开l,并确保这两⾏位于其中且未注释。
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
打开。
message_generation
)
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
.
..)
add_message_files(
高官小说FILES初一拜年祝福语
AddTwoInts.srv
)
1.3.3、使⽤srv
$ rossrv show beginner_tutorials/AddTwoInts
or
党员个人对照检查$ rossrv show AddTwoInts
⼆、编写简单的Publisher 和 Subscriber
1、编写publisher节点
“节点”是ros术语,指连接到ros⽹络的可执⾏⽂件。在这⾥,我们将创建⼀个publisher(“talker”)节点,该节点将持续⼴播消息。创建src/talker.cpp⽂件,并在其中粘贴以下内容:
//ros/ros.h是⼀个⽅便的⼯具,包括使⽤ros系统中最常见的公共部分所需的所有头⽂件。
#include"ros/ros.h"
//包括std_msgs/string消息,它位于std_msgs包中。
#include"std_msgs/String.h"
#include<sstream>
//本教程演⽰如何通过ros系统简单地发送消息
int main(int argc,char**argv)
{
//ros::init()函数需要查看argc和argv,以便能够执⾏命令⾏中提供的任何ros
//参数和名称重新映射。 init()的第三个参数是节点的名称。
ros::init(argc, argv,"talker");
//NodeHandle是与ros系统通信的主要接⼊点。构造的第⼀个NodeHandle将完全
//初始化该节点,⽽销毁的最后⼀个NodeHandle将关闭该节点。
ros::NodeHandle n;
//adverti()函数的作⽤是告诉ros要发布⼀个给定的主题名。这将调⽤对ros主节点
//的调⽤,主节点保存谁正在发布谁正在订阅的注册表。
//执⾏adverti()函数调⽤后,主节点将通知尝试订阅此主题名称的任何节点,然后它们将//与此节点协商对等连接。adverti()函数返回⼀个publisher对象,该对象允许您通过调//⽤publish()发布关于该主题的消息。⼀但返回的发布者对象的所有副本都将被销毁,主题//将⾃动取消通知。
//advertide()的第⼆个参数是⽤于发布消息的消息队列的⼤⼩。如果消息发布的速度⽐我们
//发送它们的速度快,那么这⾥的数字指定在丢弃⼀些消息之前要缓冲多少消息。
ros::Publisher chatter_pub = n.adverti<std_msgs::String>("chatter",1000);
//ros::Rate对象可以允许你指定⾃循环的频率。它会追踪记录⾃上⼀次调⽤Rate::sleep()
//后时间的流逝,并休眠直到⼀个频率周期的时间。在这个例⼦中,我们让它以10hz的频率运⾏。
ros::Rate loop_rate(10);
//我们已经发送了多少消息的计数。这⽤于为每条消息创建唯⼀的字符串。
int count =0;
while(ros::ok())
{
//这是⼀个消息对象。你⽤数据填充它,然后发布它。
std_msgs::String msg;
std::stringstream ss;
ss <<"hello world "<< count;
msg.data = ss.str();
//ROS_INFO和friends是printf/cout的替换。
ROS_INFO("%s", msg.data.c_str());
//publish()函数是发送消息的⽅式。参数是消息对象。此对象的类型必须与作为⼴播
//调⽤的模板参数给定的类型⼀致,正如在上⾯的构造函数中所做的那样。
chatter_pub.publish(msg);
月球的资料//ROS消息回调处理函数。对于这个简单的程序来说是不必要的,因为没有收到任何回调。
ros::spinOnce();
//调⽤ros::Rate对象来休眠⼀段时间以使得发布频率为10hz
loop_rate.sleep();
++count;
}
return0;
}
2、编写Subscriber节点
#include"ros/ros.h"
#include"std_msgs/String.h"
//这是⼀个回调函数,当新消息到达chatter主题时将调⽤它。消息在共享所有权的智能指针
//中传递,这意味着您可以根据需要将其存储起来,⽽不必担⼼它会在您下⾯被删除,也不必
//复制底层数据。
微信网名男生void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
//本教程演⽰如何通过ros系统简单地接收消息。
int main(int argc,char**argv)
{
//ros初始化;
ros::init(argc, argv,"listener");
//创建句柄
ros::NodeHandle n;
//subscribe()函数是告诉ros想要接收关于给定主题的消息。消息被传递到回调函数,
//这⾥为chattercallback。每当新消息到达时,ros将调⽤chattercallback()函数。
/
/subscribe()函数的第⼀个参数是订阅的主题名,第⼆个参数是消息队列的⼤⼩。在这种情
//况下,如果队列达到1000条消息,当新消息到达时,我们将开始丢弃旧消息。
ros::Subscriber sub = n.subscribe("chatter",1000, chatterCallback);
//spin()为ROS消息回调处理函数。spin()进⼊⼀个循环,尽可能快地调⽤消息回调。主程序
//到这⼉就不往下执⾏了。
五排开黑名字ros::spin();
return0;
}
三、编写简单的Service 和 Client
1、编写Service节点
请确保已创建本教程中所需的服务,即创建addtwoints.srv。
/
/AddTwoints.h是创建的srv⽂件⽣成的头⽂件。
#include"ros/ros.h"
#include"beginner_tutorials/AddTwoInts.h"
//此函数提供两个整数相加的服务,它接受srv⽂件中定义的请求和响应类型并返回布尔值。bool add(beginner_tutorials::AddTwoInts::Request  &req,
beginner_tutorials::AddTwoInts::Respon &res)
{
//两个整数相加并存储在响应中。记录有关请求和响应的⼀些信息。最后,服务完成时返回true。  res.sum = req.a + req.b;
ROS_INFO("request: x=%ld, y=%ld",(long int)req.a,(long int)req.b);
ROS_INFO("nding back respon: [%ld]",(long int)res.sum);
return true;
}
int main(int argc,char**argv)
{
ros::init(argc, argv,"add_two_ints_rver");
ros::NodeHandle n;
弩炮ros::ServiceServer rvice = n.advertiService("add_two_ints", add);
ROS_INFO("Ready to add two ints.");
ros::spin();
return0;
}
2、编写Client节点

本文发布于:2023-06-27 18:47:03,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1053217.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:消息   节点   对象   响应   主题   类型   函数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图