卡通类网站设计网站建设全网营销
ros2可以和lidar、imu、相机、超声波雷达和小车控制等硬件相互通讯。通讯的过程中是按照一定的消息格式来通讯的,但是数据处理的时候则是直接对消息中的数据进行处理,因此消息和数据之间是需要进行转换的。那么怎么转换呢?
一.ros2和PointCloud2之间的转换
假设所要包含的头文件和数据是:
#include <pcl_conversions/pcl_conversions.h>
#include <pcl/PCLPointCloud2.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl/conversions.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>pcl::PointCloud<> pcl_pc;
pcl::Pointcloud2 pcl_pc2;
sensor_msgs::PointCloud2 ros_pc;
sensor_msgs::PointCloud2 ros_pc2;
1、pcl::Pointcloud2 和 sensor_msgs::PointCloud2 之间的转换
1)把pcl::Pointcloud2 转换成 pointClouds_msg
第一种方法:pcl::toRosMsg(pcl_pc2, ros_pc2);
第二种方法:pcl::fromPcl(pcl_pc2, ros_pc2);
2)把 pointClouds_msg转换成 pcl::Pointcloud2
第一种方法:pcl::fromRosMsg( ros_pc2, pcl_pc2)
第二种方法:pcl::toPcl( ros_pc2,pcl_pc2);
2. pcl::Pointcloud2 和 pcl::Pointcloud之间的转换
1)把pcl::Pointcloud2转换成 pcl::Pointcloud
pcl::fromPclPointCloud2(pcl_pc2,pcl_pc);
2)把pcl::Pointcloud转换成 pcl::Pointcloud2
pcl::toPclPointCloud2(pcl_pc,pcl_pc2);
convertPointCloudToPointCloud2(pcl_pc,pcl_pc2);
3.sensor_msg::pointcloud2 和sensor_msg::pointcloud之间的转换
1)把sensor_msg::pointcloud2转换成 sensor_msg::pointcloud
convertPointCloud2ToPointCloud( ros_pc2, ros_pc);
2)把sensor_msg::pointcloud转换成 sensor_msg::pointcloud2
convertPointCloud2ToPointCloud( ros_pc, ros_pc2);
4.为了数据转换更加高效,可以使用move
pcl_conversions::moveFromPCL(pcl_pc2, ros_pc2);
点云、消息之间相互转换,参考的博客是 ROS与PCL环境中进行四种不同点云数据类型转换_pcl::torosmsg-CSDN博客
二、 ros2和图像之间的转换
简单的转换关系就是 opencv cv::Mat <-----------CvBridge-----------> Ros image message
#include <ros/ros.h>
#include <sensor_msgs/Image.h>
#include <cv_bridge/cv_bridge.h>
#include <opencv2/opencv.hpp>class ImageProcessor
{
public:ImageProcessor(){// 初始化订阅者和发布者image_sub = nh.subscribe("/camera/image_raw", 1, &ImageProcessor::imageCallback, this);image_pub = nh.advertise<sensor_msgs::Image>("/camera/image_processed", 1);}void imageCallback(const sensor_msgs::ImageConstPtr& msg){try{// 将ROS图像消息转换为OpenCV格式cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);// 进行灰度转换cv::Mat gray_image;cv::cvtColor(cv_ptr->image, gray_image, cv::COLOR_BGR2GRAY);// 将灰度图转换回ROS图像消息cv_bridge::CvImage out_msg;out_msg.header = msg->header;out_msg.encoding = sensor_msgs::image_encodings::MONO8;out_msg.image = gray_image;// 发布处理后的图像image_pub.publish(out_msg.toImageMsg());}catch (cv_bridge::Exception& e){ROS_ERROR("cv_bridge exception: %s", e.what());return;}}private:ros::NodeHandle nh;ros::Subscriber image_sub;ros::Publisher image_pub;
};int main(int argc, char** argv)
{ros::init(argc, argv, "image_processor");ImageProcessor ip;ros::spin();return 0;
}
可以看出,
1)将ros2图像转成opencv图像
cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy(msg,sensor_msgs::image_encodings::BGR8);
// 进行灰度转换
cv::Mat gray_image;
cv::cvtColor(cv_ptr->image, gray_image, cv::COLOR_BGR2GRAY);
2)将opencv图像转成ros2图像的方法
// 将灰度图转换回ROS图像消息
cv_bridge::CvImage out_msg;
out_msg.header = msg->header;
out_msg.encoding = sensor_msgs::image_encodings::MONO8;
out_msg.image = gray_image;
// 发布处理后的图像
image_pub.publish(out_msg.toImageMsg());
参考的博客是:深入解析Ubuntu 20.04中ROS与OpenCV的图像格式及其相互转换_cv::mat image 转换为ros msg-CSDN博客
三、ros2和arduino通讯
这个还没搞明白,后续还需要更新博客。看这篇博客的代码,竟然是ros2消息发布也烧录到了arduino板子上,,那么消息是通过串口发布的吗?
ROS2与Arduino发布订阅_micro-xrce-dds 最小内存-CSDN博客
【如何将Arduino与机器人操作系统(ROS)一起使用】_arduino ros-CSDN博客
四、ros2和 imu之间
imu刚买过来,还没有具体研究,等跑通了再来更新。
五、ros2和串口之间的
ROS机器人制作(三)—— ROS上位机与stm32进行串口通信_ros与stm32通信-CSDN博客
六、ros2与pixhawk数据通讯
这个标题也先列在这里,后续逐步补充