1、Ros系统的简要介绍:
ROS 是你的机器人的操作系统。它运行在各种不同类型的计算机上的标准 Linux 系统之上,如树莓派或其他的一些单片机、以及笔记本电脑或台式电脑。
ROS中可执行的程序的基本单位是:节点(node)
节点之间通过消息机制进行通信,这就组成了:算图(abac)
节点之间通过收发消息进行通信,消息的收发机制分为:话题(topic)、服务(service)和动作(action)
1. ROS 提供了一种标准的方式来连接所有的传感器(摄像机、距离传感器、模拟到数字转换器、 IMU)和执行器(驱动马达、伺服系统、灯) ,并与控制软件一起做出决定。这是一种粘合效应,把所有这些联系在一起,并且为你省去了在机器人身上传递数据的烦恼。
2. ROS 可以帮助你轻松地让多台计算机或微处理器在机器人上或通过网络进行通信。例如,你可以通过网络驱动桌面计算机上的 ROS 机器人,或者让更强大的计算机处理计算密集型任务,而不是在机器人上完成。
3. ROS 为复杂的行为提供了库,比如地图构建和定位(SLAM),LIDAR 和其他传感器的使用,以及处理视频。一旦你让你的机器人以ROS预期的方式与之链接,你就可以集成这些功能而不需要从头开始编写代码。
4. ROS 还有一些非常有用的工具,用于可视化来自传感器的数据以及数据流动的位置。
5. 你可以在模拟器中测试 ROS 软件,而无需在真正的机器人硬件上运行它。事实上,你可以只用一台基本计算机而无需其他硬件来编写和运行 ROS 软件。你在模拟器上编写和测试的代码可以很容易地移植到真正的机器人上。
2、Astra Pro Plus深度相机的使用
1. 驱动深度相机前,需要在系统端识别到Astra相机设备。当系统镜像中已经搭建好环境,SSH连接到系统之后, 在终端输入,
ll /dev/astra*
2.1、程序功能说明
程序运行后,驱动Astra相机,可以获取到彩色RGB、深度Depth、红外IR的图像信息以及深度点云信息。
2.2、服务程序启动
使用launch启动命令:
launch文件 | 相机型号 |
---|---|
ros2 launch astra_camera astra_pro.launch.xml | Astrapro |
ros2 launch astra_camera astro_pro_plus.launch.xml | Astraproplus |
ros2 launch astra_camera astra.launch.xml | Astramini |
这里以启动Astraproplus相机为例,SSH连接系统后,终端输入:
ros2 launch astra_camera astro_pro_plus.launch.xml
在这之后我们可以使用以下命令查看话题,虚拟机终端中输入
ros2 topic list
主要的几个话题如下,(示例,可能因系统而异)
话题名字 | 话题内容 |
---|---|
/camera/color/image_raw | RGB彩色图像数据 |
/camera/depth/image_raw | Depth深度图像数据 |
/camera/depth/points | Depth深度点云数据 |
/camera/ir/image_raw | IR红外图像数据 |
2.3、图像可视化
1. 使用rqt_image_view工具查看图像数据
虚拟机终端中输入:(然后在左上角选择相对应需要显示的图像话题)
ros2 run rqt_image_view rqt_image_view
2.使用python脚本查看图像数据
import cv2
import numpy as np
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from datetime import datetime
class DepthCameraSubscriberNode(Node):
def __init__(self):
super().__init__('depth_camera_subscriber')
self.subscription = self.create_subscription(
Image,
'/camera/color/image_raw',
self.depth_callback,
10
)
self.subscription # 避免subscription被当做垃圾回收
self.cv_bridge = CvBridge()
self.depth_image_count = 1
self.save_image = False
def depth_callback(self, msg):
try:
depth_image = self.cv_bridge.imgmsg_to_cv2(msg)
cv2.imshow('Depth Image', depth_image)
key = cv2.waitKey(1)
if key == ord('s') or self.save_image:
file_name = f'depth_image_{self.depth_image_count}.png'
cv2.imwrite(file_name, depth_image)
print(f'Saved depth image as {file_name}')
self.depth_image_count += 1
self.save_image = False
elif key == ord(' '):
# 按下空格键退出程序
cv2.destroyAllWindows()
rclpy.shutdown()
exit()
except Exception as e:
print('Error: ', e)
def main(args=None):
rclpy.init(args=args)
depth_camera_subscriber_node = DepthCameraSubscriberNode()
rclpy.spin(depth_camera_subscriber_node)
if __name__ == '__main__':
main()
具体参数根据系统和配置去更改,这里只以个人系统为例,如后续有任何不懂的地方,欢迎留言评论讨论!!!