用另一个节点平滑运动
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公斤。还可以追加了悬吊系统,为此需要自行制造铝合金客制化零件。
作者:Ben Martin