没有合适的资源?快使用搜索试试~ 我知道了~
机器人操作系统ROS-典型功能代码详解
4星 · 超过85%的资源 需积分: 50 124 下载量 12 浏览量
2017-01-10
20:59:23
上传
评论 3
收藏 707KB DOC 举报
温馨提示
试读
64页
机器人操作系统ROS-典型功能代码详解
资源推荐
资源详情
资源评论
机器人操作系统 ROS: 典型功能代码详解
李宝全
目录
介绍
!"
#
$#
!"$%
&'$%
&(
!"&&
)&
)包 *) 仅有的一个程序&
+,),-&.
,*+&/
,*&#
,*
,* !"/
012314 的发布#
5&4*+系统#
5&4* 系统#
54*+%
54*%
5&4+(
54+$
节点
!"/
14 的接收3并以控制 1 做示范#
14!#
!"%
语音发布%
,'+%
,.&
!".
!".
语言接收3显示再发声.
67)0.
8!".
6.
8!".
1!9:;.
),.
*4+..
*4./
,*<+/$
*4)++/
*4)+/
1!9/%
/%
+/%
#$
1!9,+#.
),,+#.
,+#.
1!9)#/
7,)7"+#/
1)+%(
1
1!9)9%
数据类型%
)<&%
) +%
))%
)=%
))%
)))>>%
,',?,%
)')1%.
)')14%.
系统程序文件%.
-)+%.
*)+ 系统%/
*)$($
!," 系统程序文件$($
,,,"&+$($
2
ROS API 介绍
关于 publisher
1.ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);//创建了一个发布者
2. image_pub_ = it_.advertise("/image_converter/output_video", 1);
3. image_transport::CameraPublisher image_pub_ ;
image_pub_ = it.advertiseCamera("image_raw", 1);
image_pub_.publish((sensor_msgs::Image)img_, (sensor_msgs::CameraInfoPtr)*ci);
关于 advertise 的缓冲区数量, 对于摄像头而言, 缓冲 1 幅图像即可, 试想若缓冲 1000 的话, 当接收图像时接收的是历史图像.
(需要验证???)
但是对于第一行的缓冲区为 1000 的 BaseDemo,listener 还是从最新发布的信息开始读取啊???
关于 subscribe, 订阅者要有一个回调函数, 例如:
image_sub_ = it_.subscribe("/camera/image_raw", 1, &ImageConverter::imageCb, this); //关联了回调函数
// ImageConverter:: 是指该类中的一个函数
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);//创建一个订阅者
// chatterCallback 只是外面的与 main 平级的一个函数
代码相关说明: 程序中含有中文注释时, 也能编译成功。 也能运行!
安装的 hydro,只有。h 文件,cpp 文件没有
Demo
//talker.cpp
#include "ros/ros.h"//ROS的头文件
#include "std_msgs/String.h"//ROS自定义的数据类型String所在的头文件
#include <sstream>//字符串的输入输出流
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");//在名字空间”ros”中的函数init();
//初始化ROS, 是确切说明节点名字的地方, 节点的名字必须唯一, //它允许ROS通过命令行重新命名,
ros::NodeHandle n;//创建了该节点的一个句柄
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);//创建了一个发布者
//尖括号里为发布的数据类型, 即消息Message
//圆括号中”chatter”为发布的话题的名称, 即Topic
//这就使得主机告诉了所有订阅了”chatter”话题的节点, 我们将在这个话题上发布数据
//用到了std_msgs, 对应于在创建包时加入 “std_msgs” 一项////////////////////////////
//第二个参数是发布队列的大小, 它的作用是缓冲. 当我们发布消息很快的时候, 它将能缓冲1000条信息.
//NodeHandle::advertise()将会返回ros::Publisher对象
//也可以写成ros::Publisher chatter_pub; chatter_pub= n.advertise<...>...
ros::Rate loop_rate(10);//一个ros::Rate对象允许user制定循环的频率
//它将会记录从上次调用Rate::sleep()到现在为止的时间, 并且休眠正确的时间
int count = 0;
while (ros::ok())//默认情况下,roscpp将会安装一个SIGINT监听,它使当Ctrl-C按下时,ros::ok()将会返回0.
{
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());//函数ROS_INFO()将相关数据输出到屏幕上
3
//输出结果为: hello world 1; hello world 2; hello world 3; ……
chatter_pub.publish(msg);//将该消息, 即字符串 “hello word xxx”, 发布到话题 “chatter”上
ros::spinOnce();//等待消息发布完成
loop_rate.sleep();//休眠一下, 使程序满足前面所设置的10Hz的要求
++count;
}
return 0;
}
//listener.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg)
//该回调函数的输入参数为std_msgs::String msg, 与发布者中的数据类型保持一致/////////////////
//是否可以不用ConstPtr,因为talker中只是String msg的数据结构, 是不用也可以不用 &
//是不是凡是接受者, 都用ConstPtr??
{
ROS_INFO("I heard: [%s]", msg->data.c_str());//将msg中的信息输出到屏幕上
//输出结果为: I heard: [hello world 1]; I heard: [hello world 2]; I heard: [hello world 3];…
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);//创建一个订阅者
//第一个参数为Topic的名称 “chatter”
//第三个参数为回调函数的名称 //每当在话题上接受到数据, 即调用该回调函数一次
ros::spin();//等到该节点被关闭时,spin()才返回//类似于cvWaitKey()
return 0;
}
//add_two_ints_server.cpp
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
bool add(beginner_tutorials::AddTwoInts::Request &req,
beginner_tutorials::AddTwoInts::Response &res)
{
res.sum = req.a + req.b;
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: [%ld]", (long int)res.sum);
return true;
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_server");
ros::NodeHandle n;
4
ros::ServiceServer service = n.advertiseService("add_two_ints", add);
ROS_INFO("Ready to add two ints.");
ros::spin();//程序一直停留在这,等待客户端的请求. 客户端请求一次,就运行一次add()
//等到该节点被关闭时,spin()才返回
return 0;
}
//add_two_int_client.cpp
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
#include <cstdlib>
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_client");
if (argc != 3)
{
ROS_INFO("usage: add_two_ints_client X Y");
return 1;
}
ros::NodeHandle n;//符号::是指名字空间下的一个数据类型
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
//尖括号里面的, 是指消息的类型.
//Topic话题:圆括号里面的是Topic的名字(节点可以在一个话题上发布消息,同样也可以订阅一个话题来接收消息)
//Message消息: 在一个话题上,发布或订阅时所使用的ROS的数据类型.
beginner_tutorials::AddTwoInts srv;
srv.request.a = atoll(argv[1]);
srv.request.b = atoll(argv[2]);
//request的类型为Request,其下有两个量:a,b
//atoll功能: 把字符串转换成长长整型数
if (client.call(srv))
{
ROS_INFO("Sum: %ld", (long int)srv.response.sum);
}
else
{
ROS_ERROR("Failed to call service add_two_ints");
return 1;
}
return 0;
}
#CmakeList.txt
cmake_minimum_required(VERSION 2.8.3)
project(beginner_tutorials)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
5
剩余63页未读,继续阅读
资源评论
- hqli1262021-07-14有一定的参考价值,散
- 落雁西南2018-12-22全代码,只在应用层做东西感觉没用上
PilviMannis
- 粉丝: 115
- 资源: 25
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功