ROS发布Float32MultiArray消息C++/Python

版权声明:本文为博主原创文章,未经博主允许不得转载,转载请设置文章链接! https://blog.csdn.net/qq_30460905/article/details/88941899

在ros下发布一个字符串消息或整数消息,网上例程不少,ROSwiki上也有教程,有时就需要一次发送不止一个数据,这时候就得用到数组了,C++的也好找,不过python写的就比较少了,特此记录。

1. 首先查看有哪些消息

sun@sun-pc:~$ rosmsg show std_msgs/
std_msgs/Bool                 std_msgs/Int64
std_msgs/Byte                 std_msgs/Int64MultiArray
std_msgs/ByteMultiArray       std_msgs/Int8
std_msgs/Char                 std_msgs/Int8MultiArray
std_msgs/ColorRGBA            std_msgs/MultiArrayDimension
std_msgs/Duration             std_msgs/MultiArrayLayout
std_msgs/Empty                std_msgs/String
std_msgs/Float32              std_msgs/Time
std_msgs/Float32MultiArray    std_msgs/UInt16
std_msgs/Float64              std_msgs/UInt16MultiArray
std_msgs/Float64MultiArray    std_msgs/UInt32
std_msgs/Header               std_msgs/UInt32MultiArray
std_msgs/Int16                std_msgs/UInt64
std_msgs/Int16MultiArray      std_msgs/UInt64MultiArray
std_msgs/Int32                std_msgs/UInt8
std_msgs/Int32MultiArray      std_msgs/UInt8MultiArray

2. 查看数组描述,以Float32MultiArray为例

sun@sun-pc:~$ rosmsg show std_msgs/Float32MultiArray
std_msgs/MultiArrayLayout layout
  std_msgs/MultiArrayDimension[] dim
    string label
    uint32 size
    uint32 stride
  uint32 data_offset
float32[] data

3.C++实现publish 这里只需要数据data数据

#include "ros/ros.h"
#include "std_msgs/Float32MultiArray.h"
int main(int argc, char **argv)
{
    ros::init(argc, argv, "Array_pub");
    ros::NodeHandle nh;

    ros::Publisher chatter_pub = nh.advertise<std_msgs::Float32MultiArray>("chatter", 1000);

    ros::Rate loop_rate(10);
    while (ros::ok())
    {
        std_msgs::Float32MultiArray msg;
        msg.data.push_back(1.0);//自己写的,可行
        msg.data.push_back(2.0);
        msg.data.push_back(3.0);
        msg.data.push_back(4.0);

        chatter_pub.publish(msg);
        ros::spinOnce();
        loop_rate.sleep();
    }
    return 0;
}
//订阅
#include "ros/ros.h"
#include "std_msgs/Float32MultiArray.h"

void chatterCallback(const std_msgs::Float32MultiArray::ConstPtr& msg)
{
    ROS_INFO("I heard: [%f],[%f],[%f],[%f]", msg->data.at(0),msg->data.at(1),msg->data.at(2),msg->data.at(3));
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "Array_sub");
    ros::NodeHandle nh;
    ros::Subscriber sub = nh.subscribe("chatter", 1000, chatterCallback);
    ros::spin();
    return 0;
}

4 . python实现

这个让我可是一番好找,在stackoverflow发现了相似问题,链接:https://stackoverflow.com/questions/31369934/ros-publishing-array-from-python-node

#! /usr/bin/python
# -*- coding: utf-8 -*-
import rospy
from std_msgs.msg import Float32MultiArray
def talker():
    pub_p = rospy.Publisher('lefttop_point', Float32MultiArray, queue_size=1)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
	array = [521,1314]
	left_top = Float32MultiArray(data=array)
        #也可以采用下面的形式赋值
        #left_top = Float32MultiArray()
        #left_top.data = [521,1314]
        #left_top.label = 'love'
        rospy.loginfo(left_top)
	pub_p.publish(left_top)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

5. 当然你可以自己定义个消息,数据类型 float32[] data,欢迎交流!

猜你喜欢

转载自blog.csdn.net/qq_30460905/article/details/88941899