做为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个为限。 Servo servo; void servo_cb( const std_m***::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); }A06B-0172-B577 A06B-0725-B203 A06B-6097-H206 A06B-0176-B077 A06B-0727-B102 A06B-6102-H122 A06B-0177-B075 A06B-0727-B192 A06B-0183-B777 A06B-0727-B202 A06B-6102-H206 A06B-0185-B077 A06B-0727-B304 A06B-6102-H211 A06B-0205-B000 A06B-0728-B102 A06B-6102-H215 A06B-0205-B400 A06B-0728-B920 A06B-0205-B605 A06B-0728-B951 A06B-6102-H222 A06B-0213-B100 A06B-0729-B194 A06B-6102-H226 A06B-0215-B605 A06B-0729-B202 A06B-6104-H245 A06B-0216-B100 A06B-0732-B201 A06B-0225-B200 A06B-0745-B600 A06B-6110-H006 A06B-0226-B001 A06B-0750-B100 A06B-6110-H011 A06B-0226-B200 A06B-0753-B101 A06B-0227-B000 A06B-0753-B200 A06B-0227-B100 A06B-0753-B302 TSXPSY2600配件TSXPSY2600配件TSXPSY2600配件 A06B-0227-B200 A06B-0753-B394 A06B-6110-H015 A06B-0227-B300 A06B-0754-B100 A06B-0235-B005 A06B-0754-B201 A06B-0235-B605 A06B-0754-B230 A06B-6110-H026 A06B-0239-B200 A06B-0754-B600 A06B-0241-B101 A06B-0755-B100 A06B-6110-H030 A06B-0243-B605 A06B-0755-B201 A06B-0247-B200 A06B-0755-B301 A06B-6110-H037 A06B-0247-B401 A06B-0755-B394 A06B-6110-H045