ROS入门WIKI学习记录

这篇博客记录了ROS入门的学习过程,包括编译节点、编写C++的服务器和客户端、创建ROS消息和ROS服务,以及录制和回放数据。讲解了如何使用rosbag记录数据子集,创建msg和srv文件,还介绍了roswtf工具的使用。此外,还涵盖了节点的属性、rosed编辑工具以及rosmsg和rossrv命令的使用。
摘要由CSDN通过智能技术生成
20180511

编写订阅器节点

代码解释

  34 void chatterCallback(const std_msgs::String::ConstPtr& msg)
  35 {
  
  36   ROS_INFO("I heard: [%s]", msg->data.c_str());
  37 }
这是一个回调函数,当接收到  chatter  话题的时候就会被调用。消息是以  boost shared_ptr  指针的形式传输,这就意味着你可以存储它而又不需要复制数据。

75   ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);

告诉 master 我们要订阅 chatter 话题上的消息。当有消息发布到这个话题时,ROS 就会调用 chatterCallback() 函数。第二个参数是队列大小,以防我们处理消息的速度不够快,当缓存达到 1000 条消息后,再有新的消息到来就将开始丢弃先前接收的消息。

NodeHandle::subscribe() 返回 ros::Subscriber 对象,你必须让它处于活动状态直到你不再想订阅该消息。当这个对象销毁时,它将自动退订 chatter 话题的消息。

有各种不同的  NodeHandle::subscribe()  函数,允许你指定类的成员函数,甚至是 Boost.Function 对象可以调用的任何数据类型。 roscpp overview  提供了更为详尽的信息。
  82   ros::spin();

ros::spin() 进入自循环,可以尽可能快的调用消息回调函数。如果没有消息到达,它不会占用很多 CPU,所以不用担心。一旦 ros::ok() 返回 false,ros::spin() 就会立刻跳出自循环。这有可能是 ros::shutdown() 被调用,或者是用户按下了 Ctrl-C,使得 master 告诉节点要终止运行。也有可能是节点被人为关闭的。

还有其他的方法进行回调,但在这里我们不涉及。想要了解,可以参考  roscpp_tutorials  package 里的一些 demo 应用。需要更为详尽的信息,可以参考  roscpp overview

编译节点

  20 add_executable(talker src/talker.cpp)
  21 target_link_libraries(talker ${catkin_LIBRARIES})
  22 add_dependencies(talker beginner_tutorials_generate_messages_cpp)
  23 
  24 add_executable(listener src/listener.cpp)
  25 target_link_libraries(listener ${catkin_LIBRARIES})
  26 add_dependencies(listener beginner_tutorials_generate_messages_cpp)

add_executable() 和target_link_libraries(),这会生成两个可执行文件, talker 和 listener, 默认存储到 devel space 目录下,具体是在~/catkin_ws/devel/lib/<package name> 中.

add_dependencies(),为可执行文件添加对生成的消息文件的依赖。这样就可以确保自定义消息的头文件在被使用之前已经被生成。因为 catkin 把所有的 package 并行的编译,所以如果你要使用其他 catkin 工作空间中其他 package 的消息,你同样也需要添加对他们各自生成的消息文件的依赖。当然,如果在 *Groovy* 版本下,你可以使用下边的这个变量来添加对所有必须的文件依赖:

add_dependencies(talker ${catkin_EXPORTED_TARGETS})

你可以直接调用可执行文件,也可以使用 rosrun 来调用他们。他们不会被安装到 <prefix>/bin 路径下,因为那样会改变系统的 PATH 环境变量。如果你确定要将可执行文件安装到该路径下,你需要设置安装位置,请参考 catkin/CMakeLists.txt

如果需要关于 CMakeLists.txt 更详细的信息,请参考 catkin/CMakeLists.txt

现在运行 catkin_make

# In your catkin workspace
$ catkin_make  

注意:如果你是添加了新的 package,你需要通过 --force-cmake 选项告诉 catkin 进行强制编译。参考 catkin/Tutorials/using_a_workspace#With_catkin_make

编写简单的服务器和客户端 (C++)

编写Service节点
这里,我们将创建一个简单的service节点("add_two_ints_server"),该节点将接收到两个整形数字,并返回它们的和。

cd ~/catkin_ws/src/beginner_tutorials
在beginner_tutorials包中创建src/add_two_ints_server.cpp文件。
在beginner_tutorials包中创建src/add_two_ints_client.cpp文件,

  15   ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");

这段代码为add_two_ints service创建一个client。ros::ServiceClient 对象待会用来调用service。??

  16   beginner_tutorials::AddTwoInts srv;
  17   srv.request.a = atoll(argv[1]);
  18   srv.request.b = atoll(argv[2]);
这里,我们实例化一个由ROS编译系统自动生成的service类,并给其request成员赋值。一个service类包含两个成员requestresponse。同时也包括两个类定义RequestResponse
  19   if (client.call(srv))

这段代码是在调用service。由于service的调用是模态过程(调用的时候占用进程阻止其他代码的执行),一旦调用完成,将返回调用结果。如果service调用成功,call()函数将返回true,srv.response里面的值将是合法的值。如果调用失败,call()函数将返回false,srv.response里面的值将是非法的。

编译节点

再来编辑一下beginner_tutorials里面的CMakeLists.txt,文件位于~/catkin_ws/src/beginner_tutorials/CMakeLists.txt,并将下面的代码添加在文件末尾:

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值