当前位置:首页 > 工业控制 > 工业控制技术文库
[导读] ROS(Robot OperatingSystem)是开源的机器人系统平台。使用这个之后,机器人就可以看见东西、测绘、导航,或是以最新的算法作用于周围的环境当中。假如想要制造复杂的机器人,已经准

ROS(Robot OperatingSystem)是开源的机器人系统平台。使用这个之后,机器人就可以看见东西、测绘、导航,或是以最新的算法作用于周围的环境当中。假如想要制造复杂的机器人,已经准备好的ROS程序代码就能派上用场。ROS能在最低限度下运用。这可以透过Raspberry Pi等级的计算机安装。

做为ROS的入门篇我们来看看如何控制伺服机。伺服机的缺点是会尽快遵照指令运转,因此头部常常会突然活动,以至于失去平衡。不过使用ROS之后,就可以进行正弦曲线运动,让机器人保持稳定。由于可以在ROS当中进行这项操作,因此无须改写控制用的程序代码。另外,连接伺服机和ROS的程序代码,以及伺服机的硬件都无须变更。再者,程序代码还可以任意使用。

ROS很适合用在Ubuntu或Debian上,无须编译。建置时要在Linux机器上执行Ubuntu,使用业余用伺服机、Arduino和普通的导线。ROS要在Ubuntu机器上启动,讯息则透过USB传送到Arduino。只要安装二进制的ROS套件,就会在主控台程序(像是gnome-terminal或konsole)追加以下指令,这样Arduino系统就能辨识ROS函式库。

cd~/sketchbook/libraries

rm-rf ros_lib

rosrunrosserial_arduino make_l ibraries.py 。

Arduino的程序

接下来要将程序代码上传到Arduino当中,执行低阶的伺服机控制,以便能从Linux机器操作。这时要以限制范围内的百分比(0.0~1.0)指定伺服机的位置。之所以使用百分比而不是写明角度,是因为Arduino的程序代码限制了正确的角度,要避免在指定角度时发生冲突。

就如各位所见,使用ROS之后,一般的循环函数就会变得相当简单。循环函数只会订阅(subscribe)数据,任何Arduino循环都一样。设定时要将ROS初始化,将各个ROS讯息订阅者的订阅叫出来。每个订阅者会占据Arduino的RAM,数量取决于要用程序代码做什么,以6个到12个为限。

#include

#include

#include

#include

#define SERVOPIN 3

Servo servo;

void servo_cb( const std_msgs::Float32& msg )

{

const float min = 45;

const float range = 90;

float v = msg.data;

if( v 》 1 ) v = 1;

if( v 《 0 ) v = 0;

float angle = min + (range * v);

servo.write(angle);

}

ros::Subscriber

ros::NodeHandle nh;

void setup()

{

servo.attach(SERVOPIN);

nh.initNode();

nh.subscribe(sub);

}

void loop()

{

nh.spinOnce();

delay(1); }

接下来要设法透过Arduino在ROS的世界说话。最简单的方法是使用机器人启动档。虽然以下的档案内容非常简单,但是这里要追加启动档,如此一来即使是非常复杂的机器人,也能用一个指令启动。

$ cat rosservo.launch

$ roslaunch 。/rosservo.lanch

rostopic指令可以看出ROS讯息传送到机器人的哪个部位。看了下面的程序代码就会发现,「/head/TIlt」可以透过Arduino使用。讯息要使用「rostopic」传送。-1的选项只会发布(publish)讯息一次,通知/head/TIlt传送一个浮点数。

$ rostopic list

/diagnosTIcs

/head/TIlt

/rosout

/rosout_agg

$ rostopic pub -1 /head/tiltstd_msgs/Float32 0.4

$ rostopic pub -1 /head/tilt std_msgs/Float320.9

这个阶段当中,能够将所有发布数值到ROS的已知方法用在控制伺服机上。假如从0改成1,伺服机就会全速运行。这本来并没有问题,但实际上我们想要逐渐加速以达到全速,然后再逐渐减速,停在目标角度上。假如伺服机骤然运转,机器人的动作就会变得僵硬,让周围的人吓一跳。

用另一个节点平滑运动

Houndbot

Terry

Terry和Houndbot都是ROS机器人,以6061个铝合金零件制造而成。项目的目标是要尽量让这些机器人自主运动。

以下的Python脚本程序会监听「/head/tilt/smooth」的讯息,朝「/head/tilt」发布许多讯息,好让伺服机转到目标角度之前慢慢加速,再慢慢延迟旋转。当讯息抵达「/head/tilt/smooth」时一定会呼叫「moveServo_cb」。这个回调函式会从-90到+90度之间每10度产生1个数值,追加到角度数组当中。「sin()」会取这个角度,数值从-1到+1慢慢增加。该数值加1之后,范围就会变成0到+2,再除以2之后, 0到+1的曲线数值数组就完成了。然后再看看m数组当中,每当发布讯息时,就会稍微前进一点,范围在r之内,直到1*r或是全范围为止。

#!/usr/bin/env python

from time import sleep

import numpy as np

import rospy

from std_msgs.msg import Float32

currentPosition = 0.5

pub = None

def moveServo_cb(data):

global currentPosition, pub

targetPosition = data.data

r = targetPosition - currentPosition

angles = np.array( (range(190)) [0::10]) -90

m = ( np.sin( angles * np.pi/ 180. ) + 1 )/2

for mi in np.nditer(m):

pos = currentPosition + mi*r

print “pos: “, pos

pub.publish(pos)

sleep(0.05)

currentPosition = targetPosition

print “pos-e: “, currentPosition

pub.publish(currentPosition)

def listener():

global pub

rospy.init_node(‘servoencoder’,anonymous=True)

rospy.Subscriber(‘/head/tilt/smooth’,Float32, moveServo_cb)

pub = rospy.Publisher(‘/head/tilt’,Float32, queue_size=10)

rospy.spin()

if __name__ == ‘__main__’:

listener()

想要测试伺服机顺畅的动作,就要启动Python脚本,将讯息发布到「/head/tilt/smooth」,这样一来即可检视顺畅的动作。

$ 。/servoencoder.py

$ rostopic pub -1 /head/tilt/smoothstd_msgs/Float32 1

$ rostopic pub -1 /head/tilt/smoothstd_msgs/Float32 0

ROS当中的名称也可以重新测绘。只要将「/head/tilt/smooth」重新测绘为「/head/tilt」,程序就能向伺服机发出命令,而不会意识到正弦曲线的数值在变化。

迎向未来

虽然这里只说明了简单的伺服机控制,ROS却有更多功能。假如想要知道妨碍机器人的东西是什么,不妨使用已经支持ROS的Kinect。就算导航堆栈使用这项数据测绘,也可以馈送简短的Python脚本,让伺服机动起来,命令机器人追踪附近的物体。没错,眼睛真的会追逐物体。

Terry是室内用机器人,搭载2个Kinect。一个专门用来导航,另一个则用于深度测绘。Terry使用6个Arduinos,能够从用了ROS的网络接口或PS3遥控器直接操作。

Houndbot是设计成要在户外使用。里头有遥控器、GPS、罗盘和ROS耳形控制器。后续计划要搭载导航用的PS4双镜头摄影机,因为Kinect不能在阳光下使用。这台机器人重量为20公斤。还可以追加了悬吊系统,为此需要自行制造铝合金客制化零件。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭