鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    [分享] ROS2 Web开发做个遥控器

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    roslibjs ros2 roslib web websocket
    4
    6
    2.3k
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 小鱼小
      小鱼 技术大佬
      最后由 小鱼 编辑

      ROS(机器人操作系统)是一个用于开发机器人软件的开源框架,而rosbridge_server则提供了一种在ROS和其他系统之间进行通信的方式。在本文中,我们将介绍如何通过Web页面实现一个简单的ROS遥控器,使用rosbridge_websocket连接到ROS系统,并通过按键控制机器人的运动。

      f27940a5-fe1b-499c-b870-113b20bec770-image.png

      准备工作

      首先,确保你已经安装了ROS2,并且已经启动了rosbridge_server的rosbridge_websocket插件。你可以使用以下命令安装和启动:

      sudo apt install ros-$ROS_DISTRO-rosbridge-suite 
      ros2 run rosbridge_server rosbridge_websocket
      

      这将在本地WebSocket服务器的9090端口上启动rosbridge_websocket。

      创建Web

      接着随便新建一个文件 index.html

      <!DOCTYPE html>
      <html>
      
      <head>
        <meta charset="utf-8" />
        <style>
          body {
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            height: 100vh;
            font-family: Arial, sans-serif;
          }
      
          button {
            margin: 5px;
            padding: 10px 20px;
            font-size: 18px;
            border: 2px solid #3498db;
            border-radius: 5px;
            background-color: #3498db;
            color: #ffffff;
            cursor: pointer;
            transition: background-color 0.3s;
          }
      
          button:hover {
            background-color: #2980b9;
          }
        </style>
        <script src="https://cdn.jsdelivr.net/npm/roslib@1.3.0/build/roslib.js"></script>
      </head>
      
      <body>
        <h1>ROS Web Controller</h1>
        <div>
          <button onclick="moveForward()">Forward</button>
          <button onclick="moveBackward()">Backward</button>
        </div>
        <div>
          <button onclick="moveLeft()">Left</button>
          <button onclick="stopMovement()">Stop</button>
          <button onclick="moveRight()">Right</button>
        </div>
      
        <script>
          let ros;
          let cmdVel;
      
          function startConnection() {
            ros = new ROSLIB.Ros({
              url: 'ws://localhost:9090' // 替换为你的Rosbridge服务器地址,主要将 localhost 改成你的主机IP地址,比如 ws://192.168.1.2:9090
            });
      
            ros.on('connection', () => {
              console.log('Connected to ROS Bridge');
              cmdVel = new ROSLIB.Topic({
                ros: ros,
                name: '/cmd_vel',
                messageType: 'geometry_msgs/Twist'
              });
            });
      
            ros.on('error', (error) => {
              console.error('Error connecting to ROS: ', error);
              alert('Error connecting to ROS: 9090', error);
            });
      
            ros.on('close', () => {
              console.log('Disconnected from ROS');
              alert('Disconnected from ROS');
            });
          }
      
          function move(direction) {
            if (!ros) {
              console.error('ROS connection not established');
              alert('ROS connection not established');
              return;
            }
      
            if (!cmdVel) {
              console.error('Publisher not created');
              alert('Publisher not created');
              return;
            }
      
            const twist = new ROSLIB.Message({
              linear: {
                x: direction.linear.x,
                y: direction.linear.y,
                z: direction.linear.z
              },
              angular: {
                x: direction.angular.x,
                y: direction.angular.y,
                z: direction.angular.z
              }
            });
      
            cmdVel.publish(twist);
          }
      
          function moveForward() {
            const moveForwardMsg = {
              linear: { x: 0.2, y: 0, z: 0 },
              angular: { x: 0, y: 0, z: 0 }
            };
            move(moveForwardMsg);
          }
      
          function moveBackward() {
            const moveBackwardMsg = {
              linear: { x: -0.2, y: 0, z: 0 },
              angular: { x: 0, y: 0, z: 0 }
            };
            move(moveBackwardMsg);
          }
      
          function moveLeft() {
            const moveLeftMsg = {
              linear: { x: 0, y: 0.0, z: 0 },
              angular: { x: 0, y: 0, z: 0.5 }
            };
            move(moveLeftMsg);
          }
      
          function moveRight() {
            const moveRightMsg = {
              linear: { x: 0, y: 0, z: 0 },
              angular: { x: 0, y: 0, z: -0.5 }
            };
            move(moveRightMsg);
          }
      
          function stopMovement() {
            const stopMsg = {
              linear: { x: 0, y: 0, z: 0 },
              angular: { x: 0, y: 0, z: 0 }
            };
            move(stopMsg);
          }
      
          startConnection(); // 初始化ROS连接
        </script>
      </body>
      
      </html>
      

      访问服务

      接着使用 python 来新建一个服务器:

      python3 -m http.server 
      

      接着访问:http://0.0.0.0:8000/ 就可以看到下面的界面(这个网页可以远程访问,只需要修改下访问的IP地址为你的电脑局域网地址,比如用手机可以看到这个页面,这样手机就相当于一个无线遥控器用了)

      f27940a5-fe1b-499c-b870-113b20bec770-image.png

      点击界面上的按钮就可以发布数据到 cmd_vel 话题上,连上 fishbot 就可以控制机器人移动了

      远程访问需要替换html中这一个地址:url: 'ws://localhost:9090' // 替换为你的Rosbridge服务器地址,主要将 localhost 改成你的主机IP地址,比如 ws://192.168.1.2:9090

      cbb5d113-bb09-4a3f-8ee0-5ca24f4369cf-image.png

      原理介绍

      rosbridge_websocket 节点会在本地的9090端口启动一个websocker服务,然后将 ros 数据进行互相的序列化传输,web端使用的是最常见的 websocket。

      rosbridge_websocket <----websocket(json)---->web-html

      从浏览器后台可以看到数据的传输

      b0016334-e8f7-4bdb-afd6-e20a9655f746-image.png

      新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

      1 条回复 最后回复 回复 引用 0
      • 28267785952
        无处在 ROS2开发者
        最后由 编辑

        问题如下:
        1、 http://0.0.0.0:8000/ 这个网页手机无法打开。
        2、 http://0.0.0.0:8000/ 打开的界面不一致0c2ff5ae-edc1-4be7-8b83-e34d8c782abc-image.png
        3、 cb0c1272-c9a9-473d-924f-5e9c86dd5010-image.png 能看到话题信息,但是无法控制小车移动(四驱)
        可能:9725ee0c-6e49-45b5-9ab1-0263523d4606-image.png
        是否与未替换Rosbridge服务器地址有关,不会替换。

        小鱼小 1 条回复 最后回复 回复 引用 0
        • 小鱼小
          小鱼 技术大佬 @2826778595
          最后由 编辑

          @2826778595 已经根据你的问题重新更新了文章,代码放错了少了css样式,远程访问地址确实需要修改,所有的 0.0.0.0 和 localhost 要替换成主机在局域网的ip地址,且保证能够联通,无法控制问题可能是小车需要连续发送才有效果

          新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

          1 条回复 最后回复 回复 引用 0
          • 1649824581
            164982458
            最后由 编辑

            144ff653-9b38-46ee-a042-30f9ceb93988-image.png
            web遥控器右行angular的Z轴需要改为-0.5.

            1 条回复 最后回复 回复 引用 0
            • W
              wushengxin
              最后由 编辑

              577fcc4d-ffd9-4cc7-8ff1-485d925a9c28-image.png
              网站打不开,打开网站文件是这个样子,已经替换主机ip了。

              小鱼小 1 条回复 最后回复 回复 引用 0
              • 小鱼小
                小鱼 技术大佬 @wushengxin
                最后由 编辑

                @wushengxin

                @小鱼 在 [分享] ROS2 Web开发做个遥控器 中说:

                接着访问:http://0.0.0.0:8000/ 就可以看到下面的界面(这个网页可以远程访问,只需要修改下访问的IP地址为你的电脑局域网地址,比如用手机可以看到这个页面,这样手机就相当于一个无线遥控器用了)

                这种http方式访问

                新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                1 条回复 最后回复 回复 引用 0
                • 第一个帖子
                  最后一个帖子
                皖ICP备16016415号-7
                Powered by NodeBB | 鱼香ROS