如何订阅消息,网上信息比较多,但是自己写的时候还是遇到一些问题。尤其是publish是其他同事写好的,publish的数量也比较多,要接收自己需要的信息,遇到一些问题。
1.Callback函数的输入一定要加const
void PointCloudCallback(sensor_msgs::PointCloud2 &msg)
{
pcl::fromROSMsg(msg, m_pcl);
for (int i = 0; i < m_pcl.size(); i++) {
float x = m_pcl[i].x;
float y = m_pcl[i].y;
float z = m_pcl[i].z;
ROS_INFO("x: %f y: %f z: %f \n", x, y, z);
}
pcl::io::savePCDFileASCII("cloud.pcd", m_pcl);
}
粗看上去没什么问题,编译报错如下:
/opt/ros/kinetic/include/ros/parameter_adapter.h:78:30: error: binding ‘const sensor_msgs::PointCloud2_<std::allocator<void> >’ to reference of type ‘ros::ParameterAdapter<sensor_msgs::PointCloud2_<std::allocator<void> >&>::Parameter {aka sensor_msgs::PointCloud2_<std::allocator<void> >&}’ discards qualifiers
return *event.getMessage();
^
callback函数的输入变量前一定要加入const,正确的代码如下:
void PointCloudCallback(const sensor_msgs::PointCloud2 &msg)
{
pcl::fromROSMsg(msg, m_pcl);
for (int i = 0; i < m_pcl.size(); i++) {
float x = m_pcl[i].x;
float y = m_pcl[i].y;
float z = m_pcl[i].z;
ROS_INFO("x: %f y: %f z: %f \n", x, y, z);
}
pcl::io::savePCDFileASCII("cloud.pcd", m_pcl);
}
2.topic名字的书写方式
(1)发布实现如下:
#define TOPIC_LIDAR_PROP "lidar_prop"
propPublisher = nh.advertise<dassim::LidarProp>(TOPIC_LIDAR_PROP, 1000);
(2)接收信息的实现如下:
void imgCallBack(const adassim::LidarProp &msg)
{
ROS_INFO("Message LidarProp got on topic.\n");
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
ros::Subscriber sub_lidarProp = n.subscribe("lidar_prop", 1000,
imgCallBack);
ros::spin();
return 0;
}
编译通过,imgCallBack中无消息打印。
subscribe中字符串的名字改为 /adasim/lidar_prop
可以正确打印消息。
以下为转载内容:
使用rostopic
rostopic工具允许我们获取ROS topics的相关信息。rostopic -h可以知道有如下命令:
Commands:
rostopic bw display bandwidth used by topic
rostopic delay display delay of topic from timestamp in header
rostopic echo print messages to screen
rostopic find find topics by type
rostopic hz display publishing rate of topic
rostopic info print information about active topic
rostopic list list active topics
rostopic pub publish data to topic
rostopic type print topic type
使用rostopic echo
rostopic echo显示发布在一个主题上的数据。
rostopic echo [topic]
ROS Messages
通过在节点之间发送ROS Messages实现节点之间的通信,发布和订阅节点之间发送和接收的数据类型必须一致,这意味着一个主题的数据类型由发布在其上的信息类型所决定。发布在主题上的信息类型可以由rostopic type topic1来显示。
使用rostopic type
rostopic type返回正在使用的主题上的信息的类型。
rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
利用命令rosmsg可以查看信息的详细信息
rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
使用rqt_plot
rqt_plot是rqt软件包的一部分,可以动态绘制发布到某一个主题上的数据的图形
rosrun rqt_plot rqt_plot
rqt_graph 显示节点之间的关系图
————————————————
版权声明:本文为优快云博主「mountzf」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/mountzf/article/details/52314364