怎么创建网站后台,个人网页制作成品 模板,找公司的网站,做网站搭建的公司ros2可以和lidar、imu、相机、超声波雷达和小车控制等硬件相互通讯。通讯的过程中是按照一定的消息格式来通讯的#xff0c;但是数据处理的时候则是直接对消息中的数据进行处理#xff0c;因此消息和数据之间是需要进行转换的。那么怎么转换呢#xff1f;
一.ros2和PointCl…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.hpcl::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_pc2pcl_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.hppclass ImageProcessor
{
public:ImageProcessor(){// 初始化订阅者和发布者image_sub nh.subscribe(/camera/image_raw, 1, ImageProcessor::imageCallback, this);image_pub nh.advertisesensor_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数据通讯
这个标题也先列在这里后续逐步补充