webots之Robotis OP2机器人(DARwIn-OP)

tech2024-08-03  52

Robotis OP2机器人

Robotis OP2Motors and Position SensorsLEDsAccelerometerGyroscopeCameraSpeakerManagersGait ManagerMotion ManagerVision Manager PositionSensorRobot WindowAccelerometers TabGyro TabMotors TabPosition Sensors TabCamera TabMotion EditorRemote Control Tab Samplessoccer.wbtsymmetry.wbtvisual_tracking.wbtwalk.wbt

Robotis OP2

ROBOTIS OP2是一个具有先进计算能力的开源微型仿人机器人平台。它由ROBOTIS(韩国机器人制造商)与宾夕法尼亚大学合作开发制造。

之前的模型被命名为DARwIn-OP(Dynamic Anthropomorphic Robot with Intelligence-Open Platform,动态拟人机器人与智能开放平台)。

ROBOTIS OP2主要用于大学和研究中心的教育和研究用途。它共有20个自由度:头部2个,手臂3个,腿部6个。这款机器人的价格相当低,而且是基于开源组件(包括硬件和软件)。它已经在RoboCup国际比赛中使用,并取得了一定的成功。

Motors and Position Sensors

电机位置和识别器 如下图所示:

LEDs

两个RGB LED被放置在机器人的头部。它们被称为HeadLed和EyeLed。两只眼睛的颜色是一样的。请注意,这些LED也会复制到机器人背板上。

另外三个LED是单色的,放置在机器人的背部。 它们被称为BackLedGreen,BackLedBlue和BackLedRed。

Accelerometer

加速计返回的数值在0到1024之间,对应的数值在-3[g]到+3[g]之间,就像真实的机器人上一样。 模拟它的Webots设备被称为加速计。

Gyroscope

陀螺仪返回的数值在0到1024之间,对应的数值在-1600[deg/sec]和+1600[deg/sec]之间,与真实机器人返回的数值类似。 模拟它的Webots设备称为Gyro。

Camera

摄像机是一个RGBA摄像机,它的默认分辨率是160x120像素,但可以改变任何值。 它的默认分辨率为160x120像素,但可以更改为任何值。 水平视场为1.0123[rad]。

Speaker

Webots模拟扬声器的设备名为Speaker。 它可以用来播放声音文件或进行文字转语音。 要使用文字转语音功能,需要在机器人上安装espeak程序。

Managers

为了在仿真中实现Robotis框架的所有关键功能,我们提供了一个库。该库分为三个部分,称为管理器。 每个管理器实现了框架的一个模块。 第一个名为 "Gait "的管理器允许您使用Robotis框架的行走算法。 第二个称为 "Motion "的管理器允许您播放存储在 "motion_4096.bin "文件中的预定义动作。 最后一个名为 "Vision "的管理器,包含一些图像处理工具,例如,在相机图像中找到一个彩色球。

Gait Manager

RobotisOp2GaitManager类允许你使用Framework的行走算法。 在Framework算法中,有很多参数可以用来调整步态。 但为了使这个管理器易于使用,只能设置参数的一个子集。 其他参数被设置为默认值,已知工作正常。 然而,如果需要的话,也可以通过改变存储在".ini "配置文件中的默认值来改变它们。

为了运行,Gait Manager需要知道每个电机的位置和陀螺仪的值。 因此,在使用前必须启用每个电机的陀螺仪设备和位置传感器设备。

#include <RobotisOp2GaitManager.hpp> RobotisOp2GaitManager(webots::Robot *robot, const std::string &iniFilename);

第一个参数是应用该算法的机器人,第二个参数是存储默认参数的文件名。 为了修改控制器中的主要参数,可以使用以下方法:

namespace managers { using namespace Robot; class RobotisOp2GaitManager { public: RobotisOp2GaitManager(webots::Robot *robot, const std::string &iniFilename); virtual ~RobotisOp2GaitManager(); bool isCorrectlyInitialized() { return mCorrectlyInitialized; } void setXAmplitude(double x) { mXAmplitude = DGM_BOUND(x, -1.0, 1.0) * 20.0; }X影响脚步向前的长度,它可以取-1和1之间的任何值。 void setYAmplitude(double y) { mYAmplitude = DGM_BOUND(y, -1.0, 1.0) * 40.0; }Y影响脚步在侧面的长度,它可以取-1和1之间的任何值。 void setAAmplitude(double a) { mAAmplitude = DGM_BOUND(a, -1.0, 1.0) * 50.0; }A影响步态的角度,并允许机器人在行走过程中旋转,它可以取0和1之间的任意值。 void setMoveAimOn(bool q) { mMoveAimOn = q; }如果MoveAimOn被设置,它允许机器人通过反向旋转感绕着某物旋转,例如,它可以非常有用地转过一个球,以便将其踢向正确的方向。 void setBalanceEnable(bool q) { mBalanceEnable = q; }如果设置BalanceEnable,则在控制循环中使用陀螺仪,使行走步态更加稳健。 void start();//启动算法 void step(int duration);//在指定的时间内运行算法,以毫秒为单位 void stop();//停止算法 private: webots::Robot *mRobot; bool mCorrectlyInitialized; Walking *mWalking; int mBasicTimeStep; double mXAmplitude; double mAAmplitude; double mYAmplitude; bool mMoveAimOn; bool mBalanceEnable; bool mIsWalking; #ifndef CROSSCOMPILATION void myStep(); double valueToPosition(unsigned short value); webots::Motor *mMotors[DGM_NMOTORS]; #endif }; } // namespace managers

Motion Manager

playPage函数初始化运动,但不运行它。 必须调用step方法来运行它(在调用机器人step函数之前)。 duration参数用毫秒表示。 isMotionPlaying方法确定当前运动是否在运行。

namespace managers { using namespace Robot; class RobotisOp2MotionManager { public: RobotisOp2MotionManager(webots::Robot *robot, const std::string &customMotionFile = ""); virtual ~RobotisOp2MotionManager(); bool isCorrectlyInitialized() { return mCorrectlyInitialized; } void playPage(int id, bool sync = true);//根据id的值来进行动作 void step(int duration); bool isMotionPlaying() { return mMotionPlaying; }//确定当前运动是否在运行 private: webots::Robot *mRobot; bool mCorrectlyInitialized; Action *mAction; int mBasicTimeStep; bool mMotionPlaying; #ifndef CROSSCOMPILATION void myStep(); void wait(int duration); void achieveTarget(int timeToAchieveTarget); double valueToPosition(unsigned short value); void InitMotionAsync(); webots::Motor *mMotors[DMM_NMOTORS]; webots::PositionSensor *mPositionSensors[DMM_NMOTORS]; double mTargetPositions[DMM_NMOTORS]; double mCurrentPositions[DMM_NMOTORS]; int mRepeat; int mStepnum; int mWait; int mStepNumberToAchieveTarget; void *mPage; #else static void *MotionThread(void *param); // thread function pthread_t mMotionThread; // thread structure #endif }; } // namespace managers

Vision Manager

namespace managers { using namespace Robot; class RobotisOp2VisionManager { public: RobotisOp2VisionManager(int width, int height, int hue, int hueTolerance, int minSaturation, int minValue, int minPercent, int maxPercent); //hue要寻找的目标对象的色相,hueTolerance目标对象的色相公差 //minSaturation最小颜色饱和度,minValue最小色值查找 //minPercent图像中颜色值的最小百分比 virtual ~RobotisOp2VisionManager(); bool getBallCenter(double &x, double &y, const unsigned char *image);//获取目标对象的中心点,如果找到目标对象,本方法返回true,否则返回false。如果找到,则设置x和y变量。 bool isDetected(int x, int y);//确定图像中的某个像素是否为目标像素的一部分。 /*一旦调用了getBallCenter方法,就可以通过isDetected方法知道图像中哪些像素是目标对象的一部分。 如果像素(x,y)是目标对象的一部分,该方法返回true,否则返回false。*/ void setHue(int hue) { mFinder->m_hue = hue; } void setHueTolerance(int hueTolerance) { mFinder->m_hue_tolerance = hueTolerance; } void setMinSaturation(int minSaturation) { mFinder->m_min_saturation = minSaturation; } void setMinValue(int minValue) { mFinder->m_min_value = minValue; } void setMinPercent(int minPercent) { mFinder->m_min_percent = minPercent; } void setmaxPercent(int maxPercent) { mFinder->m_max_percent = maxPercent; } private: ColorFinder *mFinder; FrameBuffer *mBuffer; }; } // namespace managers

PositionSensor

可以在机械仿真中使用[PositionSensor]节点来监视关节位置。

namespace webots { class PositionSensor : public Device { public: enum { ROTATIONAL = 0 }; PositionSensor(const std::string &name); // Use Robot::getMotor() instead virtual ~PositionSensor(); virtual void enable(int samplingPeriod);//使可以测量关节位置。 virtual void disable();//关闭位置传感器以节省CPU时间 int getSamplingPeriod() const; double getValue() const;//返回由指定位置传感器测量的最新值。 int getType() const;//返回位置传感器的类型。 //如果传感器与[HingeJoint]或[Hinge2Joint]节点关联,则返回WB_ROTATIONAL;如果传感器与[SliderJoint]或[Track]节点关联,则返回WB_LINEAR。 private: static void initStaticMap(); static std::map<const std::string, int> mNamesToIDs; static std::map<const std::string, int> mNamesToInitPos; void setPresentPosition(int position); // For Bulk Read // int mPresentPosition; int mFeedback; friend int Robot::step(int duration); friend Robot::Robot(); }; } // namespace webots

Robot Window

当你双击机器人时,会出现一个新的窗口。 这个窗口被称为机器人窗口,它有几个标签,让你执行不同的事情。

Accelerometers Tab

此选项卡可用于在控制器运行时调查加速度计的值。 如果选中该复选框,加速度计的值将实时显示并绘制在图形上。 可以绘制四种不同类型的图形。 前三种是一个轴与另一个轴的函数关系,最后一种,绘制三个轴的值与时间的函数关系。 对应的颜色如下:

红色代表X轴Y轴为绿色蓝色为Z轴

Gyro Tab

该选项卡与加速度计选项卡非常相似,但涉及陀螺仪。 如果选中该复选框,陀螺仪的值就会实时显示并绘制在图形上。 这里同样可以绘制四种不同类型的图形。

Motors Tab

该选项卡可以用来查看和影响每个电机的状态。 通过勾选/取消勾选电机的相应复选框,可以分别设置机器人窗口中每个电机的使用情况。 如果复选框被选中,电机的值就会被显示出来,并以时间的函数绘制出来。 在图上,用两种不同的颜色来区分目标值(红色)和实际值(黑色)。 也可以通过图形旁边的滑块手动改变电机的值。

Position Sensors Tab

该选项卡可用于查看各位置传感器的状态。 通过勾选/取消勾选相应的复选框,可以分别设置机器人窗口中各传感器的使用情况。 如果勾选该复选框,则会显示传感器的值,并以时间的函数绘制。

Camera Tab

这个选项卡非常简单,如果勾选了这个复选框,就会实时显示和更新摄像头的图片。

Motion Editor

此选项卡允许您创建、编辑或播放运动文件。 它包含一个动画,可以由机器人在任何时候执行。 运动(Motion)是由多个姿势组成的(左窗格)。 一个姿势是机器人必须遵循的时间中的一个瞬间。 机器人将平稳地从一个姿势移动到下一个姿势。 一个姿势是由多个状态组成(右窗格)。 一个状态代表一个电机的位置。 如果该状态被启用,则意味着电机应该在姿势的瞬间具有设定的位置。

Remote Control Tab

远程控制的使用比远程编译要简单得多,你不需要在任何文件中设置时间步长,也不需要编辑任何特定的Makefile,在仿真中完全相同的控制器就可以用于远程控制(甚至不需要重新编译)。 此外,远程控制模式还可以让您实时看到真实机器人的传感器和执行器的状态。

Samples

soccer.wbt

这是一个非常完整的例子,它使用了三个经理和几乎所有的传感器。 控制器是一个非常简单的足球运动员。 它依赖于之前例子中使用的大部分工具。 我们建议你自己研究它,当然也可以改进它。

要扩展这个控制器,你可以在项目中添加新的文件,但不要忘记也要将它们添加到makefile中(将cpp文件添加到CXX_SOURCES部分)。 这个例子也是开发一个更复杂的控制器的良好起点。

这个例子可以在远程编译中使用。 但我们建议您在柔软的地面上进行测试,并远离任何危险源(楼梯、热表面等),因为机器人会经常移动,不排除它时常会摔倒。

symmetry.wbt

这个例子是非常基本的,解释了电机的使用。 首先将右臂的三个电机的电机力设置为零,以便完全放开这只手臂,然后在无限循环中,读取并显示前三个电机的位置。 然后,在一个无限循环中,读取并显示前三个电机的位置。 最后,仍然在循环中,将右臂的每个电机的相反位置施加到左臂的相应电机上,以模仿右臂的运动。

现在你能够移动模拟中自由的右臂:选择机器人,然后按Ctrl+Alt键左键点击手臂,然后在不松开左键的情况下移动鼠标。 这将应用一个力(箭头符号),这将使手臂移动。 注意,为了读取电机位置,启用位置传感器是非常重要的。 在这个例子中,这是在构造函数中完成的。

你也可以尝试在你的主循环中添加一个摆动的头部,通过添加这个:

mMotors[18]->setPosition(sin(getTime()));

然后保存文件,按构建按钮,最后恢复仿真,启动新的控制器。 这个例子很适合远程编译,建议大家先用这个例子来测试远程编译工具。

visual_tracking.wbt

这个例子说明了摄像机(包括视觉管理器)的使用和RGB LED的使用。

在无限循环中,视觉管理器被用来寻找红色的球。 然后,如果球已经被找到,头部LED灯被设置为绿色,否则为红色。 然后,再一次,如果球已经被找到,云台的两个电机的位置将被修正,以观察球的方向。 要在模拟中移动球,按Ctrl+Shift键,用鼠标左键按住球移动。

尝试改变LED的颜色,改变这一行:

mHeadLED->set(0xFF0000);

这里的颜色是用十六进制设置的,格式是R8G8B8:最重要的8位(左手边)表示红色级别(0x00到0xFF之间)。 格式为R8G8B8:最重要的8位(左手边)表示红色级别(在0x00和0xFF之间)。 8至15位表示绿色级别,最不重要的8位(右手边)表示蓝色级别。 例如,0xFF0000为红色,0x00FF00为绿色,0x0000FF为蓝色,0xFFFF00为黄色等。

也可以尝试使用另一个RGB LED,这只需用mEyeLED交换mHeadLED即可。

这个例子也很适合远程编译。 如果你的球有不同的颜色,你可以通过改变RobotisOp2VisionManager构造函数中的值来调整球的颜色。

这个例子也可以作为一个工具来调整视觉管理器的参数,以适应您的应用。

walk.wbt

这个例子说明了步态管理器和运动管理器的使用,键盘的使用,还有加速度计的使用。

在控制器的开始,使用Motion manager让机器人站起来,然后控制器进入一个无限循环。

循环的第一件事是检查机器人是否倒下了,这是通过使用加速度计来实现的。

然后,如果机器人已经倒下,则使用Motion manager使机器人站起来。

然后,读取键盘,如果按下空格键,机器人开始/停止行走。

然后,按上/下/右/左键使机器人转弯,向前/向后移动,可以同时按几个键。

尝试通过使用更多的键来增加一些动作。 例如,您可以使用NUMPAD_RIGHT和NUMPAD_LEFT键来进行右/左拍摄(在运动管理器中的ID12和13页)。 如果你喜欢的话,也可以用普通的键如’A’来代替。

你也可以使用另一个键使机器人走得更快或更慢。 改变发送到步态管理器的XAmplitude,数值必须在-1和1之间。

这个例子可以在远程编译中工作,但你需要将USB键盘连接到机器人上。 否则,建议用遥控器测试这个例子,以便使用计算机的键盘代替。

这个例子也可以用来探索和测试步态的所有参数。

最新回复(0)