Jeffrey Cross
Jeffrey Cross

用机器人操作系统编程实现平稳伺服运动

机器人操作系统(ROS)是一个开源机器人平台,可帮助您的机器人可视化世界,映射和导航,并使用最先进的算法执行物理交互。如果您想构建一个复杂的机器人,很可能已经有一些ROS代码可以帮助您。您可以根据需要使用少量的ROS,并将其安装在Raspberry Pi级别的机器上。

在这里阅读杂志上的文章 使:。还没有订阅?今天来一个。

让我们考虑如何控制伺服作为ROS的介绍。伺服电机的一个缺点是它们通常会尽可能快地运行以遵守您的命令。这可能导致机器人摔倒,因为它突然开始以最高速度旋转。一旦我们获得ROS来控制伺服,我们就可以添加类似正弦的控制来保持机器人的稳定。您可以在ROS中执行此操作,而无需更改控制代码,或将伺服器暴露给ROS或伺服硬件本身的代码。您可以在将来轻松地将代码重用于其他项目!

ROS对Ubuntu或Debian上的安装提供了非常好的支持,因此您无需编译即可开始使用。这个版本使用运行Ubuntu的Linux机器,业余爱好伺服器,Arduino和一些普通电缆,如连接线。 ROS将在Ubuntu机器上运行,其消息将通过USB发送到Arduino。安装二进制ROS软件包后,通过在控制台程序(例如gnome-terminal或konsole)中输入以下命令,让您的Arduino环境了解ROS库: cd~ / sketchbook / libraries rm -rf ros_lib rosrun rosserial_arduino make_l ibraries.py。

编程Arduino

摄影:Hep Svadja

现在我们可以将草图上传到Arduino来执行低级伺服控制并从Linux机器控制它。这会将伺服机构移动到指定为我们想要允许的完整运动的百分比(0.0到1.0)的位置。使用百分比而不是显式角度可以使Arduino代码限制可以设置的精确角度,以明确避免您知道会导致碰撞的角度。

如您所见,使用ROS时,正常的设置和循环功能变得非常稀疏。对于任何只订阅数据的Arduino代码,循环函数可以是相同的。在设置中,您必须初始化ROS,然后为您拥有的每个ROS消息订阅者调用订阅。每个用户占用你的Arduino上的RAM,所以你可能只有6-12个,这取决于你的草图需要做什么。

#包括 #包括 #包括 #包括 #define SERVOPIN 3伺服伺服; 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(角度); } ros ::订阅者 sub(“/ head / tilt”,servo_cb); ros :: NodeHandle nh; void setup(){servo.attach(SERVOPIN); nh.initNode(); nh.subscribe(分); } void loop(){nh.spinOnce();延迟(1); }

现在你需要能够从ROS世界与Arduino交谈。最简单的方法是使用机器人启动文件。虽然下面的文件非常简单,但它们可以包含其他启动文件,因此您最终可以使用单个命令启动非常复杂的机器人。

$ cat rosservo.launch $ roslaunch ./rosservo.lanch

rostopic命令可让您查看可在机器人上发送ROS消息的位置。正如你在下面看到的那样 /头/倾斜 可以从Arduino获得。可以使用发送消息 rostopic pub,-1选项意味着只发布一次消息,我们想与之交谈 /头/倾斜 发送单个浮点数。

$ rostopic list / diagnostics / head / tilt / rosout / rosout_agg $ rostopic pub -1 / head / tilt std_msgs / Float32 0.4 $ rostopic pub -1 / head / tilt std_msgs / Float32 0.9

在这个阶段,任何知道如何在ROS中发布数字的东西都可以用来控制伺服。如果我们从0移动到1,那么伺服将以全速运行,这本身就很好,但我们可能希望电机加速到全速 然后放慢速度 当它接近目的地位置时。减少突然运动,减少机器人运动,减少对该地区人类的惊讶。

与另一个节点平滑

下面的Python脚本侦听消息 /头/倾斜/平滑 并发布许多消息 /头/倾斜 当接近所需位置时,以缓慢的斜坡上升和斜坡下移来移动伺服。该 moveServo_cb 在消息到达时调用 /头/倾斜/平滑。然后回调在角度数组中从-90到+90每隔10度产生一个数字。该 罪() 取这些角度给出的值从-1到+1缓慢变化。添加1使得范围为0到+2,因此除以2会使我们的数组从0上升到+1。然后,每次都要遍历m阵列并发布消息,每次稍微移动到范围r,最终达到1 * r或全范围。

#!/ usr / bin / env python从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 - 当前角度= np.array((范围(190))[0 :: 10]) - 90 m =(np.sin(角度* np.pi / 180.)+ 1)/ 2,np为mi。 nditer(m):pos = currentPosition + mi * r print“pos:”,pos pub.publish(pos)sleep(0.05)currentPosition = targetPosi tion print“pos-e:”,currentPos ition pub.publish(currentPosition)def listener():global pub rospy.init_node('servoencod er',anonymous = True)rospy.Subscriber('/ head / til t / smooth',Float32,moveSer vo_cb)pub = rospy.Publisher('/ h ead / tilt ',Float32,queue_ size = 10)rospy.spin()if __name__ =='__ main__':listener()

要测试平滑的伺服运动,请启动Python脚本并将消息发布到 /头/倾斜/平滑 你应该看到一个更平稳的运动。

$ ./servoencoder.py $ rostopic pub -1 / head / tilt / smooth std_msgs / Float32 1 $ rostopic pub -1 / head / tilt / smooth std_msgs / Float32 0

您还可以重新映射ROS中的事物名称。这样你就可以重新映射 /头/倾斜/平滑 成为 /头/倾斜 并且命令伺服的程序甚至不知道正在使用正弦运动。

走得更远

我专注于简单的伺服控制,但ROS支持更多。如果你想知道阻止机器人移动的是什么,已经支持在ROS中使用Kinect。即使导航堆栈使用该数据进行映射,您也可以提供一个Python脚本来移动伺服以跟踪最接近机器人的对象。是的,眼睛真的跟着你。

我的两个ROS项目是Terry和Houndbot。 Terry是一个带有两个Kinect的室内机器人,一个专门用于导航,另一个用于我认为合适的深度测绘。凭借其六个Arduinos,Terry可以通过ROS支持的Web界面或直接通过PS3遥控器进行控制。

我设计了Houndbot供户外使用。它有一个RC遥控器,GPS,指南针和ROS控制的耳朵。我正在努力让它使用PS4双眼相机进行导航。它不能使用Kinect,因为太阳会停止工作。由于猎犬大约20公斤,我最近升级了悬架,导致我制造定制合金零件。

机器人操作系统资源

在Ubuntu上安装使用ROS ROS进入导航世界Q&A获取有关ROS的众多书籍之一使用ROS和MoveIt让您的机器人手臂移动!在模拟器中运行NASA-GM Robonaut2。 ROS在那里!

分享

发表评论