subscribe消息订阅问题总结及消息打印指令

如何订阅消息,网上信息比较多,但是自己写的时候还是遇到一些问题。尤其是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 显示节点之间的关系图

————————————————
版权声明:本文为CSDN博主「mountzf」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mountzf/article/details/52314364

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值