Nvidia Jetson Agx Xavier 在Ros中调用GMSL2相机
一、背景
在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相机相关推荐
- 基于NVIDIA Jetson AGX Xavier的移动机器人开发(1)——Xavier刷机、风扇配置、ROS安装
实验室有一台2020年购入的AGX Xavier计算平台,由于实车开发作实验较为麻烦,打算基于这台Xavier从头搭建一套缩小版的自动驾驶系统用于算法验证以及实验,同时锻炼从头搭建系统的能力.平台基于 ...
- ZED2代相机+nvidia jetson AGX xavier踩坑记录
ZED2代相机+nvidia jetson AGX xavier踩坑记录 项目描述 nvidia jetson AGX xavier就不详细介绍了,jetson系列嵌入式开发板比一般的arrch64开 ...
- NVIDIA Jetson AGX Xavier 安装 JetPack 注意事项
NVIDIA Jetson AGX Xavier 安装 JetPack 注意事项 本文主要记录了我第一次接触Linux和为NVIDIA Jetson AGX Xavier安装JetPack时遇到的一些 ...
- nvidia jetson agx xavier运行 OpenCL
nvidia jetson agx xavier 运行 OpenCL 最近用OpenCL在某个GPGPU上开发了某些功能,想移植到nvidia的gpu上时才发现nvidia的移动端GPU居然没有Ope ...
- 玩转NVIDIA Jetson AGX Xavier
最近项目应用需要部署到边缘模块,所以就玩起了Xavier.感觉网上的资料不多,所以从头记录一下笔记,方便大家一起学习应用. 玩转NVIDIA Jetson AGX Xavier 1.刷机(安装sdkm ...
- NVIDIA Jetson AGX Xavier冰壶的跟踪与识别
NVIDIA Jetson AGX Xavier冰壶的跟踪与识别 一.项目简介 二.硬件平台的选取 2.1为什么选择NVIDIA Jetson AGX Xavier 三.识别环境配置 3.1 下载py ...
- NVIDIA Jetson AGX Xavier安装realsense2
NVIDIA Jetson AGX Xavier安装realsense2 由于实验需要,购买了AGX智盒,入手智盒一时爽,调试起来真要命,笔者在前期做了大量的工作,主要包括以下: 1.安装中文输入法, ...
- 解决英伟达NVIDIA Jetson AGX Xavier Desktop Sharing无法运行 + Xavier 配置远程桌面
解决英伟达NVIDIA Jetson AGX Xavier Desktop Sharing无法运行 + Xavier 配置远程桌面 修复Desktop Sharing无法打开 编译生效 配置Deskt ...
- NVIDIA Jetson AGX Xavier主机刷机与SSD安装
任务逻辑 当有个新的AGX主机到手上后,主机是启动的是eMMC,大约30G存储 这个安装了系统后到后面随便弄一下就不够存储了,所以我是想要在主机上安装一个SSD,然后将系统直接放到SSD上,这种操作就 ...
最新文章
- pygame里面物体闪烁运动_教师资格【试讲示范】高中物理试讲答辩——《自由落体运动》试讲稿答辩...
- C#中统计程序运行时间
- 如何在SAP的的凭证流浏览器(DRB)中显示客户自定义的凭证
- 编程方法学8:信息隐藏
- 通过/proc/PID/status查看进程内存占用情况
- 学习笔记1(第五周)
- Lync Server 2013企业版部署系列之五:前端服务器软件准备
- Linux下使用shell实现上传linux下某个目录下所有文件到ftp
- 高等数学下-赵立军-北京大学出版社-题解-练习9.2
- HDU5120 - Intersection
- 工业RS485接口电路设计
- 【数据库系统】事务、锁、隔离、自动恢复
- L1-062 幸运彩票 (15 分)
- 访问权限java_Java访问权限
- stm32 OV7670摄像头模块的介绍以及应用(SCCB的使用)
- 经典面试题-Appium原理
- 【python包】NumPy-快速处理数据2
- 【微信公众号】微信扫一扫,条形码/一维码,二维码功能解析
- 自定义动画实现左右摇摆
- 【数据库运维】MYSQL备份恢复管理(上)