ROS机器人Diego 1#制作(一)BOM清单

本文介绍了一款名为Diego1#的ROS机器人制作过程,使用树莓派3B+作为上位机安装ROS系统,Arduino UNO作为下位机控制底盘等硬件。文章还讨论了不同底盘对机器人稳定性的影响及相应的调整方法。

更多创客作品,请关注笔者网站园丁鸟,搜集全球极具创意,且有价值的创客作品


开源ROS机器人操作系统是机器人开发的利器,集成了大量先进的算法,而且还开源,国内也有很多人在研究,也有些原型,但网上文章多是翻译官方的英文教程,在这里我们一步一步的制作一个ROS机器人,探讨机器人制作的步骤,而且我们尽量用开源的硬件Arduino,树莓派,配件都可以在网上买到,或者用自己的一些旧的器件,机器人命名为Diego1#:
先上张Diego1#的图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UJN0obT0-1588137107994)(https://img-blog.youkuaiyun.com/20161231231653986?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXdsd2xt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
这里用了两种不同的底盘,除了底盘,其他都一样,之所以会有两种底盘,是在做第一张图所示的机器人的时候,发现底盘太小,稳定性比较差,上面加的组件越多,越是容易摔倒,索性换一个大的底盘,由于底盘的不同,需要修改Base Controller部分的参数,后面会详细讲到。

BOM清单

序号物料名称说明
1树莓派3 B+作为上位机,安装ROS机器人操作系统
2Arduino UNO作为下位机,实现对底盘等硬件设备的控制
3底盘可以自己到淘宝上选,注意一定要带码盘测速的,因为ROS要精确控制
4电源模块为树莓派3提供5V2.5A的电源
5电源9V~12V 18650充电电池
6Arduino 电机驱动板,Arduino电机驱动板L298P占有IO少
7机械臂6自由度机械臂
8其他线材,六角铜柱、螺丝等

ROS控制模型,对应的主板

这里写图片描述

<think>好的,用户想创建个可以控制两个ROS机器人的网站,使用Web技术进行远程控制。首先,我需要回顾ROS和Web通信的相关知识。根据引用[3],robot web tools提供了rosbridge,它通过WebSocket将ROS的topic和service封装成JSON消息,这样Web客户端可以通过JavaScript库如roslibjs与ROS通信。 首先,用户需要为每个机器人搭建独立的ROS环境。可能需要使用不同的命名空间或者机器名来区分两个机器人,避免topic或service冲突。例如,为每个机器人分配唯的命名空间,如robot1和robot2,这样它们的topic会变成/robot1/cmd_vel和/robot2/cmd_vel。 接下来是Web服务器的部分。用户需要建立个能够处理WebSocket连接的服务器,这里可能需要用到Node.js或者类似的框架。引用[3]提到diego server的原理,可能需要参考类似的架构。服务器需要同时连接两个ROS机器人rosbridge,并处理来自Web客户端的请求,将指令转发到对应的机器人。 然后是前端设计。使用roslibjs创建两个ROS连接实例,分别连接到两个rosbridge的WebSocket端口。每个实例负责机器人的控制。此外,可能需要使用ros2djs或ros3djs来显示机器人的状态,比如地图或传感器数据。前端界面需要有两个独立的控制面板,或者通过切换的方式选择当前控制的机器人。 安全性方面,需要考虑用户认证和授权,确保只有合法用户可以发送控制指令。同时,网络通信需要加密,使用wss://代替ws://,防止中间人攻击。引用[3]提到突破局域网限制,可能需要配置Nginx反向代理或者使用内网穿透工具,使外部网络可以访问到本地的rosbridge服务。 测试和调试也是关键步骤。需要确保两个机器人的指令不会互相干扰,特别是在并发控制时。可能需要使用ROS的多机通信配置,设置正确的ROS_MASTER_URI和ROS_HOSTNAME,确保每个机器人节点能够正确通信。 另外,用户可能希望同时监控两个机器人的状态,这需要在前端同时订阅它们的传感器topic,并实时更新界面。例如,使用roslibjs的订阅功能,分别处理每个机器人的数据。 最后,文档和示例代码的提供会帮助用户更好地理解和实现。引用[1]中的Hadabot项目可能有些基于Web的ROS2控制实例,可以参考其实现方式。同时,引用[2]的ROS学习教程可以作为补充资源,帮助用户解决ROS环境配置中的问题。 总结下来,步骤大致是:配置ROS环境、搭建Web服务器与rosbridge连接、设计前端控制界面、处理多机器人通信、确保安全措施,最后进行测试和优化。需要特别注意命名空间和通信隔离,避免指令错乱。</think>### 分步解决方案:用Web技术控制两个ROS机器人 #### 1. **搭建ROS机器人通信环境** - **为每个机器人分配独立命名空间** 在ROS中,通过命名空间隔离两个机器人的topic和service。例如: ```bash # 启动第机器人节点时添加命名空间 ROS_NAMESPACE=robot1 rosrun package node # 第二个机器人 ROS_NAMESPACE=robot2 rosrun package node ``` 此时机器人的控制topic会变为 `/robot1/cmd_vel` 和 `/robot2/cmd_vel`[^3]。 - **配置多机通信(可选)** 若机器人部署在不同设备上,需设置ROS多机通信: - 在每台机器上配置`ROS_MASTER_URI`指向主控机的ROS Master。 - 设置`ROS_HOSTNAME`为各机器的IP地址。 #### 2. **部署rosbridge服务器** - **安装rosbridge套件** ```bash sudo apt-get install ros-<distro>-rosbridge-server #ROS Noetic ``` - **启动rosbridge并开放两个WebSocket端口** 修改启动参数以支持多端口: ```bash roslaunch rosbridge_server rosbridge_websocket.launch port:=9090 # 第二个端口(需自定义launch文件或启动第二个实例) roslaunch rosbridge_server rosbridge_websocket.launch port:=9091 ``` 每个机器人通过独立端口连接[^3]。 #### 3. **构建Web服务器与前端** - **后端框架选择** 使用Node.js + Express搭建服务器,处理用户认证和指令分发: ```javascript const express = require(&#39;express&#39;); const WebSocket = require(&#39;ws&#39;); // 连接两个rosbridge实例 const wsRobot1 = new WebSocket(&#39;ws://robot1-ip:9090&#39;); const wsRobot2 = new WebSocket(&#39;ws://robot2-ip:9091&#39;); ``` - **前端集成roslibjs** 在HTML中为每个机器人创建独立的`Ros`对象: ```html <script src="https://static.robotwebtools.org/roslibjs/current/roslib.min.js"></script> <script> // 连接第机器人 const ros1 = new ROSLIB.Ros({ url: &#39;ws://your-server:9090&#39; }); // 连接第二个机器人 const ros2 = new ROSLIB.Ros({ url: &#39;ws://your-server:9091&#39; }); // 发布控制指令示例 const cmdVel1 = new ROSLIB.Topic({ ros: ros1, name: &#39;/robot1/cmd_vel&#39;, messageType: &#39;geometry_msgs/Twist&#39; }); </script> ``` #### 4. **实现双机器人控制逻辑** - **独立控制面板设计** 使用HTML/CSS创建两个控制区域,通过JavaScript绑定事件: ```javascript // 机器人1前进按钮 document.getElementById(&#39;robot1-forward&#39;).addEventListener(&#39;click&#39;, () => { const twist = new ROSLIB.Message({ linear: { x: 0.5, y: 0, z: 0 }, angular: { x: 0, y: 0, z: 0 } }); cmdVel1.publish(twist); }); ``` - **状态同步与监控** 订阅两个机器人的传感器topic并显示: ```javascript // 订阅机器人1的里程计 const odom1 = new ROSLIB.Topic({ ros: ros1, name: &#39;/robot1/odom&#39;, messageType: &#39;nav_msgs/Odometry&#39; }); odom1.subscribe((msg) => { updateRobotPosition(&#39;robot1&#39;, msg.pose.pose); }); ``` #### 5. **安全性与网络配置** - **启用HTTPS/WSS** 使用Nginx配置SSL反向代理: ```nginx server { listen 443 ssl; server_name your-domain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location /robot1-websocket { proxy_pass http://localhost:9090; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } ``` - **用户权限控制** 实现基于JWT的API鉴权: ```javascript // 后端中间件示例 app.post(&#39;/control&#39;, verifyToken, (req, res) => { if (req.user.role === &#39;admin&#39;) { forwardCommandToRobot(req.body); } }); ``` #### 6. **测试与调试** - **使用rosbag记录数据** 同时记录两个机器人的topic以验证指令隔离性: ```bash rosbag record -O dual_robot.bag /robot1/cmd_vel /robot2/cmd_vel ``` - **可视化工具集成** 在Web界面嵌入ROS3DJS显示机器人模型: ```javascript const viewer = new ROS3D.Viewer({ divID: &#39;robot1-viewer&#39;, width: 400, height: 300, ros: ros1 // 使用对应ROS连接 }); ``` --- ### 关键代码示例 **后端指令转发逻辑(Node.js)**: ```javascript app.post(&#39;/api/control&#39;, (req, res) => { const { robotId, command } = req.body; const targetWS = (robotId === 1) ? wsRobot1 : wsRobot2; targetWS.send(JSON.stringify({ op: &#39;publish&#39;, topic: `/${robotId}/cmd_vel`, msg: { linear: { x: command.speed } } })); res.status(200).send(&#39;Command sent&#39;); }); ``` **前端切换机器人控制(JavaScript)**: ```javascript let activeRobot = 1; // 当前控制的机器人ID function switchRobot(newId) { activeRobot = newId; document.querySelectorAll(&#39;.control-panel&#39;).forEach(panel => { panel.style.display = panel.id === `robot-${newId}-panel` ? &#39;block&#39; : &#39;none&#39;; }); } ``` --- ### 注意事项 1. **带宽优化**:当同时传输多机器人传感器数据时,建议压缩数据或降低更新频率。 2. **故障隔离**:为每个rosbridge连接实现心跳检测,自动重连断开的机器人而不影响另个。 3. **ROS版本兼容**:确认使用的roslibjs版本支持ROS1(Melodic/Noetic)或ROS2(根据机器人系统选择)[^1]。 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DiegoRobot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值