ros使用时的注意事项&技巧2
1.查看参数列表 rosparam list
2.查询参数rosparam get parameter_name,如rosparam get /rosdistro
3.设置参数rosparam set parameter_name parameter_value
4.运行turtlesim_node节点,再查看参数列表rosparam list,我们看到
/background_b
/background_g
/background_r
三个参数,将/background_b 设置成255我们没看到变化,这是因为turtlesim_node节点没有加载参数,而加载参数需要运行rosservice call /clear
5.需要引起高度注意的是,更新的参数值不会自动“推送”到节点。恰恰相反,如果节点关心它的一些或者所有参数是否改变,必须明确向参数服务器请求这些参数的值。同样地,如果希望改变某个活跃节点的参数值,我们必须知道该节点如何或是否重新查询参数。
6.使用C++获取参数并赋值
void ros::param::set(parameter_name, input_value);
bool ros::param::get(parameter_name, output_value);
7.服务调用是双向的,一个节点给另一个节点发送信息并等待响应,因此信息流是双向的。作为对比,当消息发布后,并没有响应的概念,甚至不能保证系统内有节点订阅了这些消
息。
8.服务调用的基本流程:
一个客户端(client)节点发送一些称为请求(request)的数据到一个服务器(server)节点,并且等待回应。服务器节点接收到请求后,采取一些行动(计算、配置软件或硬件、改变
自身行为等),然后发送一些称为响应(response)的数据给客户端节点。

9.列出所有服务rosservice list
10.查看某个节点的服务类型 要查看一个特定节点提供的服务,使用 rosnode info 命令:rosnode info node-name,如rosnode info turtlesim
11.查找提供服务的节点rosservice node service-name
12.查找服务的数据类型 rosservice info service-name
13.查看服务数据类型 当服务的数据类型已知时,我们可以使用rossrv 指令来获得此服务数据类型的详情:rossrv show service-data-type-name
14.从命令行调用服务; 为了直观地观察服务是如何工作的,你可以使用下面这条指令,从命令行中调用它们:rosservice call service-name request-content 例如
rosservice call /spawn 3 3 0 Mikey 这条服务调用的效果是在现有仿真器中,位置 ( x , y ) = (3,3) 处创建一个名为“Mikey”的新海龟,其朝向角度 θ = 0 。

15.声明请求和响应的类型 就像消息类型一样每一种服务数据类型都对应一个我们必须包含的相关 C++头文件
16.创建客户端对象 ros::ServiceClient client = node_handle.serviceClient<service_type>(service_name);这条指令有三个重要部分。
node_handle 是常用的 ros::NodeHandle 对象,这里我们将调用它的 serviceClient 方法。
service_type 是我们在上面头文件中定义的服务对象的数据类型,在本例中,类型为 turtlesim::Spawn。
service_name 是一个字符串,说明了我们想要调用的服务名称。再次强调,这应当是一个相对名称,虽然也可以声明为全局名称。例子中使用的是相对名称“spawn”。
17.创建请求和响应对象 一旦有了 ros::ServiceClient 实例,下一步就是创建一个请求对象来容纳送往服务器的数据。我们上面包含的头文件中分别定义了请求和响应的类 ,命名为Request和Response。这些类必须通过功能包名称和服务类型来引用,如下所示:
#include <ros/ros.h>
//The srv class for the service.
#include <turtlesim/Spawn.h>
int main(int argc, char** argv) {
ros::init(argc, argv,"spawn_turtle");
ros::NodeHandle nh ;
// Create a client object for the spawn service . This
// needs to know the data type of the service and its
// name.
ros::ServiceClient spawnClient = nh.serviceClient <turtlesim::Spawn>("spawn") ;
// Create the request and response objects.
turtlesim::Spawn::Request req ;
turtlesim::Spawn::Response resp ;
// Fill in the request data members.
req.x = 2;
req.y = 3;
req.theta = M_PI/2;
req.name = "Pik" ;
// Actually call the service. This won't return until
// the service is complete .
bool success = spawnClient.call(req, resp);
// Check for success and use the response .
if(success) {
ROS_INFO_STREAM("Spawned a turtle named "<< resp.name);
} else {
ROS_ERROR_STREAM("Failed to spawn.") ;
}
}
运行结果:

18.创建一个服务器程序
编写服务的回调函数 如同订阅一样,节点提供的每一个服务必须关联一个回调函数,服务的回调函数原型如下:
bool function_name(
package_name::service_type::Request &req),
package_name::service_type::Response &resp)
) {
...
}
节点每次接收到一个服务请求,ROS 就执行一次回调函数。参数 Request 中包含了来自于客户端的数据。回调函数的工作是给Response 对象的数据成员赋值。 Request 和 Response 数据类型与上面在客户端使用的一致,因此需要相同的头文件和相同的包依赖关系来编译。回调函数返回 true 表明成功,返回 false 则表示失败。
#include <ros/ros.h>
#include <std_srvs/Empty.h>
#include <geometry_msgs/Twist.h>
bool forward = true;
bool toggleForward (std_srvs::Empty::Request &req, std_srvs::Empty::Response &resp) {
forward = !forward;
ROS_INFO_STREAM("Now sending " <<(forward ? "forward" : "rotate") << "commands.");
return true ;
}
int main(int argc, char** argv) {
ros::init(argc, argv, "pubvel_toggle");
ros::NodeHandle nh ;
// Register our service with the master .
ros::ServiceServer server = nh.advertiseService ("toggle_forward", &toggleForward);
// Publish commands, using the latest value for forward ,
// until the node shuts down.
ros::Publisher pub = nh.advertise <geometry_msgs::Twist>("turtle1/cmd_vel", 1000);
ros::Rate rate(2);
while(ros::ok()) {
geometry_msgs::Twist msg;
msg.linear.x = forward ? 1.0 : 0.0;
msg.angular.z = forward ? 0.0 : 1.0;
pub.publish(msg);
ros::spinOnce();
rate.sleep();
}
}
在该例中, Request 和 Response 都使用了 std_srvs/Empty (空字符串)作为其数据类型,因此无需针对这两个对象做任何数据处理。回调函数的唯一工作是切换一个称为 forward 的全局布尔变量,用于管理在主函数中发布的速度消息
为了测试pubvel_toggle样例程序 , 编译它并且启动turtlesim_node和pubvel_toggle两个节点。两者运行的同时,你可以通过从命令行调用 toggle_forward 服务来在平移和转动中反复切换运动控制指令。rosservice call /toggle_forward, 反复执行rosservice call /toggle_forward得到试验结果如下

19.录制包文件 rosbag record -O filename.bag topic-names
20.rosbag record -a 记录当前发布的所有话题的消息。
21.rosbag record -j 启用包文件的压缩
22.回放包文件 rosbag play filename.bag,这里可以加参数,比如-l 代表循环播放 -r 0.5 代表以0.5倍速度播放 -s 10 代表从第10秒播放
23.检查文件包 rosbag info filename.bag
24.ROS的rosbag功能包里面也 提 供了名为record和play的可执行文件。和rosbag record 及rosbag play相比,这些程序有相同的功能,并且接受相同的命令行参数。所以可以
rosrun rosbag record -O filename.bag topic-names
rosrun rosbag play filename.bag
25.<node pkg="rosbag" name="record" type="record" args="-O filename.bag topic-names"/> launch 文件可以这么调用
ros使用时的注意事项&技巧2的更多相关文章
- ros使用时的注意事项&技巧
1.rosrun package-name executable-name 比如 rosrun turtlesim turtlesim_node 2.一旦启动roscore后,便可以运行ROS程序了. ...
- free函数使用时的注意事项。
free函数是我们在写C语言程序时常用的函数,但是使用时需要注意,一不小心很肯能会引起吐核. 注意:free函数与malloc()函数配对使用,malloc函数释放申请的动态内存.对于free(p)这 ...
- time.h文件中包含的几个函数使用时须注意事项
time.h头文件中包含以下函数 char* asctime(const struct tm *tm); char* asctime_r(const struct tm *tm,char *buf); ...
- Python中 "+=" 使用时的注意事项
代码1: >>> l1=range(3) >>> l2=l1 >>> l2+=[4] >>> l1 [0, 1, 2, 4] & ...
- C# 非托管内存使用时的注意事项
调用Marshal.AllocHGlobal必须调用 Marshal.FreeHGlobal(ptr)来手动释放内存,即使调用GC.Collect();方法也无法释放,导致内存泄露!!
- 解决Bootstrap 附加导航(Affix)的问题和使用时若干注意事项
1.要清楚Affix分别赋予的class, 开始:affix-top 达到top参数:affix 达到bottom参数:affix-bottom 2.一定要自定义这些class,否则 插件会默认给你在 ...
- %f使用时的注意事项
1不是所有定义都用int,使用浮点函数需要把int改成float才能正常工作 2保留一位小数时要打入%0.1f,保留两位小数时要打入%0.2f,而不是%0.01f
- webbrowser控件使用时的注意事项
如果HtmlElement内的没有信息,则HtmlElement的OuterText属性值为null:OuterHtml属性值则为相应的html值 如果使用OuterText属性,使用前要判断下.
- MySQL数据库使用时注意事项
MySQL数据库使用时注意事项 建表的角度上 1.合理安排表关系 2.尽量把固定长度的字段放在前面 3.尽量使用char 代替varchar 4.分表:水平分和垂直分 在使用sql语句的时候 1.尽量 ...
随机推荐
- 刷题总结——烽火传递(单调队列+dp)
题目: 题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火 ...
- P1373 小a和uim之大逃离 (动态规划)
题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...
- lua学习随笔
1.1 Chunks 1.2 全局变量 访问一个没有初始化的全局变量也不会出错,只不过的到的结果是nil 如果想删除一个全局变量,只需要将变量赋值为nil 1.3 词法约定 标识符 保留字不能作为 ...
- Bat命令学习 (转载)
基础部分:====================================================================== 一.基础语法: 1.批处理文件是一个“.bat” ...
- msp430项目编程33
msp430中项目---简易示波器系统 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结
- Python入门--8--字符串
一.创建.修改字符串 str1='呆呆 槑槑 木木 林林' str1[1] #输出呆 str1[2] #输出' ',也就是空值 str1=str[:5]+'插入乖呆 '+str1[5:] #修改字符串 ...
- ShareSDK中微信分享错误总结
项目中用到微信分享,可向好友或朋友圈分享链接时,分享人可以打开网站,查看消息者却始终不能打开网站.试了N种方法,重写了N次分享模块,均没办法解决. 在无意中查看分享链接时发现,朋友圈里分享后,原始链接 ...
- 大话Spark(3)-一图深入理解WordCount程序在Spark中的执行过程
本文以WordCount为例, 画图说明spark程序的执行过程 WordCount就是统计一段数据中每个单词出现的次数, 例如hello spark hello you 这段文本中hello出现2次 ...
- ROS下使用ASUS Xtion Pro Live
一.ROS官网hydro版本OpenNI安装 3. Installation 3.1 Ubuntu installation To install only openni_camera: sudo a ...
- 33.Search in sorted Array
/* * 33.Search in sorted Array * 2016-4-19 by Mingyang * 我自己写的代码,开始没有考虑[3,1]取1得情况,所以现在需要额外的加一个部分来 * ...