ROS(二) 在多个电脑上运行ROS

本文详细介绍了如何在两台电脑上配置ROS网络,包括设置主机名、IP地址、编辑hosts文件以实现主机名与IP的映射,并通过ping测试网络连通性。此外,还讲解了启动ROS master以及跨机器运行talker和listener的步骤,确保在不同计算机之间实现ROS节点的通信。

一、概述

ROS设计的灵魂就在于其分布式计算。一个well-written的节点不需要考虑在哪台机器上运行,它允许实时分配计算量以最大化的利用系统资源。(有一个特例——驱动节点必须运行在跟硬件设备有物理连接的机器上)。

二、网络配置

假设我们想在两台电脑上分别运行talker / listener,那么首先得配置一下网络。

1、电脑的名称-主机名(hostname):分别在两台电脑上运行$ hostname 就可以看各自的主机名了。你会发现主机名就是命令提示符中@之后的名称。如果嫌名字太长想修改名字怎么做呢?hostname保存在/etc/hostname文件中,只要修改它就可以了。

$ sudo chmod 777 /etc/hostname  //修改权限
$ vim /etc/hostname //如果没有安装vim或者不会使用,可以去查一查
$ sudo chmod 644 /etc/hostname  //再改回去

我把主机名分别改成turtlebot 和turtlebot-big了

2、ip地址:分别在两台电脑上运行$ ip addr 就可以看到ip地址了。这里假设
turtlebot 的ip为 192.168.0.76,
turtlebot-big的ip为192.168.0.45

3、按照http://wiki.

### 配置和运行电脑内置摄像头 要在 ROS 中配置并运行电脑内置摄像头,可以通过 `usb_cam` 或其他类似的包实现。以下是具体方法: #### 安装必要的依赖项 首先需要确保已安装 `usb_cam` 包以及相关的驱动程序。如果没有安装,则通过以下命令完成安装: ```bash sudo apt-get install ros-<your_ros_distro>-usb-cam ``` 其中 `<your_ros_distro>` 是指代您的 ROS 发行版名称(如 noetic、melodic 等)。[^1] #### 启动 USB 摄像头节点 启动 `usb_cam` 节点以发布来自内置摄像头的图像数据。创建一个新的 launch 文件或者直接在终端中执行以下命令: ```bash roslaunch usb_cam usb_cam-test.launch video_device:=/dev/video0 image_width:=640 image_height:=480 pixel_format:=yuyv camera_frame_id:=usb_cam ``` 上述命令中的 `/dev/video0` 表示默认的第一个摄像头设备路径,通常对应于笔记本电脑上的内置摄像头。如果存在多个摄像头,请根据实际情况更改该路径。 对于像素格式选项 (`pixel_format`) ,常见的值包括但不限于 yuv422 (即 yuyv)、mjpeg 和 rgb8 。可以根据需求选择合适的编码方式。[^4] #### 图像查看器订阅主题 为了验证是否正常工作,可以使用 rqt_image_view 工具来实时预览捕获到的画面: ```bash rosrun rqt_image_view rqt_image_view ``` 此时应该能够看到由 /usb_cam/image_raw 主题发布的原始未压缩帧序列。[^3] #### 相机标定过程简介 当发现视觉效果不佳或测量精度不足时,可能是因为当前使用的相机参数并不适合特定场景下的应用场合。这时就需要重新对标记好的图案进行拍摄从而获得更精确的新一组内外部参数矩阵。整个流程大致如下所示: 1. 准备好黑白相间的棋盘格纸张作为参照物; 2. 将其放置在一个平坦表面上,并让镜头尽可能多地覆盖不同角度视场范围内的各个部分; 3. 利用专门编写的小型应用程序采集多组样本图片存档备用; 4. 把所得结果导入至 OpenCV 库函数 cv::calibrateCamera() 内计算得出最终数值保存下来供后续调用即可。[^5] ```python import numpy as np import cv2 from matplotlib import pyplot as plt criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) objp = np.zeros((7*9,3), np.float32) objp[:,:2] = np.mgrid[0:9,0:7].T.reshape(-1,2)*20 axis = np.float32([[3,0,0], [0,3,0], [0,0,-3]]).reshape(-1,3) def draw(img, corners, imgpts): corner = tuple(corners[0].ravel()) img = cv2.line(img, corner, tuple(imgpts[0].ravel()), (255,0,0), 5) img = cv2.line(img, corner, tuple(imgpts[1].ravel()), (0,255,0), 5) img = cv2.line(img, corner, tuple(imgpts[2].ravel()), (0,0,255), 5) return img for fname in glob.glob('*.jpg'): img = cv2.imread(fname) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret,corners=cv2.findChessboardCorners(gray,(9,7)) if ret==True: objpoints.append(objp) corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) imgpoints.append(corners2) img = cv2.drawChessboardCorners(img, (9,7), corners2,ret) cv2.imshow('img',img) cv2.waitKey(500) cv2.destroyAllWindows() ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None) np.savez("B.npz",mtx=mtx,dist=dist,rvecs=rvecs,tvecs=tvecs) print(mtx) print(dist) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值