Webots中Spot或SpotMini案例-焦 虑 腾 空-
【摘要】 "Spot "机器人,此前被称为 "SpotMini",是波士顿动力公司开发的一款四条腿的类似狗的机器人。
详细介绍的短视频在文末,如需简要了解,不必观看视频,个人一直觉得视频的时间成本很高,流量成本很高,制作成本也很高,这三高是相对于图文博客而言。
焦虑的Spot
这款敏捷的机器人身高83厘米,可以完成各种搜索、检查和运送任务。它能以前所未...
"Spot "机器人,此前被称为 "SpotMini",是波士顿动力公司开发的一款四条腿的类似狗的机器人。
详细介绍的短视频在文末,如需简要了解,不必观看视频,个人一直觉得视频的时间成本很高,流量成本很高,制作成本也很高,这三高是相对于图文博客而言。

这款敏捷的机器人身高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
-

上图可以看到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 leg
-
0.40, -0.99, 1.59, // Front right leg
-
-0.40, -0.99, 1.59, // Rear left leg
-
0.40, -0.99, 1.59}; // Rear right leg
-
movement_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 leg
-
0.1, 0.0, 0.0, // Front right leg
-
-0.1, 0.0, 0.0, // Rear left leg
-
0.1, 0.0, 0.0}; // Rear right leg
-
-
movement_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 leg
-
0.20, -0.40, -0.19, // Front right leg
-
-0.40, -0.90, 1.18, // Rear left leg
-
0.40, -0.90, 1.18}; // Rear right leg
-
-
movement_decomposition(motors_target_pos, duration);
-
}
-
-
static void give_paw() {
-
// Stabilize posture
-
const double motors_target_pos_1[NUMBER_OF_JOINTS] = {-0.20, -0.30, 0.05, // Front left leg
-
0.20, -0.40, -0.19, // Front right leg
-
-0.40, -0.90, 1.18, // Rear left leg
-
0.49, -0.90, 0.80}; // Rear right leg
-
-
movement_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 movement
-
wb_motor_set_position(motors[5], 0.4 * sin(2 * wb_robot_get_time())); // Forearm movement
-
step();
-
}
-
// Get back in sitting posture
-
const double motors_target_pos_2[NUMBER_OF_JOINTS] = {-0.20, -0.40, -0.19, // Front left leg
-
0.20, -0.40, -0.19, // Front right leg
-
-0.40, -0.90, 1.18, // Rear left leg
-
0.40, -0.90, 1.18}; // Rear right leg
-
-
movement_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 cameras
-
for (int i = 0; i < NUMBER_OF_CAMERAS; ++i)
-
cameras[i] = wb_robot_get_device(camera_names[i]);
-
-
// enable the two front cameras
-
wb_camera_enable(cameras[0], 2 * time_step);
-
wb_camera_enable(cameras[1], 2 * time_step);
-
-
// Get the LEDs and turn them on
-
for (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 0
-
for (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说明
文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。
原文链接:zhangrelay.blog.csdn.net/article/details/106008877
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)