Hình ảnh người đăng ký ros c ++

Chúng tôi đã tạo một cách đơn giản hơn để tạo ảnh thẻ nhớ microSD của bạn bằng Raspbian, hệ điều hành Raspberry Pi chính thức và các hệ điều hành khác. Giới thiệu tiện ích hình ảnh mới của chúng tôi, Raspberry Pi Imager

Hình ảnh người đăng ký ros c ++

Đơn giản hóa trải nghiệm Raspberry Pi

Đối với tôi, một trong những khía cạnh quan trọng nhất của trải nghiệm Raspberry Pi là cố gắng làm cho việc bắt đầu trở nên dễ dàng nhất có thể. Để đạt được mục tiêu này, kể từ khi ra mắt Raspberry Pi đầu tiên, chúng tôi đã thêm GUI vào hệ điều hành của mình, trình hướng dẫn giúp bạn thiết lập Raspberry Pi trong lần đầu tiên bạn khởi động nó cũng như rất nhiều sách và tạp chí để giúp mọi người hiểu và . Chúng tôi thậm chí đã phát triển Bộ máy tính để bàn Raspberry Pi để đặt tất cả những thứ bạn cần (vâng, Alex, tôi biết – ngoại trừ màn hình) vào một hộp duy nhất để làm cho nó dễ dàng nhất có thể

Thẻ SD có thể hơi rắc rối

Bất chấp tất cả những động thái hướng tới sự đơn giản hơn, khi nói đến thẻ nhớ microSD, việc lập trình chúng với hệ điều hành Raspberry Pi yêu thích của bạn luôn gặp một chút khó khăn.

Hình ảnh người đăng ký ros c ++

Vấn đề chính xuất phát từ sự khác biệt giữa các hệ điều hành mà máy tính chính của mọi người có khả năng sử dụng. Windows, macOS và Linux đều sử dụng các phương pháp truy cập thẻ SD khác nhau, điều này không giúp ích gì. Và, đối với một số người dùng Raspberry Pi mới, việc hiểu nơi tìm hình ảnh cập nhật mới nhất và cách tải nó vào thẻ nhớ microSD có thể hơi khó hiểu, trừ khi bạn đã có kinh nghiệm trước đó với các công cụ flash hình ảnh như

Vì lý do đó, chúng tôi luôn khuyên bạn nên mua thẻ SD NOOBS được nạp sẵn từ Đại lý bán lẻ được Raspberry Pi phê duyệt của mình

Nhưng nếu bạn muốn tạo lại hình ảnh một thẻ hiện có thì sao?

Giới thiệu Raspberry Pi Imager mới

Từ hôm nay, người dùng Raspberry Pi sẽ có thể tải xuống và sử dụng Raspberry Pi Imager mới, có sẵn cho Windows, macOS và Ubuntu

  • Hình ảnh người đăng ký ros c ++
  • Hình ảnh người đăng ký ros c ++
  • Hình ảnh người đăng ký ros c ++
  • Hình ảnh người đăng ký ros c ++

Tiện ích này rất dễ sử dụng và siêu nhanh, nhờ một số phím tắt mà chúng tôi đã đưa vào cơ học

Đầu tiên, Raspberry Pi Imager tải xuống một. Tệp JSON từ trang web của chúng tôi với danh sách tất cả các tùy chọn tải xuống hiện tại, đảm bảo bạn luôn cài đặt phiên bản cập nhật nhất

Khi bạn đã chọn một hệ điều hành từ các tùy chọn có sẵn, tiện ích sẽ đọc tệp có liên quan trực tiếp từ trang web của chúng tôi và ghi thẳng vào thẻ SD. Điều này tăng tốc quá trình lên đáng kể so với quy trình tiêu chuẩn đọc nó từ trang web, ghi nó vào một tệp trên ổ cứng của bạn, sau đó, như một bước riêng biệt, đọc lại từ ổ cứng và ghi nó vào SD

Trong quá trình này, Raspberry Pi Imager cũng lưu trữ hình ảnh hệ điều hành đã tải xuống – nghĩa là, nó lưu một bản sao cục bộ trên máy tính của bạn, vì vậy bạn có thể lập trình các thẻ SD bổ sung mà không cần phải tải lại tệp xuống

Mã nguồn mở và sẵn sàng hoạt động

Tải xuống Raspberry Pi Imager từ trang tải xuống của chúng tôi ngay hôm nay

Raspberry Pi Imager là nguồn mở hoàn toàn và ban đầu được viết dưới dạng sửa đổi của công cụ PiBakery, sau đó được sửa đổi và hoàn thiện bởi Floris Bos (tác giả ban đầu của công cụ NOOBS và công cụ PiServer). Bạn có thể xem phần mềm khác của Floris, dành cho trung tâm dữ liệu, tại đây

Đầu tiên, tạo src/my_subscriber. cpp trong gói learning_image_transport bằng trình chỉnh sửa yêu thích của bạn và đặt phần sau vào bên trong nó

   1 #include 
   2 #include 
   3 #include 
   4 #include 
   5 #include 
   6 
   7 void imageCallback(const sensor_msgs::ImageConstPtr& msg)
   8 {
   9   sensor_msgs::CvBridge bridge;
  10   try
  11   {
  12     cvShowImage("view", bridge.imgMsgToCv(msg, "bgr8"));
  13   }
  14   catch (sensor_msgs::CvBridgeException& e)
  15   {
  16     ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
  17   }
  18 }
  19 
  20 int main(int argc, char **argv)
  21 {
  22   ros::init(argc, argv, "image_listener");
  23   ros::NodeHandle nh;
  24   cvNamedWindow("view");
  25   cvStartWindowThread();
  26   image_transport::ImageTransport it(nh);
  27   image_transport::Subscriber sub = it.subscribe("camera/image", 1, imageCallback);
  28   ros::spin();
  29   cvDestroyWindow("view");
  30 }
  31 

Mã giải thích

Bây giờ, hãy chia nhỏ mã từng mảnh. Đối với các dòng không được giải thích ở đây, hãy xem Viết một Nhà xuất bản và Người đăng ký Đơn giản (C++)

   2 #include 
   3 

image_transport/image_transport. h bao gồm mọi thứ chúng tôi cần để xuất bản và đăng ký hình ảnh

   3 #include 
   4 #include 
   5 #include 
   6 

Các tiêu đề này sẽ cho phép chúng tôi hiển thị hình ảnh bằng các khả năng GUI đơn giản của OpenCV

   7 void imageCallback(const sensor_msgs::ImageConstPtr& msg)
   8 

Đây là chức năng gọi lại sẽ được gọi khi một hình ảnh mới xuất hiện trong chủ đề "máy ảnh/hình ảnh". Mặc dù hình ảnh có thể đã được gửi trong một số loại tin nhắn dành riêng cho phương tiện truyền tải tùy ý, lưu ý rằng lệnh gọi lại chỉ cần xử lý loại sensor_msgs/Image bình thường. Tất cả mã hóa/giải mã hình ảnh được xử lý tự động cho bạn

   9   sensor_msgs::CvBridge bridge;
  10   try
  11   {
  12     cvShowImage("view", bridge.imgMsgToCv(msg, "bgr8"));
  13   }
  14   catch (sensor_msgs::CvBridgeException& e)
  15   {
  16     ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
  17   }
  18 

Phần thân của cuộc gọi lại. Chúng tôi chuyển đổi thông báo hình ảnh ROS thành hình ảnh OpenCV với mã hóa pixel BGR, sau đó hiển thị nó trong cửa sổ hiển thị. Xem hướng dẫn này để biết thêm về chuyển đổi hình ảnh ROS-OpenCV

  24   cvNamedWindow("view");
  25   cvStartWindowThread();
  26 

Tạo cửa sổ hiển thị OpenCV

  26   image_transport::ImageTransport it(nh);
  27 

Chúng tôi tạo một phiên bản ImageTransport, khởi tạo nó bằng NodeHandle của chúng tôi. Chúng tôi sử dụng các phương thức của ImageTransport để tạo các nhà xuất bản và người đăng ký hình ảnh, giống như chúng tôi sử dụng các phương thức của NodeHandle để tạo các nhà xuất bản và người đăng ký ROS chung

  27   image_transport::Subscriber sub = it.subscribe("camera/image", 1, imageCallback);
  28 

Đăng ký chủ đề cơ sở "máy ảnh/hình ảnh". Chủ đề ROS thực tế được đăng ký phụ thuộc vào phương tiện vận chuyển nào được sử dụng. Trong trường hợp mặc định, vận chuyển "thô", chủ đề trên thực tế là "máy ảnh/hình ảnh" với loại sensor_msgs/Image. ROS sẽ gọi chức năng "imageCallback" bất cứ khi nào có hình ảnh mới. Đối số thứ 2 là kích thước hàng đợi

subscribe() trả về một image_transport. Đối tượng người đăng ký mà bạn phải giữ cho đến khi bạn muốn hủy đăng ký. Khi đối tượng Người đăng ký bị hủy, nó sẽ tự động hủy đăng ký khỏi chủ đề cơ sở "máy ảnh/hình ảnh"

Có các phiên bản của hàm subscribe() cho phép bạn chỉ định hàm thành viên của lớp hoặc thậm chí bất kỳ thứ gì có thể gọi được bằng Boost. đối tượng chức năng

________số 8

Vứt bỏ cửa sổ hiển thị của chúng tôi

Chỉ trong một vài dòng mã, chúng tôi đã viết một trình xem ảnh ROS có thể xử lý ảnh ở cả dạng thô và dạng nén khác nhau. Trên thực tế, đây là phiên bản rút gọn của image_view