前言
自动驾驶机器人中,通过处理的消息通过topic 发送,消息的传递方式主要通过接收消息和发送消息。
一、ROS topic
从驱动中得到的图像和发出去的图像的时间戳要注意。
二、topic 通讯方式
1.advertise
代码如下(示例):
//1.初始化 ROS 节点
ros::init(argc, argv, "pub_cam_node");
//2.创建 ROS 句柄
ros::NodeHandle nh;
//3.创建订阅对象
image_transport::ImageTransport it(nh);
image_transport::Publisher pub_image;
pub_image = it.advertise("camera111", 1);
image_msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", img).toImageMsg();
image_msg->header.stamp = ros::Time::now();
pub_image.publish(image_msg);//将图像从sensor_msgs/Image类型转化成cv::Mat类型
2.subscribe
代码如下(示例):
//1.初始化 ROS 节点
ros::init(argc, argv, "pub_cam_node");
//2.创建 ROS 句柄
ros::NodeHandle nh;
//3.创建订阅对象
ros::Subscriber sub = nh.subscribe("/perception/camera_middlefront/compressed", 1, CompressedImageCallback);
//回调函数如下
void CompressedImageCallback(const sensor_msgs::CompressedImage& msg)
{
cv::Mat img = cv_bridge::toCvCopy(msg, "bgr8")->image;//回调函数拿到驱动发出来的压缩图像
sensor_msgs::ImagePtr image_msg;
image_msg = cv_bridge::CvImage(msg.header, "bgr8", img).toImageMsg();
pub_image.publish(image_msg); // for rosbag test
}
三、tips
自定义msg之后->编译通过后->roslaunch节点->rostopic echo [话题名称]发现报如下错误
ERROR: Cannot load message class for [autoware_msgs/VehicleCmd]. Are your messages built?
需要source 该消息所在的工作空间的setup.bash