ROS中nodelet的使用 - maohaihua/ros_study GitHub Wiki
https://blog.csdn.net/zyh821351004/article/details/52143309
ROS的数据通信是以XML-RPC的方式,在graph结构中以topic,service和param的方式传输数据,天生的数据交互存在一定的延时和阻塞。Nodelet 包就是改善这一状况设计的, 使得多个算法运行在同一个过程中,并且算法间数据传输无需拷贝就可实现。 详见http://wiki.ros.org/nodelet。 简单的讲就是可以将以前启动的多个node捆绑在一起manager,使得同一个manager里面的topic的数据传输更快,数据通讯中roscpp采用boost shared pointer方式进行publish调用,实现zero copy。
- 特点
1,1 nodelets间数据传输zero copy,有效避免数据copy和网络传输代价 1.2 支持pulgin的方式动态加载 1.3 使用C++ ROS的接口方式
-
nodelet 基类 2.1 定义基类nodelet::Nodelet, 任何nodelet继承自它可以使用plugin的方式动态加载。 2.2 提供命名空间,参数可remap 2.3 nodelet的manager的过程可以加载更多的nodelets. 同一个manager过程的nodelet数据传输zero copy .
-
基本使用
参数的使用方式详见代码: https://github.com/ros/nodelet_core/blob/indigo-devel/nodelet/src/nodelet.cpp 参数解析 + nodelet::Loader / NodeletInterface
nodelet load pkg/Type manager - Launch a nodelet of type pkg/Type on manager manager //向manager中loader nodelet nodelet standalone pkg/Type - Launch a nodelet of type pkg/Type in a standalone node //程序复用,相当启动一个普通node nodelet unload name manager - Unload a nodelet a nodelet by name from manager //从manager移除nodelet nodelet manager - Launch a nodelet manager node //创建mananger
- 例程 (改自https://github.com/ros/common_tutorials/blob/hydro-devel/nodelet_tutorial_math/src/plus.cpp) 4.1 cmakeLists
cmake_minimum_required(VERSION 2.8.3) project(nodelet_test_pkg)
find_package(catkin REQUIRED COMPONENTS nodelet roscpp std_msgs)#
include_directories(${catkin_INCLUDE_DIRS})
catkin_package( )
add_library(nodelet_test_lib plus.cpp) target_link_libraries(nodelet_test_lib ${catkin_LIBRARIES}) 4.2 package
nodelet_test_pkg 0.0.0 Nodelet test. kint zhao BSD<buildtool_depend>catkin</buildtool_depend>
<build_depend>nodelet</build_depend> <build_depend>roscpp</build_depend> <build_depend>std_msgs</build_depend>
<run_depend>nodelet</run_depend> <run_depend>roscpp</run_depend> <run_depend>std_msgs</run_depend>
4.3 pulgin
A node to add a value and republish. 注:Library path 是相对位置。 说明参考:http://wiki.ros.org/pluginlib/PluginDescriptionFilepluginlib/ Tutorials/ Writing and Using a Simple Plugin 4.4 launch
4.5 cpp#include <pluginlib/class_list_macros.h> #include <nodelet/nodelet.h> #include <ros/ros.h> #include <std_msgs/Float64.h> #include <stdio.h>
#include <math.h> //fabs
namespace nodelet_ns {
class Plus : public nodelet::Nodelet { public: Plus() : value_(0) {}
private: virtual void onInit() { ros::NodeHandle& private_nh = getPrivateNodeHandle(); private_nh.getParam("value", value_); pub = private_nh.advertise<std_msgs::Float64>("out", 10); sub = private_nh.subscribe("in", 10, &Plus::callback, this); }
void callback(const std_msgs::Float64::ConstPtr& input) { std_msgs::Float64Ptr output(new std_msgs::Float64()); output->data = input->data + value_; NODELET_DEBUG("Adding %f to get %f", value_, output->data); pub.publish(output); }
ros::Publisher pub; ros::Subscriber sub; double value_; };
PLUGINLIB_DECLARE_CLASS(nodelet_ns, Plus, nodelet_ns::Plus, nodelet::Nodelet);//******* }
4.6 rqt_graph 从graph中你也应该可以直观的看出数据交互的方式。
本文来自 kint_zhao 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/zyh821351004/article/details/52143309?utm_source=copy