const float range = 90;
float v = msg.data;
if( v > 1 ) v = 1;A06B-1002-B100A06B-1002-B100A06B-1002-B100
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,伺服机就会全速运行。这本来并没有问题,但实际上我们想要逐渐加速以达到全速,然后再逐渐减速,停在目标角度上。假如伺服机骤然运转,机器人的动作就会变得僵硬,让周围的人吓一跳。
SIEMENS 6EP1961-2BA11 电源
SIEMENS 6XV1860-2S 电缆
SIEMENS 6ES7331-7PF01-0AB0 模块
SIEMENS 6SE6430-2UD31-5CA0 变频器
SIEMENS 6ES7 158-0AD01-0xA0 模块
SIEMENS 7KG7750-0AA01-0AA1 变送器
SIEMENS 7ML1201-1EF0 液位计
SIEMENS 6EP1336-3BA00 电源
SIEMENS 6ED1 055-1NB10-0BA2 模块
SIEMENS 6GK1561-1AA01 通讯卡
SIEMENS 6ES7407-0KA02-0AA0 模块
SIEMENS 6ES7331-7KF02-0AB0 模块
SIEMENS 6ES7331-7KF02-0AB0 模块
SIEMENS 6EP1437-3BA10 电源
SIEMENS 6SN1123-1AA00-0DA2 驱动器
SIEMENS 6ES7318-3EL01-0AB0 CPU
SIEMENS 6ES7153-2BA02-0xB0 模块
SIEMENS 6ES7 216-2BD23-0xB8 模块
SIEMENS 6ES7972-0BA12-0xA0 总线插头
SIEMENS 6ES7952-1AL00-0AA0 储存卡
SIEMENS 6EP1334-2BA01 电源
SIEMENS 6SL3055-0AA00-5BA3 模块
SIEMENS 6ES7350-1AH03-0AE0 模块
SIEMENS 6EP1437-3BA00 电源模块
SIEMENS 6EP1333-3BA00 电源模块
SIEMENS 6ES7414-4HJ04-0AB0 模块
SIEMENS 6ES7307-1EA00-0AA0 电源
SIEMENS 6ES7153-2BA02-0xB0 模块
SIEMENS 6ES7223-1PM22-0xA0 模块
SIEMENS 6ES7223-1PL22-0xA0
SIEMENS 6ES7 216-2BD23-0xB8 模块
SIEMENS 6ES7431-1KF00-0AB0 模块
SIEMENS 6EP1334-2BA01 电源