在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,欢迎交流!