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.尽量 ...
随机推荐
- Spring-IOC源码解读2.1-BeanDefinition的Resource定位
Spring通过ResourceLoader来处理得到的Resource.在前面我们知道容器初始化是以refresh()方法为入口的,内部的实现首先准备上下文,然后通过obtainFreshBeanF ...
- oracle连接封装方法
public static void updateSqlOracle(String sqlstr,String linkIP,String username,String password) thro ...
- Numpy 布尔型数组
一 给定一个列表,返回大于10的元素. 在python中,有两种方法.一种方法是循环遍历,第二种方法是使用内置函数filter() 在数组中,有更为简单的方法.即布尔型索引 布尔型索引: 将同样大小 ...
- HDU 4771 BFS + 状压
Stealing Harry Potter's Precious Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 ...
- CSV文件导出2
public void exportCSVFile( HttpServletResponse response, ResultSet rs,String fileName,String headers ...
- mysql date_add日期函数的使用
select date_add(CURRENT_DATE()-day(CURRENT_DATE())+1,interval 3 month);##my sql 获取三个月之后的第一天日期select ...
- Spring 定时器 定时访问数据库并发送邮件
我这里有两个案例的方法: 第一种:使用Spring quartz: 我这里使用的jar:spring-context-support.jar.quartz-1.6.5.jar ============ ...
- MySQL与MSSQL的一些语法差异(持续更新中)
分号不能少:分号不能少:分号不能少:重要的事情说3遍 Insert或者Update的数据包含反斜杠\的时候需要进行转义\\,例:insert into tablename(id,name) value ...
- http://www.cnblogs.com/shihaiming/
原文:http://www.bubuko.com/infodetail-917303.html 右击项目,点击Run as,如下图: 即可看到有很多现有的maven命令,点击即可运行,并在控制台可以看 ...
- uibutton去掉点击后背景有阴影的方法
1,将normal和highlight两种方式都设置上图片即可 UIButton *goback = [[UIButton alloc]initWithFrame:CGRectMake(5.0f, 5 ...