保姆级教程|如何配置ROS1主从机
在机器人开发经常遇到使用两个板子通信问题,比如一个板子跑底层的运动控制,一个板子跑定位导航。为了确保两个板子之间的ROS通信流畅,我们需要在两个板子的.bashrc文件中添加必要的环境变量配置。首先,确保你的 /etc/hosts 文件中包含对方板子的IP和主机名解析。接下来,我们详细说明如何修改两个板子的.bashrc文件。
(可选) 修改第一个板子 (ubuntu-22) 的 /etc/hosts 文件
在 /etc/hosts 文件中添加第二个板子的IP和主机名解析:
sudo nano /etc/hosts
添加以下内容:
192.168.31.126 nvidia-desktop
(可选)修改第二个板子 (nvidia-desktop) 的 /etc/hosts 文件
在 /etc/hosts 文件中添加第一个板子的IP和主机名解析:
sudo nano /etc/hosts
添加以下内容:
192.168.31.125 ubuntu-22
修改第一个板子 (ubuntu-22) 的 .bashrc 文件
-
打开
.bashrc文件进行编辑:nano ~/.bashrc
-
在文件末尾添加以下内容:
# 设置ROS Master URI export ROS_MASTER_URI=http://192.168.31.125:11311 # 设置本地ROS主机名 export ROS_HOSTNAME=192.168.31.125
-
保存并关闭文件,然后使修改生效:
source ~/.bashrc
修改第二个板子 (nvidia-desktop) 的 .bashrc 文件
-
打开
.bashrc文件进行编辑:nano ~/.bashrc
-
在文件末尾添加以下内容:
# 设置ROS Master URI export ROS_MASTER_URI=http://192.168.31.125:11311 # 设置本地ROS主机名 export ROS_HOSTNAME=192.168.31.126
-
保存并关闭文件,然后使修改生效:
source ~/.bashrc
这样配置完成后,两个板子应该可以通过ROS进行低延迟通信。确保在每次修改后使用 source ~/.bashrc 命令使配置生效。
附录1:设置ROS Master URI 为什么设为11311,设为别的可以吗?
设置 ROS_MASTER_URI 中的端口号 11311 是因为这是ROS默认使用的端口号,但你可以将其设置为其他未被占用的端口号,只要确保双方都使用相同的端口即可。
以下是详细说明:
使用默认端口 11311
-
原因:
11311是ROS默认的主节点(Master)端口号。这样设置可以避免修改默认设置,减少配置错误的可能性。 -
好处:大多数ROS文档和示例都使用
11311,遵循默认值可以简化配置和调试。
使用自定义端口
你可以将端口号设置为其他值,只要确保双方一致并且端口未被其他服务占用。
修改端口号步骤
-
选择一个未被占用的端口号:例如
11411。
-
配置ROS Master:
-
在运行ROS Master的板子上(假设为
ubuntu-22),设置.bashrc文件:export ROS_MASTER_URI=http://192.168.31.125:11411 export ROS_HOSTNAME=192.168.31.125
-
-
连接到ROS Master:
-
在另一块板子(假设为
nvidia-desktop)上,设置.bashrc文件:export ROS_MASTER_URI=http://192.168.31.125:11411 export ROS_HOSTNAME=192.168.31.126
-
-
使更改生效:
source ~/.bashrc
验证自定义端口配置
-
启动ROS Master:
roscore -p 11411或者
roscore --port 11411
-
网络连接测试:在每个板子上运行
ping命令测试到对方板子的连接:ping 192.168.31.126 # 在 ubuntu-22 上 ping 192.168.31.125 # 在 nvidia-desktop 上
-
ROS通信测试:使用
rostopic和rosnode命令测试ROS话题和节点通信。例如:rostopic pub /test_topic std_msgs/String "data: 'Hello from board1'" # 在 ubuntu-22 上 rostopic echo /test_topic # 在 nvidia-desktop 上
总结
-
默认端口
11311是最常用和推荐的设置,因为它是ROS的默认值,简化了配置过程。 -
自定义端口 可以使用,但需要确保双方配置一致,并且选定的端口未被其他服务占用。
这样无论你选择使用默认端口还是自定义端口,都可以实现两个板子之间的低延迟ROS通信。
附录2:取消主从机配置
如果不再想使用ROS的主从机配置,可以通过重置相关的环境变量来恢复默认配置。以下是具体步骤:
1. 清除ROS_HOSTNAME和ROS_MASTER_URI环境变量
在当前终端会话中运行以下命令:
unset ROS_HOSTNAME unset ROS_MASTER_URI
2. 从.bashrc文件中移除相关设置
编辑您的~/.bashrc文件,移除之前添加的关于ROS_HOSTNAME和ROS_MASTER_URI的行:
nano ~/.bashrc
找到并删除以下行:
export ROS_HOSTNAME=192.168.41.3 export ROS_MASTER_URI=http://192.168.41.3:11311
保存并退出编辑器,然后重新加载.bashrc文件:
source ~/.bashrc
3. 验证恢复默认设置
在终端中运行以下命令,确保相关环境变量已被清除:
echo $ROS_HOSTNAME echo $ROS_MASTER_URI
这两个命令应该不输出任何内容,表示环境变量已经被清除。
4. 运行roscore
现在可以尝试再次运行roscore,验证是否已经恢复默认配置:
roscore
通过以上步骤,您应该能够将ROS恢复到默认的配置,不再使用主从机设置。如果仍然遇到问题,请提供具体的错误信息以便进一步诊断。
相关文章:
保姆级教程|如何配置ROS1主从机
在机器人开发经常遇到使用两个板子通信问题,比如一个板子跑底层的运动控制,一个板子跑定位导航。为了确保两个板子之间的ROS通信流畅,我们需要在两个板子的.bashrc文件中添加必要的环境变量配置。首先,确保你的 /etc/hosts 文件中…...
贝叶斯优化算法(Bayesian Optimization)及其Python 和 MATLAB 实现
贝叶斯优化算法(Bayesian Optimization)是一种基于贝叶斯统计理论的优化方法,通常用于在复杂搜索空间中寻找最优解。该算法能够有效地在未知黑盒函数上进行优化,并在相对较少的迭代次数内找到较优解,因此在许多领域如超…...
NLP - 基于bert预训练模型的文本多分类示例
项目说明 项目名称 基于DistilBERT的标题多分类任务 项目概述 本项目旨在使用DistilBERT模型对给定的标题文本进行多分类任务。项目包括从数据处理、模型训练、模型评估到最终的API部署。该项目采用模块化设计,以便于理解和维护。 项目结构 . ├── bert_dat…...
数据库备份和还原
一、备份 备份类型 1.完全备份 全备份是指对整个数据集进行完整备份。每次备份都会复制所有选定的数据,无论这些数据是否发生了变化。 2.增量备份 增量备份是指仅备份自上次备份(无论是全备份还是增量备份)以来发生变化的数据。它记录了…...
谷粒商城-个人笔记(集群部署篇一)
前言 学习视频:Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强学习文档: 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…...
Linux环境下的字节对齐现象
在Linux环境下,字节对齐是指数据在内存中的存储方式。字节对齐是为了提高内存访问的效率和性能。 在Linux中,默认情况下,结构体和数组的成员会进行字节对齐。具体的对齐方式可以通过编译器选项来控制。 在使用C语言编写程序时,可…...
没有调用memcpy却报了undefined reference to memcpy错误
现象 在第5行出现了,undefined reference to memcpy’ 1 static void printf_x(unsigned int val) 2{ 3 char buffer[32]; 4 const char lut[]{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}; 5 char *p buffer; 6 while (val || p buffer) { 7 *(p) …...
import和require的区别
import是ES6标准中的模块化解决方案,require是node中遵循CommonJS规范的模块化解决方案。 后者支持动态引入,也就是require(${path}/xx.js),前者目前不支持,但是已有提案。 前者是关键词,后者不是。 前者是编译时加…...
白骑士的Python教学高级篇 3.3 数据库编程
系列目录 上一篇:白骑士的Python教学高级篇 3.2 网络编程 SQL基础 Structured Query Language (SQL) 是一种用于管理和操作关系型数据库的标准语言。SQL能够执行各种操作,如创建、读取、更新和删除数据库中的数据(即CRUD操作)&a…...
macOS 安装redis
安装Redis在macOS上通常通过Homebrew进行,Homebrew是macOS上一个流行的包管理器。以下是安装Redis的步骤: 一 使用Homebrew安装Redis 1、安装Homebrew(如果尚未安装): 打开终端(Terminal)并执…...
【AIGC评测体系】大模型评测指标集
大模型评测指标集 (☆)SuperCLUE(1)SuperCLUE-V(中文原生多模态理解测评基准)(2)SuperCLUE-Auto(汽车大模型测评基准)(3)AIGVBench-T2…...
工厂模式之简单工厂模式
文章目录 工厂模式工厂模式分为工厂模式的角色简单工厂模式案例代码定义一个父类,三个子类定义简单工厂客户端使用输出结果 工厂模式 工厂模式属于创造型的模式,用于创建对象。 工厂模式分为 简单工厂模式:定义一个简单工厂类,根…...
2.(vue3.x+vite)调用iframe的方法(vue编码)
1、效果预览 2.编写代码 (1)主页面 <template><div><button @click="sendMessage">调用iframe,并发送信息...
实战项目——用Java实现图书管理系统
前言 首先既然是管理系统,那咱们就要实现以下这几个功能了--> 分析 1.首先是用户分为两种,一个是管理员,另一个是普通用户,既如此,可以定义一个用户类(user),在定义管理员类&am…...
利用DeepFlow解决APISIX故障诊断中的方向偏差问题
概要:随着APISIX作为IT应用系统入口的普及,其故障定位能力的不足导致了在业务故障诊断中,APISIX常常成为首要的“嫌疑对象”。这不仅导致了“兴师动众”式的资源投入,还可能使诊断方向“背道而驰”,从而导致业务故障“…...
sqlalchemy获取数据条数
1、sqlalchemy获取数据条数 在SQLAlchemy中,你可以使用count()函数来获取数据表中的记录条数。 from sqlalchemy import create_engine, MetaData, Table# 数据库连接字符串 DATABASE_URI = dialect+driver://username:password@host:port/database# 创建引擎 engine = crea…...
SpringBoot的自动配置核心原理及拓展点
Spring Boot 的核心原理几个关键点 约定优于配置: Spring Boot 遵循约定优于配置的理念,通过预定义的约定,大大简化了 Spring 应用程序的配置和部署。例如,它自动配置了许多常见的开发任务(如数据库连接、Web 服务器配…...
用随机森林算法进行的一次故障预测
本案例将带大家使用一份开源的S.M.A.R.T.数据集和机器学习中的随机森林算法,来训练一个硬盘故障预测模型,并测试效果。 实验目标 掌握使用机器学习方法训练模型的基本流程;掌握使用pandas做数据分析的基本方法;掌握使用scikit-l…...
24位DAC转换的FPGA设计及将其封装成自定义IP核的方法
在vivado设计中,为了方便的使用Block Desgin进行设计,可以使用vivado软件把自己编写的代码封装成IP核,封装后的IP核和原来的代码具有相同的功能。本文以实现24位DA转换(含并串转换,使用的数模转换器为CL4660)为例,介绍VIVADO封装IP核的方法及调用方法,以及DAC转换的详细…...
【大模型LLM面试合集】大语言模型基础_llm概念
1.llm概念 1.目前 主流的开源模型体系 有哪些? 目前主流的开源LLM(语言模型)模型体系包括以下几个: GPT(Generative Pre-trained Transformer)系列:由OpenAI发布的一系列基于Transformer架构…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
