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_m***/Float32 0.4 $ rostopic pub -1 /head/tilt std_m***/Float320.9 这个阶段当中,能够将所有发布数值到ROS的已知方法用在控制伺服机上。假如从0改成1,伺服机就会全速运行。这本来并没有问题,但实际上我们想要逐渐加速以达到全速,然后再逐渐减速,停在目标角度上。假如伺服机骤然运转,机器人的动作就会变得僵硬,让周围的人吓一跳。 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或是全范围为止。 A06B-0115-B275 A06B-0377-B575 A06B-6073-K250 A06B-0116-B075 A06B-0390-B060 A06B-6076-H001 A06B-0116-B203 A06B-0501-B001 A06B-6077-H106 A06B-0116-B204 A06B-0501-B002 A06B-0116-B503 A06B-0501-B003 A06B-0116-B804 A06B-0501-B004 A06B-6077-H111 A06B-0120-K324 A06B-0501-B005 A06B-6077-K142 A06B-0121-B577 A06B-0501-B006 A06B-6077-K143 A06B-0121-B580 A06B-0501-B032 A06B-6077-K144 A06B-0501-B201 A06B-6077-K250 A06B-0123-B075 A06B-0501-B202 A06B-6078-H206 140DRA84000C配件140DRA84000C配件140DRA84000C配件 A06B-0123-B077 A06B-0501-B205 A06B-6078-H211 A06B-0123-B575 A06B-0501-B206 A06B-0123-B675 A06B-0501-B751 A06B-6078-H230 A06B-0126-B077 A06B-0502-B001 A06B-6078-H415 A06B-0126-B177 A06B-0502-B002 A06B-6078-K001 A06B-0126-B577 A06B-0502-B004 A06B-6078-K214 A06B-0126-B677 A06B-0502-B005 A06B-0127-B075 A06B-0502-B062 A06B-6078-K811 A06B-0127-B077 A06B-0502-B072 A06B-6078-k840 A06B-0127-B175 A06B-0502-B074 A06B-6079-H103