Jetson nano 上使用ROS进行双目摄像头(CSI-IMX219)操作标定

Jetson nano 上使用ROS进行双目摄像头(CSI-IMX219)操作标定

Nvidia的Jetson nano上使用索尼的IMX219相机操作ROS

CSI-IMX219简介

imx219是索尼800万像素中,超越imx179的一款对角为4.6mm (1/4.0型) , 有效像素约808万的背照式cmos图像传感器。imx219面向移动终端 (智能手机, 平板电脑) , 可以拍摄帧率180帧/秒高速视频的cmos图像传感器。imx219满足了高性能拍照应用所需的 [高灵敏度] 、[高帧率拍摄] 等基本功能需求, 由于芯片的小型化, 使得它即使在时尚的窄边框设计的设备的前置摄像头上也能很方便应用。

拍摄功能在通常的全尺寸8mpix输出时30帧/秒的基础上, 通过2×2像素同时读取的加算功能还实现了4倍速拍摄。而且, 通过搭载lsc1功能来降低模块生产过程中产生的光学偏差, 进而有助于减少系统成本。另外, 通过与具备bme hdr2功能的后段isp的组合, 还可以扩展出高动态范围视频拍摄功能。

在Jetson nano上简单使用

首先介绍下V4L2,V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video下,如果只有一个视频设备,通常为/dev/video0,当接入三个摄像头时候,使用ls /dev/video 并不能显示这个CSI线接入的设备,则可能会显示,例如v4l-subdev0这样的v4l设备,既然设备不是很好找,那么我们直接使用下面的命令先开启摄像头测试摄像头是否可用:

nvgstcapture

摄像头可用的话那么屏幕上则会开启一个摄像头的展示框。

使用ROS操作CSI-IMX219

这一步的前提是CSI-IMX219摄像头可以正常开启。
首先从github上克隆一个日本程序员写的第三方包组,使用这个包可以实现双目摄像头的标定等操作。

cd ~/catkin_ws/src
git clone https://github.com/rt-net/jetson_nano_csi_cam_ros.git 

接下来下载一些gscam的依赖,上述包组是依赖于gscam的,因此也要把gscam克隆下来

sudo apt-get install gstreamer1.0-tools libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev
cd ~/catkin_ws/src
git clone https://github.com/ros-drivers/gscam.git

接下来我们进入到克隆好的gscam目录中使用sed命令添加一行参数

cd ~/catkin_ws/src/gscam
sed -e "s/EXTRA_CMAKE_FLAGS = -DUSE_ROSBUILD:BOOL=1$/EXTRA_CMAKE_FLAGS = -DUSE_ROSBUILD:BOOL=1 -DGSTREAMER_VERSION_1_x=On/" -i Makefile

然后我们在src目录下直接编译

cd ~/catkin_ws
catkin_make
source devel/setup.bash

将作CAM0连接的相机流的数据/csi_cam_0/image_raw进行ROS主题发布,在终端中执行以下命令:

roslaunch jetson_nano_csi_cam jetson_csi_cam.launch sensor_id:=0 width:=<image width> height:=<image height> fps:=<desired framerate>

将与CAM0和CAM1连接的相机流的数据/csi_cam_0/image_raw和//csi_cam_1/image_raw同时进行ROS主题发布,在终端中执行以下命令:

roslaunch jetson_nano_csi_cam jetson_dual_csi_cam.launch width:=<image width> height:=<image height> fps:=<desired framerate>

要以ROS为主题开启摄像头不间断连续发送相机视频,在终端中执行以下命令:

roslaunch jetson_csi_cam jetson_csi_cam.launch

这个launch只是启动发送用的节点。为了确认发送的视频,会使用其他的手段。
为了简单确认影像是否被发送,可以在终端执行rostoopic list,从发送中的ROS话题一览找到/csi_cam_0/image_raw这个话题。

rostopic list

同样我们也可以使用rqt_image_view选择/csi_cam_0/image_raw实时的去看我们的视频是否不间断获取到:

rqt_image_view

可以添加视频的参数:

roslaunch jetson_csi_cam jetson_csi_cam.launch width:=1920 height:=1080 fps:=15

关于其他参数,在roslaunch时name>:=<arg_可以以value>格式指定选项。


sensor(default: 0) --相机ID

width(default:640)--发送的影像的宽度

height(default:480)--发送的影像高度

fps(default:30)--发送的帧速率(根据分辨率的不同可能不满足这个帧速率)

cam_name (default: csi_cam_$(arg sensor_id)--与camerainfo对应的相机名称

frame_id (default: /$(arg cam_name)_link)--tf中使用的照相机的帧名

sync_sink (default: true)--appsink(如果将帧速率设置低并发生问题时将此选项设为假,问题可能会得到解决)

flip_method(default:0)--视频传送时图像的反转选项

计算刷新频率:

可以通过以下命令确认ROS主题的刷新频率

rostopic hz /csi_cam_0/image_raw

图像视频校准:

rosrun camera_calibration cameracalibrator.py --size 8x6 --square <square size in meters> image:=/csi_cam_0/image_raw camera:=/csi_cam_0

Github原文链接:https://github.com/rt-net/jetson_nano_csi_cam_ros
想获取一些其他ROS学习资料或者购买一套以学习ROS为目的机器人,可以查看巨匠机器人

  • 8
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Jetson Nano 使用 CSI (Camera Serial Interface) 接口连接摄像头。要在 Jetson Nano 上使用 CSI 摄像头,您需要使用 NVIDIA JetPack SDK 安装相应的软件和驱动程序,并编写相应的 C 代码来访问和控制摄像头。 以下是一些基本的步骤,可以帮助您开始使用 CSI 摄像头: 1. 安装 JetPack SDK:JetPack SDK 包含了 NVIDIA Jetson Nano 的所有软件和驱动程序。您可以从 NVIDIA 的官方网站上下载 JetPack SDK,并按照指南进行安装。 2. 连接 CSI 摄像头:将 CSI 摄像头插入 Jetson Nano 的 CSI 接口。 3. 编写 C 代码:使用 GStreamer 库编写 C 代码来访问和控制摄像头。GStreamer 是一种流媒体框架,可以帮助您在 Jetson Nano 上捕获和处理视频流。您可以使用 GStreamer 的 nvarguscamerasrc 插件来访问 CSI 摄像头。 以下是一个简单的 C 代码示例,可以使用 nvarguscamerasrc 插件捕获 CSI 摄像头的视频流: ```c #include <gst/gst.h> int main(int argc, char* argv[]) { GstElement *pipeline, *source, *sink; GstBus *bus; GstMessage *msg; GstStateChangeReturn ret; /* Initialize GStreamer */ gst_init(&argc, &argv); /* Create the elements */ source = gst_element_factory_make("nvarguscamerasrc", "source"); sink = gst_element_factory_make("nveglglessink", "sink"); /* Create the empty pipeline */ pipeline = gst_pipeline_new("test-pipeline"); if (!pipeline || !source || !sink) { g_printerr("Not all elements could be created.\n"); return -1; } /* Build the pipeline */ gst_bin_add_many(GST_BIN(pipeline), source, sink, NULL); if (gst_element_link(source, sink) != TRUE) { g_printerr("Elements could not be linked.\n"); gst_object_unref(pipeline); return -1; } /* Start playing */ ret = gst_element_set_state(pipeline, GST_STATE_PLAYING); if (ret == GST_STATE_CHANGE_FAILURE) { g_printerr("Unable to set the pipeline to the playing state.\n"); gst_object_unref(pipeline); return -1; } /* Wait until error or EOS */ bus = gst_element_get_bus(pipeline); msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS); /* Parse message */ if (msg != NULL) { GError *err; gchar *debug_info; switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_ERROR: gst_message_parse_error(msg, &err, &debug_info); g_printerr("Error received from element %s: %s\n", GST_OBJECT_NAME(msg->src), err->message); g_printerr("Debugging information: %s\n", debug_info ? debug_info : "none"); g_clear_error(&err); g_free(debug_info); break; case GST_MESSAGE_EOS: g_print("End-Of-Stream reached.\n"); break; default: /* We should not reach here because we only asked for ERRORs and EOS */ g_printerr("Unexpected message received.\n"); break; } gst_message_unref(msg); } /* Free resources */ gst_object_unref(bus); gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(pipeline); return 0; } ``` 4. 编译和运行代码:使用 gcc 编译上述 C 代码,并在 Jetson Nano 上运行它。您应该能够看到 CSI 摄像头的视频流在屏幕上显示出来。 请注意,上述代码仅仅是一个简单的示例。如果您需要更复杂的功能,例如捕获图像、处理视频流等,请参考 GStreamer 的官方文档,并编写相应的 C 代码来实现您的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值