当前位置:   article > 正文

rosweb使用,roslibs使用,ros2djs,ros3djs具体使用_ros web

ros web

rosweb使用,roslibs使用,ros2djs,ros3djs具体使用

1.与ros建立链接

  1.   var ros = new ROSLIB.Ros({//这行代码创建了一个名为ros的ROS对象。它是与ROS通信的核心对象,用于与ROS服务器建立连接以及发送和接收ROS消息。
  2.       url : 'ws://localhost:9090'
  3.     });
  4. ros.on('error', function(error) { // 这是一个错误事件处理程序,当在后端发生错误时触发。它将执行一些操作来处理错误,例如在页面上显示适当的错误消息,并在控制台打印错误信息。
  5. // 处理连接错误
  6. });
  7. ros.on('connection', function() {//这是一个连接成功事件处理程序,在成功建立与rosbridge WebSocket服务器的连接时触发。它将执行一些操作来指示连接成功,例如在页面上显示连接成功的消息。
  8. // 处理连接建立
  9. });
  10. ros.on('close', function() {//这是一个连接关闭事件处理程序,在与rosbridge WebSocket服务器的连接关闭时触发。它将执行一些操作来指示连接已关闭,例如在页面上显示连接已关闭的消息。
  11. 处理连接关闭
  12. });

2.二维地图可视化

  1. // Create the main viewer.
  2. var viewer = new ROS2D.Viewer({
  3. divID : 'nav',
  4. width : 350,
  5. height : 400
  6. });
  7. // Setup the nav client.
  8. var nav = NAV2D.OccupancyGridClientNav({
  9. ros : ros,
  10. rootObject : viewer.scene,
  11. viewer : viewer,
  12. withOrientation : 'true',//可以在地图上触发点操作
  13. serverName : '/move_base'
  14. });
  15. }

3.三维地图可视化

  1. var viewer3d= new ROS3D.Viewer({
  2. // background: '#cccccc',
  3. divID : 'nav3d',
  4. width : 1200,
  5. height : 1200,
  6. antialias : true
  7. // near : 0.01,//0.01
  8. //far: 1000,//1000
  9. });
  10. // 监听相机变化事件
  11. viewer3d.cameraControls.addEventListener('change', function() {
  12. // 监听 position.x 值的变化
  13. console.log("previousPositionX: ",viewer3d.camera.position.x);
  14. console.log("previousPositionY: ",viewer3d.camera.position.y);
  15. console.log("previousPositionZ: ",viewer3d.camera.position.z);
  16. var cameraRotationX = viewer3d.camera.rotation.x;
  17. var cameraRotationY = viewer3d.camera.rotation.y;
  18. var cameraRotationZ = viewer3d.camera.rotation.z;
  19. console.log("cameraRotationX: ",cameraRotationX);
  20. console.log("cameraRotationY: ",cameraRotationY);
  21. console.log("cameraRotationZ: ",cameraRotationZ);
  22. console.log("phiDelta: ",viewer3d.cameraControls.camera.phiDelta);
  23. console.log("thetaDelta: ",viewer3d.cameraControls.camera.thetaDelta);
  24. // 监听 zoom 值的变化
  25. console.log("previousZoom: ",viewer3d.camera.zoom);
  26. });
  27. var grid = new ROS3D.Grid({
  28. // ros : ros,
  29. cellSize: 0.5, 每个网格单元的尺寸
  30. color: '#cccccc',// '#cccccc' window.createjs.Graphics.getRGB(255, 0, 0,1), // 网格的颜色,使用十六进制表示 x000000
  31. lineWidth: 2,//this.lineWidth
  32. num_cells: 20, 网格单元的数量
  33. });
  34. // 调整位置
  35. grid.position.x = 1; // 在 x 轴上移动网格
  36. grid.position.y = 2; // 在 y 轴上移动网格
  37. grid.position.z = -3; // 在 z 轴上移动网格
  38. // 使用欧拉角旋转网格
  39. grid.rotation.x = Math.PI / 2; // 绕 x 轴旋转 90 度
  40. grid.rotation.y = Math.PI; // 绕 y 轴旋转 180 度
  41. grid.rotation.z = Math.PI / 4; // 绕 z 轴旋转 45 度
  42. // 或者使用四元数旋转网格
  43. // grid.quaternion.setFromAxisAngle(axis, angle);
  44. // 调整缩放
  45. grid.scale.x = 0.5; // 在 x 轴上放大网格的大小
  46. grid.scale.y = 0.5; // 在 y 轴上缩小网格的大小
  47. grid.scale.z = 0.5; // 在 z 轴上保持网格的大小不变
  48. viewer3d.addObject(grid);
  49. // Setup the marker client.
  50. var gridClient = new ROS3D.OccupancyGridClient({
  51. ros : ros,
  52. topic :'/map',
  53. rootObject : viewer3d.scene,
  54. continuous: true
  55. });

3维坐标显示

  1. //------------------ 页面上坐标显示-------------------------------
  2. var tf2_topic = new ROSLIB.Topic({
  3. ros: this.ros,
  4. name: '/tf',
  5. messageType: 'tf2_msgs/TFMessage',
  6. });
  7. var tfClient = new ROSLIB.TFClient({
  8. ros: this.ros,
  9. angularThres: 0.01,
  10. fixedFrame: '/map',//this.config.globalOptions.fixedFrame /base_link
  11. transThres: 0.01,
  12. rate: 10.0
  13. });
  14. var tfNode;
  15. function tf_callback(frame,tf){
  16. var tfObj = new ROS3D.Axes({
  17. shaftRadius: 0.05,
  18. headLength: 0.001,
  19. headRadius: 0.001
  20. });
  21. tfObj.scale.set(0.1, 0.1, 0.1);
  22. if (tfNode) {
  23. viewer3d.scene.remove(tfNode);
  24. }
  25. tfNode = new ROS3D.SceneNode({
  26. frameID: '/map',//this.config.globalOptions.fixedFrame /base_link
  27. tfClient: tfClient,
  28. object: tfObj,
  29. pose: {
  30. position: tf.translation,
  31. orientation: tf.rotation
  32. }
  33. });
  34. viewer3d.addObject(tfNode);
  35. }
  36. function addFrame(frame) {
  37. tfClient.subscribe(frame, function(tf) {
  38. tf_callback( frame, tf);
  39. });
  40. }
  41. tf2_topic.subscribe(function(msg) {
  42. for (var t of msg.transforms) {
  43. console.log("t.child_frame_id: ",t.child_frame_id);
  44. addFrame(t.child_frame_id)
  45. tf2_topic.unsubscribe();
  46. }
  47. });

4.三维 全局路径

  1. 显示全局路径
  2. // Setup the tf client.
  3. var tfClient = new ROSLIB.TFClient({
  4. ros : ros,
  5. angularThres : 0.01,
  6. transThres : 0.01,
  7. rate : 10.0
  8. fixedFrame : '/map'
  9. });
  10. var pathDisplay = new ROS3D.Path({
  11. ros: ros,
  12. tfClient: tfClient,
  13. rootObject: viewer.scene,
  14. topic: '/move_base/NavfnROS/plan',//全局路路径
  15. color: 0xcc00,
  16. })
  17. viewer.addObject(pathDisplay);

三维显示车体

  1. // Setup the tf client.
  2. var tfClient = new ROSLIB.TFClient({
  3. ros : ros,
  4. angularThres : 0.01,
  5. transThres : 0.01,
  6. rate : 10.0,
  7. fixedFrame : '/map'
  8. });
  9. // Setup the Polygon client.
  10. var gridClient = new ROS3D.Polygon({
  11. ros: ros,
  12. tfClient: tfClient,
  13. rootObject: viewer.scene,
  14. topic: '/move_base/global_costmap/footprint',//显示车体
  15. });
  16. viewer.addObject(gridClient);

显示雷达

  1. // Setup the scan client.
  2. var gridClient = new ROS3D.LaserScan({
  3. ros: ros,
  4. tfClient: tfClient,
  5. rootObject: viewer.scene,
  6. topic: '/scan',
  7. max_pts: 1000,
  8. pointRatio: 3,
  9. messageRatio: 4,
  10. material: { color: 0xcc0000,size: 4, sizeAttenuation: false ,alphaTest: 0.5},
  11. });

 点云

  1. var cloudClient = new ROS3D.PointCloud2({
  2. ros: ros,
  3. tfClient: tfClient,
  4. rootObject: viewer.scene,
  5. topic: '/royale_camera_driver/point_cloud',
  6. max_pts: "10000000",
  7. material: { size: 0.01, color: 0xffeeff }
  8. });
  9. }

车体方向

  1. // Setup the PoseWithCovariance client.
  2. var gridClient = new ROS3D.PoseWithCovariance({
  3. ros: ros,
  4. tfClient: tfClient,
  5. rootObject: viewer.scene,
  6. topic: '/amcl_pose',//这个是车体方向
  7. color: 0xcc00
  8. });

2.发布topic

  1. // Publishing a Topic 发布topic
  2. // ------------------
  3. // First, we create a Topic object with details of the topic's name and message type.
  4. var cmdVel = new ROSLIB.Topic({
  5. ros : ros,
  6. name : '/cmd_vel',
  7. messageType : 'geometry_msgs/Twist'
  8. });
  9. // Then we create the payload to be published. The object we pass in to ros.Message matches the
  10. // fields defined in the geometry_msgs/Twist.msg definition.
  11. var twist = new ROSLIB.Message({
  12. linear : {
  13. x : 0.1,
  14. y : 0.2,
  15. z : 0.3
  16. },
  17. angular : {
  18. x : -0.1,
  19. y : -0.2,
  20. z : -0.3
  21. }
  22. });
  23. // And finally, publish.
  24. cmdVel.publish(twist);

订阅topic

  1. //Subscribing to a Topic 订阅topic
  2. //----------------------
  3. // Like when publishing a topic, we first create a Topic object with details of the topic's name
  4. // and message type. Note that we can call publish or subscribe on the same topic object.
  5. var listener = new ROSLIB.Topic({
  6. ros : ros,
  7. name : '/listener',
  8. messageType : 'std_msgs/String'
  9. });
  10. // Then we add a callback to be called every time a message is published on this topic.
  11. listener.subscribe(function(message) {
  12. console.log('Received message on ' + listener.name + ': ' + message.data);
  13. // If desired, we can unsubscribe from the topic as well.
  14. listener.unsubscribe();
  15. });

创建service 客户端

  1. // Calling a service 创建service 客户端
  2. // -----------------
  3. // First, we create a Service client with details of the service's name and service type.
  4. var addTwoIntsClient = new ROSLIB.Service({
  5. ros : ros,
  6. name : '/add_two_ints',
  7. serviceType : 'rospy_tutorials/AddTwoInts'
  8. });
  9. // Then we create a Service Request. The object we pass in to ROSLIB.ServiceRequest matches the
  10. // fields defined in the rospy_tutorials AddTwoInts.srv file.
  11. var request = new ROSLIB.ServiceRequest({
  12. a : 1,
  13. b : 2
  14. });
  15. // Finally, we call the /add_two_ints service and get back the results in the callback. The result
  16. // is a ROSLIB.ServiceResponse object.
  17. addTwoIntsClient.callService(request, function(result) {
  18. console.log('Result for service call on ' + addTwoIntsClient.name + ': ' + result.sum);
  19. });

创建service服务端

  1. // Advertising a Service 创建service服务端
  2. // ---------------------
  3. // The Service object does double duty for both calling and advertising services
  4. var setBoolServer = new ROSLIB.Service({
  5. ros : ros,
  6. name : '/set_bool',
  7. serviceType : 'std_srvs/SetBool'
  8. });
  9. // Use the advertise() method to indicate that we want to provide this service
  10. setBoolServer.advertise(function(request, response) {
  11. console.log('Received service request on ' + setBoolServer.name + ': ' + request.data);
  12. response['success'] = true;
  13. response['message'] = 'Set successfully';
  14. return true;
  15. });

发送action客户端

  1. ar movebaseClient = new ROSLIB.ActionClient({//Action服务
  2. ros: ros,
  3. serverName: "/move_base",
  4. actionName: "move_base_msgs/MoveBaseAction",
  5. });
  6. sendGoal(6.2, 3.97, 0.00, 1.00);
  7. function sendGoal(posX, posY, rZ, rW) {
  8. if (
  9. posX !== undefined &&
  10. posY !== undefined &&
  11. oriZ !== undefined &&
  12. oriW !== undefined
  13. ) {
  14. goalMsg = new ROSLIB.Message({
  15. target_pose: {
  16. header: {
  17. frame_id: "map",
  18. // stamp: Date.now()
  19. },
  20. pose: {
  21. position: {
  22. x: posX,
  23. y: posY,
  24. z: 0,
  25. },
  26. orientation: {
  27. x: 0,
  28. y: 0,
  29. z: rZ,
  30. w: rW,
  31. },
  32. },
  33. },
  34. });
  35. }
  36. goal = new ROSLIB.Goal({
  37. actionClient: movebaseClient,
  38. goalMessage: goalMsg,
  39. });
  40. // Print out their output into the terminal.
  41. goal.on('feedback', function(feedback) {
  42. console.log('Feedback: ' + feedback.sequence);
  43. });
  44. goal.on('result', function(result) {
  45. console.log('Final Result: ' + result.sequence);
  46. });
  47. goal.send();
  48. }

action客户端2

  1. // The ActionClient
  2. // ----------------
  3. var fibonacciClient = new ROSLIB.ActionClient({
  4. ros : ros,
  5. serverName : '/fibonacci',
  6. actionName : 'actionlib_tutorials/FibonacciAction'
  7. });
  8. // Create a goal.
  9. var goal = new ROSLIB.Goal({
  10. actionClient : fibonacciClient,
  11. goalMessage : {
  12. order : 7
  13. }
  14. });
  15. // Print out their output into the terminal.
  16. goal.on('feedback', function(feedback) {
  17. console.log('Feedback: ' + feedback.sequence);
  18. });
  19. goal.on('result', function(result) {
  20. console.log('Final Result: ' + result.sequence);
  21. });
  22. // Send the goal to the action server.
  23. goal.send();

ActionServer 服务端

  1. //创建一个Fibonacci Action Server对象fibonacciServer,使用ros作为ROS连接对象,/fibonacci作为服务器名称,actionlib_tutorials/FibonacciAction作为Action的消息类型。
  2. this.fibonacciServer = new ROSLIB.SimpleActionServer({
  3. ros : ros,
  4. serverName : '/fibonacci',
  5. actionName : 'actionlib_tutorials/FibonacciAction'
  6. });
  7. this.canceled = false;//定义一个canceled变量,用于标记是否已取消操作。
  8. var that=this;
  9. //handle fibonacci action request.
  10. //创建一个goal事件的监听器,处理Fibonacci Action请求。
  11. /**
  12. 在goal事件的处理函数中,接收到goalMessage表示Action请求的目标消息。
  13. 初始化一个空数组fibonacciSequence,并将0和1添加到数组中作为初始序列。
  14. 使用for循环生成Fibonacci序列,将每个数字添加到fibonacciSequence数组中。
  15. 在每次迭代时,检查that.canceled变量的值,如果已被设置为true,则表示操作已被取消,设置Action服务器为预取消状态(setPreempted())。
  16. 将生成的Fibonacci序列作为反馈(feedback)发送给客户端,使用sendFeedback()方法。
  17. 循环结束后,将最终的Fibonacci序列作为结果(result)发送给客户端,使用setSucceeded()方法。
  18. */
  19. this.fibonacciServer.on('goal', function(goalMessage) {
  20. console.log(goalMessage);
  21. fibonacciSequence = [];
  22. fibonacciSequence.push(0);
  23. fibonacciSequence.push(1);
  24. for (var i = 1; i < goalMessage.order; i++ ) {
  25. fibonacciSequence.push( fibonacciSequence[i] + fibonacciSequence[i-1] );
  26. if (that.canceled === true ) {
  27. console.log("Action server preempted");
  28. that.fibonacciServer.setPreempted();
  29. }
  30. console.log(fibonacciSequence);
  31. //send feedback
  32. var feedback = { sequence: fibonacciSequence };
  33. that.fibonacciServer.sendFeedback(fibonacciSequence);
  34. }
  35. //send result
  36. var result = { sequence: fibonacciSequence};
  37. that.fibonacciServer.setSucceeded(result);
  38. });
  39. //创建一个cancel事件的监听器,处理Action取消请求。在cancel事件的处理函数中,将that.canceled变量设置为true,表示操作已被取消。
  40. this.fibonacciServer.on('cancel', function(goalMessage){
  41. that.canceled = true;
  42. });

设置参数

  1. // Setting a param value 设置参数
  2. // ---------------------
  3. ros.getParams(function(params) {
  4. console.log(params);
  5. });
  6. // First, we create a Param object with the name of the param.
  7. var maxVelX = new ROSLIB.Param({
  8. ros : ros,
  9. name : 'max_vel_y'
  10. });
  11. //Then we set the value of the param, which is sent to the ROS Parameter Server.
  12. maxVelX.set(0.8);
  13. maxVelX.get(function(value) {
  14. console.log('MAX VAL: ' + value);
  15. });

 获取参数

  1. // Getting a param value  获取参数
  2. // ---------------------
  3. var favoriteColor = new ROSLIB.Param({
  4. ros : ros,
  5. name : 'favorite_color'
  6. });
  7. favoriteColor.set('red');
  8. favoriteColor.get(function(value) {
  9. console.log('My robot\'s favorite color is ' + value);
  10. });

 获取urdf

  1. 获取urdf
  2. // Get the URDF value from ROS.
  3. var param = new ROSLIB.Param({
  4. ros : ros,
  5. name : 'robot_description'
  6. });
  7. param.get(function(param) {
  8. // Setup the loader for the URDF.
  9. var urdfModel = new ROSLIB.UrdfModel({
  10. string : param
  11. });
  12. console.log(urdfModel);
  13. });

创建tf

  1. 创建tf
  2. // TF Client
  3. // ---------
  4. var tfClient = new ROSLIB.TFClient({
  5. ros : ros,
  6. fixedFrame : 'world',
  7. angularThres : 0.01,
  8. transThres : 0.01
  9. });
  10. // Subscribe to a turtle.
  11. tfClient.subscribe('turtle1', function(tf) {
  12. console.log(tf);
  13. });

一个简单的数学示例,演示了在ROS JavaScript库(roslib.js)中使用ROS消息类型进行向量、四元数、姿态和变换的操作。

  1. // Let's start by adding some vectors.
  2. var v1 = new ROSLIB.Vector3({//创建一个Vector3类型的对象v1,并设置其x、y、z分量为1、2和3。
  3. x : 1,
  4. y : 2,
  5. z : 3
  6. });
  7. var v2 = v1.clone();//使用clone方法创建v2,它是v1的副本
  8. v1.add(v2);//使用add方法将v2添加到v1,修改了v1对象。
  9. console.log(v1);//使用console.log打印输出v1对象。
  10. // Now let's play with some quaternions.
  11. var q1 = new ROSLIB.Quaternion({//创建一个Quaternion类型的对象q1,并设置其x、y、z和w分量为0.1、0.2、0.3和0.4。
  12. x : 0.1,
  13. y : 0.2,
  14. z : 0.3,
  15. w : 0.4
  16. });
  17. var q2 = q1.clone();//使用clone方法创建q2,它是q1的副本。
  18. q1.multiply(q2);//使用multiply方法将q2乘以q1,修改了q1对象。
  19. q1.invert();//使用invert方法将q1取反,修改了q1对象。
  20. console.log(q1);//使用console.log打印输出q1对象。
  21. // Let's copy the results into a pose.
  22. var p = new ROSLIB.Pose({//代码创建了一个Pose对象p,其中包含了上述计算得到的v1和q1:
  23. position : v1,
  24. orientation : q1
  25. });
  26. console.log(p);
  27. // Finally, let's play with some transforms.
  28. var tf = new ROSLIB.Transform({//创建一个Transform类型的对象tf,并设置其translation为v2,rotation为q2。
  29. translation : v2,
  30. rotation : q2
  31. });
  32. p.applyTransform(tf);//使用applyTransform方法将tf应用于p,修改了p对象。
  33. console.log(p);//使用console.log打印输出最终的p对象。

整体上,这段代码展示了ROS JavaScript库中的一些基本数学操作,包括向量的相加、四元数的乘法和取反,以及姿态和变换的应用。在JavaScript控制台中,您可以查看这些对象的输出结果。

二.克隆 EESC/USP Mobile Robotics Laboratory · GitHub/ros3djs项目

git clone https://github.com/RobotWebTools/ros3djs.git

运行test文件夹中的项目

在项目中安装相关的依赖项: 

  1. cd ros3djs
  2. npm install chai eventemitter2
  3. npm install -g mocha

执行:

mocha test/quaternion.test.js

报错:

Error: Not supported at Object.exports.doImport (/home/sukai/.nvm/versions/node/v10.19.0/lib/node_modules/mocha/lib/nodejs/esm-utils.js:35:41) at formattedImport (/home/sukai/.nvm/versions/node/v10.19.0/lib/node_modules/mocha/lib/nodejs/esm-utils.js:9:28) at Object.exports.requireOrImport (/home/sukai/.nvm/versions/node/v10.19.0/lib/node_modules/mocha/lib/nodejs/esm-utils.js:42:34) at Object.exports.loadFilesAsync (/home/sukai/.nvm/versions/node/v10.19.0/lib/node_modules/mocha/lib/nodejs/esm-utils.js:100:34) at Mocha.loadFilesAsync (/home/sukai/.nvm/versions/node/v10.19.0/lib/node_modules/mocha/lib/mocha.js:447:19) at singleRun (/home/sukai/.nvm/versions/node/v10.19.0/lib/node_modules/mocha/lib/cli/run-helpers.js:125:15) at exports.runMocha (/home/sukai/.nvm/versions/node/v10.19.0/lib/node_modules/mocha/lib/cli/run-helpers.js:190:10) at Object.exports.handler (/home/sukai/.nvm/versions/node/v10.19.0/lib/node_modules/mocha/lib/cli/run.js:370:11) at innerArgv.then.argv (/home/sukai/.nvm/versions/node/v10.19.0/lib/node_modules/mocha/node_modules/yargs/build/index.cjs:443:71) at process._tickCallback (internal/process/next_tick.js:68:7) at Function.Module.runMain (internal/modules/cjs/loader.js:834:11) at startup (internal/bootstrap/node.js:283:19) at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)

解决:

该错误表明Mocha不支持ES模块的导入。Mocha目前仅支持CommonJS模块的导入方式。

您在运行mocha test/quaternion.test.js时遇到了该问题。解决此问题的一种方法是将测试文件的扩展名从.js更改为.mjs,这将指示Node.js以ES模块的方式加载该文件。

请按照以下步骤尝试修复该问题:

  1. 将测试文件quaternion.test.js的扩展名更改为.mjs,即quaternion.test.mjs

  2. 修改测试文件中的导入语句:

    • require('chai').expect修改为import { expect } from 'chai'
    • require('eventemitter2').EventEmitter2修改为import EventEmitter2 from 'eventemitter2'
    • require('..')修改为import ROSLIB from '..'

quaternion.test.js修改后quaternion.test.mjs的文件名

quaternion.test.mjs头部修改后的结果:

  1. //var expect = require('chai').expect;
  2. import { expect } from 'chai';
  3. //var ROSLIB = require('..');
  4. import ROSLIB from '..';
  1. 在终端中使用以下命令运行测试:

  1. cd ros3djs
  2. mocha --experimental-modules test/quaternion.test.mjs

运行结果:

  1.   Quaternion
  2.     creation
  3.       ✔ should return an identity quaternion when no params are specified
  4.       ✔ should return an identity quaternion when null is specified
  5.       ✔ should return a quaternion matching the options hash
  6.       ✔ should return a quaternion matching the options
  7.     conjugation
  8.       ✔ should conjugate itself
  9.   5 passing (5ms)
  10. 运行了Mocha测试框架,并成功通过了5个测试用例的测试结果。

解释测试结果:

  • Quaternion 是测试套件的名称。
  • creation 是嵌套在 Quaternion 测试套件中的一个子套件,用于测试创建四元数的功能。
    • should return an identity quaternion when no params are specified 通过了该测试用例,它验证了当未指定任何参数时,创建的四元数是单位四元数(identity quaternion)。
    • should return an identity quaternion when null is specified 通过了该测试用例,它验证了当指定参数为null时,创建的四元数是单位四元数。
    • should return a quaternion matching the options hash 通过了该测试用例,它验证了通过选项哈希(options hash)创建的四元数与预期匹配。
    • should return a quaternion matching the options 通过了该测试用例,它验证了通过选项对象创建的四元数与预期匹配。
  • conjugation 是嵌套在 Quaternion 测试套件中的另一个子套件,用于测试四元数的共轭功能。
    • should conjugate itself 通过了该测试用例,它验证了对一个四元数执行共轭操作后,结果与预期一致。

总结: 这个测试运行了Quaternion对象的几个功能的测试用例,并且所有的测试用例都通过了(passing)。每个测试用例都有一个描述和一个检查条件,如果条件满足,那么该测试用例将通过。通过了所有的测试用例意味着在测试过程中,代码行为与预期一致。

三.克隆 GitHub - EESC-LabRoM/rosweb: Web based supervisory system for ROS rosweb 项目

git clone https://github.com/EESC-LabRoM/rosweb.git

安装依赖:

  1. cd rosweb
  2. npm install

报错:

Downloading binary from https://npm.taobao.org/mirrors/node-sass//v3.13.1/linux-x64-64_binding.node
Cannot download "https://npm.taobao.org/mirrors/node-sass//v3.13.1/linux-x64-64_binding.node": 

HTTP error 404 Not Found

Hint: If github.com is not accessible in your location
      try setting a proxy via HTTP_PROXY, e.g. 

      export HTTP_PROXY=http://example.com:1234

or configure npm proxy via

      npm config set proxy http://example.com:8080

> node-sass@3.13.1 postinstall /home/sukai/workspace/roskaiyuanweb/rosweb/node_modules/node-sass
> node scripts/build.js

这个错误信息表示在尝试从https://npm.taobao.org/mirrors/node-sass//v3.13.1/linux-x64-64_binding.node下载node-sass的二进制文件时,服务器返回了404 Not Found错误。这通常意味着服务器上没有你尝试下载的文件。

这可能是因为你尝试安装的node-sass版本(3.13.1)与你的Node.js版本不兼容。在错误信息中,它提到了"please upgrade to graceful-fs 4 for compatibility with current and future versions of Node.js",这可能意味着你需要更新你的node-sass版本。

你可以尝试更新node-sass到最新版本,或者至少到一个与你的Node.js版本兼容的版本。你可以使用以下命令来安装最新版本的node-sass

npm install node-sass@latest 

如果你在package.json文件中指定了node-sass的版本,你可能需要在那里更新版本号。

另外,你也可以考虑使用dart-sass代替node-sassdart-sassnode-sass的替代品,它是用Dart编写的,因此不需要二进制绑定,安装起来更容易。你可以使用以下命令来安装dart-sass

npm install sass 

如果你选择使用dart-sass,你需要在你的构建工具或脚本中替换node-sas

参考:rosbridge_suite入门教程-rosweb安装 - 创客智造/爱折腾智能机器人

  1. cd rosweb
  2. npm install -g cnpm --registry=https://registry.npm.taobao.org

安装插件jshint

npm i gulp-jshint jshint

安装插件natives

npm i natives@1.1.6

控制台输入gulp

gulp

报错:

Command 'gulp' not found, but can be installed with:

sudo apt install gulp
 

这个错误表示你的系统中没有找到gulp命令。gulp是一个流行的JavaScript任务运行器,用于自动化开发工作流程,如编译、压缩、测试等。

错误消息建议你使用sudo apt install gulp命令来安装gulp,但这只会安装全局的gulp命令,而不是项目级别的gulp

在大多数情况下,你应该使用npm来安装gulp,而不是使用apt。你可以使用以下命令来全局安装gulp

npm install --global gulp-cli 

这将安装gulp命令行工具(gulp-cli),你可以在任何地方使用gulp命令。

然后,你需要在你的项目中安装gulp。你可以使用以下命令来安装:

npm install --save-dev gulp 

这将在你的项目中安装gulp,并将其添加到你的package.json文件的devDependencies字段。

安装完成后,你应该能够在你的项目中使用gulp命令了。如果你仍然无法使用gulp命令,你可能需要检查你的PATH环境变量,确保它包含了npm全局模块的路径。

控制台输入 gulp

gulp


[10:15:54] Using gulpfile ~/workspace/roskaiyuanweb/rosweb/gulpfile.js
[10:15:54] Starting 'html'...
[10:15:54] Starting 'ts'...
[10:15:54] Starting 'sass'...
[10:15:54] Starting 'sass_wdgt'...
[10:15:54] Starting 'img'...
[10:15:54] Starting 'hbs'...
[10:15:54] Finished 'hbs' after 11 ms
[10:15:54] Starting 'jsl'...
[10:15:54] Starting 'wdgt'...
[10:15:54] Starting 'wdgt_ts'...
[10:15:54] Starting 'start'...
[10:15:54] Webserver started at http://0.0.0.0:8000
[10:15:54] Finished 'start' after 3.5 ms
[10:15:55] Finished 'html' after 740 ms
[10:15:55] Finished 'sass' after 731 ms
[10:15:55] Finished 'sass_wdgt' after 884 ms
[10:15:55] Finished 'jsl' after 898 ms
[10:15:55] Finished 'wdgt_ts' after 901 ms
[10:15:55] Finished 'ts' after 982 ms
[10:15:55] Finished 'img' after 971 ms
[10:15:55] Finished 'wdgt' after 960 ms
[10:15:55] Starting 'build'...
[10:15:55] Finished 'build' after 26 μs
[10:15:55] Starting 'default'...
[10:15:55] Finished 'default' after 732 ns
 

你运行的gulp命令正在执行一系列的任务,包括编译TypeScript(ts任务)、编译Sass(sass任务)、处理图片(img任务)、处理JavaScript(jsl任务)等。这些任务都已经完成了。

然后,gulp启动了一个Web服务器(start任务),并在http://0.0.0.0:8000上运行。这个Web服务器会持续运行,直到你停止gulp命令。这就是为什么看起来像是gulp命令"卡住"了。

实际上,gulp并没有卡住,它正在运行Web服务器。你可以在浏览器中访问http://localhost:8000(或者你的机器的IP地址,如果你在其他机器上),你应该能看到你的Web应用。

如果你想停止Web服务器,你可以在命令行中按Ctrl+C。这将停止gulp命令,包括它启动的Web服务器。

nginx安装
        下载地址:http://nginx.org/en/download.html

        选择Windows最新稳定版下载,浏览器下载很慢,建议复制下载链接迅雷下载
        

1.  ubuntu 安装 nginx 
sudo apt-get install nginx

配置nginx(1)

  • 编译完成生产dist目录,拷贝到nginx的html目录
  • 假设nginx的默认目录在/var/www/html,删除html目录
  • 假设rosweb在~/rosweb, 拷贝
cp -r ~/rosweb/dist /var/www/html
  • 访问http://localhost即可

或者修改配置文件:

sudo gedit /etc/nginx/sites-enabled/default

找到 root /var/www/html; 改:

root  /home/sukai/workspace/roskaiyuanweb/rosweb/dist;
重启 nginx:
sudo service nginx restart
 

你可以使用curlwget命令来下载文件。这些命令在大多数Unix-like系统(如Linux和macOS)中都可用。

以下是使用curl下载文件的命令:

curl -O http://static.robotwebtools.org/threejs/current/three.min.js

或者

curl -O https://github.com/mrdoob/three.js/blob/master/build/three.min.js

以下是使用wget下载文件的命令:

wget http://static.robotwebtools.org/threejs/current/three.min.js

或者

wget https://github.com/mrdoob/three.js/blob/master/build/three.min.js

这些命令将会下载three.min.js文件到你当前的工作目录。

如果你在Windows系统上,你可能需要安装额外的软件来运行这些命令。你也可以直接在浏览器中打开这个链接,然后右键点击页面,选择"保存为"来下载文件。

修改文件:

  1. /home/sukai/workspace/roskaiyuanweb/rosweb/dist
  2. <!--
  3. <script type="text/javascript" src="http://static.robotwebtools.org/EventEmitter2/0.4.14/eventemitter2.min.js"></script>
  4. <script type="text/javascript" src="http://static.robotwebtools.org/roslibjs/current/roslib.min.js"></script>
  5. -->
  6. 改:
  7. <script src="js/eventemitter2.js"></script>
  8. <script src="js/roslib.min.js"></script>
  9. <!--<script type="text/javascript" src="http://static.robotwebtools.org/threejs/current/three.min.js"></script>
  10. <script type="text/javascript" src="http://static.robotwebtools.org/ros3djs/current/ros3d.min.js"></script>-->
  11. <script type="text/javascript" src="js/three.min.js"></script>
  12. <script type="text/javascript" src="js/ros3d.min.js"></script>

游览器访问nginx地址:(我配置了端口号9001,你们自己不配置的话是默认80)

http://localhost:9001/

 

四.克隆 https://github.com/dheera/rosboard.git

 rosboard

  1. cd /home/sukai/workspace/roskaiyuanweb/rosboard
  2. ./run

游览器登入:

http://localhost:8888/

五.克隆git clone https://github.com/pantor/ros-control-center.git

 ros-control-center

  1.  cd ros-control-center
  2. npm install
  3. mpm start

访问:

http://localhost:4200

用官网地址体验

http://pantor.github.io/ros-control-center/dashboard

 加载速度慢,需要等!

这个项目叫做 "ROS Control Center",是一个用于控制运行ROS(Robot Operating System)的机器人的网络控制中心。它在浏览器中运行,使用websocket连接和RobotWebTools的roslibjs。

以下是该项目的主要功能:

  1. 显示节点,主题和服务名称。
  2. 订阅和发布消息。
  3. 调用服务。
  4. 显示和更改参数。

此外,它还实现了一些其他功能,如控制台(默认为rosout)输出,电池状态视图,摄像头流视图,以及为了更好的可用性而设计的高级模式。

要在你的ROS机器人上使用这个控制中心,你需要运行Robot Web Tools的rosbridge_suite。然后在同一网络中的任何计算机上运行控制中心。在设置选项卡中,你需要输入你的机器人的IP地址和端口。然后打开控制选项卡并重新加载。

ROS Control Center支持通过web_video_server包的图像和摄像头流。如果相机和相机信息消息按照web_video_server的标准发布,那么流将会在设置中显示。

对于你自己的自定义消息和服务类型,你可以下载这个仓库并通过控制台中的http-server启动一个服务器。然后,在浏览器中导航到index.html。你可以将个别的html模板添加到app/topics/或app/services/文件夹中。你的文件的路径必须对应ROS服务或消息类型的名称。

在右侧边栏显示日志输出(默认为rosout)。在左侧,显示组名。ROS主题,服务和参数可以被分组,以便更好的概览。

在右下角,可以显示一个电池状态条;电池主题可以在设置选项卡中调整。

ROS Control Center依赖于Angular作为通用的JavaScript和路由框架,Bootstrap用于设计,roslib.js用于ROS连接。

该项目采用BSD许可证发布。

Robot Web Tools社区的网址
https://github.com/robotwebtools
https://robotwebtools.github.io
git clone https://github.com/pantor/ros-control-center.git
git clone https://github.com/EESC-LabRoM/rosweb.git
git clone https://github.com/dheera/rosboard.git
git clone https://github.com/RobotWebTools/ros3djs.git
git clone https://github.com/RethinkRobotics-opensource/rosnodejs.git
git clone https://github.com/cruise-automation/rosbag.js.git
git clone https://github.com/RobotWebTools/ros2djs.git
git clone https://github.com/RobotWebTools/roslibjs.git
git clone https://github.com/RobotWebTools/rclnodejs.gitgit clone https://github.com/RobotWebTools/rosbridge_suite.git
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/107762?site
推荐阅读