Webots中Spot或SpotMini案例-焦 虑 腾 空-

2023-10-20 22:30
文章标签 案例 spot webots spotmini

本文主要是介绍Webots中Spot或SpotMini案例-焦 虑 腾 空-,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

"Spot "机器人,此前被称为 "SpotMini",是波士顿动力公司开发的一款四条腿的类似狗的机器人。

详细介绍的短视频在文末,如需简要了解,不必观看视频,个人一直觉得视频的时间成本很高,流量成本很高,制作成本也很高,这三高是相对于图文博客而言。

焦虑的Spot

这款敏捷的机器人身高83厘米,可以完成各种搜索、检查和运送任务。它能以前所未有的速度攀爬楼梯和穿越崎岖的地形,但它的体型却足够小,适合在室内使用。它是一个坚固耐用的(IP54防尘和防潮保护)和可定制的平台。Spot可以去轮式机器人无法去的地方,同时携带的有效载荷的耐力远超空中无人机。最大速度为1.6米/秒,续航时间为90分钟,电池可更换。Spot使用5个立体摄像头(360度视觉),在动态工作场所移动时,可以避开障碍物和人。

附上参考网址(非点击打开的链接,请复制打开)

教程说明:https://cyberbotics.com/doc/guide/spot模型网址:https://github.com/cyberbotics/webots/tree/master/projects/robots/boston_dynamics软件下载:https://cyberbotics.com/#download
腾空的spot

上图可以看到webots软件界面,腾空时前后摄像头的图像也在仿真窗口左上和右上显示。

如上运动效果的代码如下:

/** Copyright 1996-2020 Cyberbotics Ltd.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*//** Description:   Simple controller to present the Spot robot.*/#include <webots/camera.h>
#include <webots/device.h>
#include <webots/led.h>
#include <webots/motor.h>
#include <webots/robot.h>#include <math.h>
#include <stdio.h>
#include <stdlib.h>#define NUMBER_OF_LEDS 8
#define NUMBER_OF_JOINTS 12
#define NUMBER_OF_CAMERAS 5// Initialize the robot's information
static WbDeviceTag motors[NUMBER_OF_JOINTS];
static const char *motor_names[NUMBER_OF_JOINTS] = {"front left shoulder abduction motor",  "front left shoulder rotation motor",  "front left elbow motor","front right shoulder abduction motor", "front right shoulder rotation motor", "front right elbow motor","rear left shoulder abduction motor",   "rear left shoulder rotation motor",   "rear left elbow motor","rear right shoulder abduction motor",  "rear right shoulder rotation motor",  "rear right elbow motor"};
static WbDeviceTag cameras[NUMBER_OF_CAMERAS];
static const char *camera_names[NUMBER_OF_CAMERAS] = {"left head camera", "right head camera", "left flank camera","right flank camera", "rear camera"};
static WbDeviceTag leds[NUMBER_OF_LEDS];
static const char *led_names[NUMBER_OF_LEDS] = {"left top led",          "left middle up led", "left middle down led","left bottom led",       "right top led",      "right middle up led","right middle down led", "right bottom led"};static void step() {const double time_step = wb_robot_get_basic_time_step();if (wb_robot_step(time_step) == -1) {wb_robot_cleanup();exit(0);}
}// Movement decomposition
static void movement_decomposition(const double *target, double duration) {const double time_step = wb_robot_get_basic_time_step();const int n_steps_to_achieve_target = duration * 1000 / time_step;double step_difference[NUMBER_OF_JOINTS];double current_position[NUMBER_OF_JOINTS];for (int i = 0; i < NUMBER_OF_JOINTS; ++i) {current_position[i] = wb_motor_get_target_position(motors[i]);step_difference[i] = (target[i] - current_position[i]) / n_steps_to_achieve_target;}for (int i = 0; i < n_steps_to_achieve_target; ++i) {for (int j = 0; j < NUMBER_OF_JOINTS; ++j) {current_position[j] += step_difference[j];wb_motor_set_position(motors[j], current_position[j]);}step();}
}static void lie_down(double duration) {const double motors_target_pos[NUMBER_OF_JOINTS] = {-0.40, -0.99, 1.59,   // Front left leg0.40,  -0.99, 1.59,   // Front right leg-0.40, -0.99, 1.59,   // Rear left leg0.40,  -0.99, 1.59};  // Rear right legmovement_decomposition(motors_target_pos, duration);
}static void stand_up(double duration) {const double motors_target_pos[NUMBER_OF_JOINTS] = {-0.1, 0.0, 0.0,   // Front left leg0.1,  0.0, 0.0,   // Front right leg-0.1, 0.0, 0.0,   // Rear left leg0.1,  0.0, 0.0};  // Rear right legmovement_decomposition(motors_target_pos, duration);
}static void sit_down(double duration) {const double motors_target_pos[NUMBER_OF_JOINTS] = {-0.20, -0.40, -0.19,  // Front left leg0.20,  -0.40, -0.19,  // Front right leg-0.40, -0.90, 1.18,   // Rear left leg0.40,  -0.90, 1.18};  // Rear right legmovement_decomposition(motors_target_pos, duration);
}static void give_paw() {// Stabilize postureconst double motors_target_pos_1[NUMBER_OF_JOINTS] = {-0.20, -0.30, 0.05,   // Front left leg0.20,  -0.40, -0.19,  // Front right leg-0.40, -0.90, 1.18,   // Rear left leg0.49,  -0.90, 0.80};  // Rear right legmovement_decomposition(motors_target_pos_1, 4);const double initial_time = wb_robot_get_time();while (wb_robot_get_time() - initial_time < 8) {wb_motor_set_position(motors[4], 0.2 * sin(2 * wb_robot_get_time()) + 0.6);  // Upperarm movementwb_motor_set_position(motors[5], 0.4 * sin(2 * wb_robot_get_time()));        // Forearm movementstep();}// Get back in sitting postureconst double motors_target_pos_2[NUMBER_OF_JOINTS] = {-0.20, -0.40, -0.19,  // Front left leg0.20,  -0.40, -0.19,  // Front right leg-0.40, -0.90, 1.18,   // Rear left leg0.40,  -0.90, 1.18};  // Rear right legmovement_decomposition(motors_target_pos_2, 4);
}int main(int argc, char **argv) {wb_robot_init();const double time_step = wb_robot_get_basic_time_step();// Get camerasfor (int i = 0; i < NUMBER_OF_CAMERAS; ++i)cameras[i] = wb_robot_get_device(camera_names[i]);// enable the two front cameraswb_camera_enable(cameras[0], 2 * time_step);wb_camera_enable(cameras[1], 2 * time_step);// Get the LEDs and turn them onfor (int i = 0; i < NUMBER_OF_LEDS; ++i) {leds[i] = wb_robot_get_device(led_names[i]);wb_led_set(leds[i], 1);}// Get the motors (joints) and set initial target position to 0for (int i = 0; i < NUMBER_OF_JOINTS; ++i)motors[i] = wb_robot_get_device(motor_names[i]);while (true) {
//    lie_down(4.0);
//    stand_up(4.0);
//    sit_down(4.0);
//    give_paw();
//    stand_up(4.0);
//    lie_down(3.0);
//    stand_up(3.0);
//    lie_down(2.0);
//    stand_up(2.0);
//    lie_down(1.0);
//    stand_up(1.0);
//    lie_down(0.75);
//    stand_up(0.75);lie_down(0.5);stand_up(0.5);lie_down(0.4);stand_up(0.4);lie_down(0.3);stand_up(0.3);lie_down(0.2);stand_up(0.2);lie_down(0.1);stand_up(0.1);               }wb_robot_cleanup();return EXIT_FAILURE;
}

可以自己编程实现更多复杂的运动。


在Webots中使用Spot或Spotmini说明

  • https://www.bilibili.com/video/bv1Dt4y1y72x

 

这篇关于Webots中Spot或SpotMini案例-焦 虑 腾 空-的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/250116

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员

C#中的Drawing 类案例详解

《C#中的Drawing类案例详解》文章解析WPF与WinForms的Drawing类差异,涵盖命名空间、继承链、常用类及应用场景,通过案例展示如何创建带阴影圆角矩形按钮,强调WPF的轻量、可动画特... 目录一、Drawing 是什么?二、典型用法三、案例:画一个“带阴影的圆角矩形按钮”四、WinForm

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多