一、背景

在ros中调用GMSL2摄像头,刚开始是通过修改官方驱动包ros-meloidc-usb-cam,可能是修改的地方不对,一直报错,调用失败,要是有大佬修改成功,希望能交流一下。

后来借鉴了一下别人关于这方面的博客,成功拿到了图像数据。理论上jetson orin/nanotx2等也可以用。

这是我的包,可根据自己情况修改jetsongmls2相机驱动-编解码文档类资源-CSDN下载

二、环境

1、设备 Nvidia Jetson Agx Xavier

2、jetpack 4.6.1

3、opencv 4.1.1

4、ros-melodic

5、python3.6.9

6、GMSL2相机+相机采集板

三、驱动包环境搭建

1、编译python3版cv_bridge

参考我的上篇博客,此步不可省略,因为opencv4.1.1是python3版本的,所以就得使用python3版本的cv_bridge,而官方默认版本为python2版,如不自己构建cv_bridge,必须安装python2版本的opencv版本,使用默认cv_bridge。

在ROS-meloidc中使用python3 cv_bridge_Ponnyao的博客-CSDN博客

2、创建ROS工作空间

mkdir -p ~/ros_camera_ws/src
cd ~/ros_camera_ws/
catkin_make
source devel/setup.bash

3、创建ROS功能包learning_image_transport

cd ~/ros_camera_ws/src
catkin_create_pkg learning_image_transport roscpp std_msgs cv_bridge image_transport sensor_msgs 

4、编写发布订阅节点C++文件

在功能包learning_image_transport下的src目录中建立两个cpp文件。

1、my_publisher.cpp

cd ~/ros_camera_ws/src/learning_image_transport/src/
gedit my_publisher.cpp

写入以下代码:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>
#include <sstream> // for converting the command line parameter to integer  int main(int argc, char** argv)
{  // Check if video source has been passed as a parameter  if(argv[1] == NULL)   {  ROS_INFO("argv[1]=NULL\n");  return 1;  }  ros::init(argc, argv, "image_publisher");  ros::NodeHandle nh;  image_transport::ImageTransport it(nh);  image_transport::Publisher pub = it.advertise("camera/image", 1);  // Convert the passed as command line parameter index for the video device to an integer  std::istringstream video_sourceCmd(argv[1]);  int video_source;  // Check if it is indeed a number  if(!(video_sourceCmd >> video_source))   {  ROS_INFO("video_sourceCmd is %d\n",video_source);  return 1;  }  cv::VideoCapture cap(video_source);  // Check if video device can be opened with the given index  if(!cap.isOpened())   {  ROS_INFO("can not opencv video device\n");  return 1;  }  cv::Mat frame;  sensor_msgs::ImagePtr msg;  ros::Rate loop_rate(5);  while (nh.ok()) {  cap >> frame;  // Check if grabbed frame is actually full with some content  if(!frame.empty()) {  msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg();  pub.publish(msg);  //cv::Wait(1);  }  }ros::spinOnce();  loop_rate.sleep();
}  

2、my_subscriber.cpp

gedit my_subscriber.cpp

写入以下代码:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>  void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{  try  {  cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image); // cv::waitKey(30);  }  catch (cv_bridge::Exception& e)  {  ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());  }
}  int main(int argc, char **argv)
{  ros::init(argc, argv, "image_listener");  ros::NodeHandle nh;  cv::namedWindow("view");  cv::startWindowThread();  image_transport::ImageTransport it(nh);  image_transport::Subscriber sub = it.subscribe("camera/image", 1,imageCallback);  ros::spin();  cv::destroyWindow("view");
}  

5、配置文件修改

cd ~/ros_camera_ws/src/learning_image_transport/
gedit CMakeLists.txt

填入以下内容:

find_package(OpenCV REQUIRED)
# add the publisher example
add_executable(my_publisher src/my_publisher.cpp)  target_link_libraries(my_publisher ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})  # add the subscriber example
add_executable(my_subscriber src/my_subscriber.cpp)
target_link_libraries(my_subscriber ${catkin_LIBRARIES} ${OpenCV_LIBRARIES}) 

6、编译ROS包

cd ~/ros_camera_ws/
catkin_make  

7、测试

1、启动ros核心:

roscore

2、启动发布节点:

cd ~/ros_camera_ws/
source devel/setup.bash
rosrun learning_image_transport my_publisher 0 

0代表默认摄像头,如果有多个摄像头,则第二个是1,依次类推。

3、启动订阅节点:

cd ~/ros_camera_ws/
source devel/setup.bash
rosrun learning_image_transport my_subscriber

8、其他节点订阅图像

在对应功能包scripts文件夹下新建image_view.py

#!/usr/bin/env python3
#coding:utf-8import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge,CvBridgeErrordef callback(data):             cv_image=CvBridge().imgmsg_to_cv2(data,"bgr8")cv2.imshow("view",cv_image)cv2.waitKey(1)if __name__ == '__main__':rospy.init_node('image_acquistion')rospy.Subscriber('camera/image', Image, callback)rospy.spin()cv2.destoryAllWindows()
rosrun 你的包名 image_view.py

参考博客

JETSON AGX XAVIER GMSL2接口相机驱动_努力划水的博客-CSDN博客_gmsl2接口

Nvidia Jetson Agx Xavier 在Ros中调用GMSL2相机相关推荐

  1. 基于NVIDIA Jetson AGX Xavier的移动机器人开发(1)——Xavier刷机、风扇配置、ROS安装

    实验室有一台2020年购入的AGX Xavier计算平台,由于实车开发作实验较为麻烦,打算基于这台Xavier从头搭建一套缩小版的自动驾驶系统用于算法验证以及实验,同时锻炼从头搭建系统的能力.平台基于 ...

  2. ZED2代相机+nvidia jetson AGX xavier踩坑记录

    ZED2代相机+nvidia jetson AGX xavier踩坑记录 项目描述 nvidia jetson AGX xavier就不详细介绍了,jetson系列嵌入式开发板比一般的arrch64开 ...

  3. NVIDIA Jetson AGX Xavier 安装 JetPack 注意事项

    NVIDIA Jetson AGX Xavier 安装 JetPack 注意事项 本文主要记录了我第一次接触Linux和为NVIDIA Jetson AGX Xavier安装JetPack时遇到的一些 ...

  4. nvidia jetson agx xavier运行 OpenCL

    nvidia jetson agx xavier 运行 OpenCL 最近用OpenCL在某个GPGPU上开发了某些功能,想移植到nvidia的gpu上时才发现nvidia的移动端GPU居然没有Ope ...

  5. 玩转NVIDIA Jetson AGX Xavier

    最近项目应用需要部署到边缘模块,所以就玩起了Xavier.感觉网上的资料不多,所以从头记录一下笔记,方便大家一起学习应用. 玩转NVIDIA Jetson AGX Xavier 1.刷机(安装sdkm ...

  6. NVIDIA Jetson AGX Xavier冰壶的跟踪与识别

    NVIDIA Jetson AGX Xavier冰壶的跟踪与识别 一.项目简介 二.硬件平台的选取 2.1为什么选择NVIDIA Jetson AGX Xavier 三.识别环境配置 3.1 下载py ...

  7. NVIDIA Jetson AGX Xavier安装realsense2

    NVIDIA Jetson AGX Xavier安装realsense2 由于实验需要,购买了AGX智盒,入手智盒一时爽,调试起来真要命,笔者在前期做了大量的工作,主要包括以下: 1.安装中文输入法, ...

  8. 解决英伟达NVIDIA Jetson AGX Xavier Desktop Sharing无法运行 + Xavier 配置远程桌面

    解决英伟达NVIDIA Jetson AGX Xavier Desktop Sharing无法运行 + Xavier 配置远程桌面 修复Desktop Sharing无法打开 编译生效 配置Deskt ...

  9. NVIDIA Jetson AGX Xavier主机刷机与SSD安装

    任务逻辑 当有个新的AGX主机到手上后,主机是启动的是eMMC,大约30G存储 这个安装了系统后到后面随便弄一下就不够存储了,所以我是想要在主机上安装一个SSD,然后将系统直接放到SSD上,这种操作就 ...

最新文章

  1. pygame里面物体闪烁运动_教师资格【试讲示范】高中物理试讲答辩——《自由落体运动》试讲稿答辩...
  2. C#中统计程序运行时间
  3. 如何在SAP的的凭证流浏览器(DRB)中显示客户自定义的凭证
  4. 编程方法学8:信息隐藏
  5. 通过/proc/PID/status查看进程内存占用情况
  6. 学习笔记1(第五周)
  7. Lync Server 2013企业版部署系列之五:前端服务器软件准备
  8. Linux下使用shell实现上传linux下某个目录下所有文件到ftp
  9. 高等数学下-赵立军-北京大学出版社-题解-练习9.2
  10. HDU5120 - Intersection
  11. 工业RS485接口电路设计
  12. 【数据库系统】事务、锁、隔离、自动恢复
  13. L1-062 幸运彩票 (15 分)
  14. 访问权限java_Java访问权限
  15. stm32 OV7670摄像头模块的介绍以及应用(SCCB的使用)
  16. 经典面试题-Appium原理
  17. 【python包】NumPy-快速处理数据2
  18. 【微信公众号】微信扫一扫,条形码/一维码,二维码功能解析
  19. 自定义动画实现左右摇摆
  20. 【数据库运维】MYSQL备份恢复管理(上)

热门文章

  1. c语言程序设计教程+西安交通大学,大学C程序设计教程-西安交通大学.ppt
  2. 原生js:淘宝轮播图
  3. 浅谈软件测试行业的前景,就业方向和薪资待遇
  4. 任务5独立实践SQL数据模型分析
  5. AS3 抽象类与接口
  6. DBCA创建数据库实例
  7. 沙盘SandBoxie4.14 特别版+无限试用补丁
  8. Appender的几种实现方式
  9. 推荐几款实现内网穿透的实用工具(转载)
  10. 哈希消息认证码HmacSHA256-javascript版