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); }
接下来要设法透过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_a*
$ rostopic pub -1 /head/tiltstd_msgs/Float32 0.4
$ rostopic pub -1 /head/tilt std_msgs/Float320.9
这个阶段当中,能够将所有发布数值到ROS的已知方法用在控制伺服机上。假如从0改成1,伺服机就会全速运行。这本来并没有问题,但实际上我们想要逐渐加速以达到全速,然后再逐渐减速,停在目标角度上。假如伺服机骤然运转,机器人的动作就会变得僵硬,让周围的人吓一跳。
西门子 6ES7307-1EA00-0AA0 电源模块
西门子 6EP1331-1SL11 电源模块
西门子 6*6648-0BC11-3AX0 触摸屏
西门子 6ESS7 331-7PF01-0AB0 模块
西门子 6EP1436-3BA10 电源
SIEMENS 6SE6440-2UD21-1AA1 变频器
SIEMENS 6ES7 331-1KF01-0AB0 模块
SIEMENS 6ES7 321-1BL00-0AA0 模块
SIEMENS 6ES7 322-1BL00-0AA0 模块
SIEMENS 6SN1114-0NB01-0AA1 通讯版
SIEMENS 6ES7214-1AD23-0XB0 模块
SIEMENS C98043-A7600-L5 电源板
SIEMENS RWD62 控制器
SIEMENS 6EP1332-1SH71 模块
SIEMENS 3RX9503-0BA00 电源
SIEMENS 6ES7-153-2BA82-0XB0 模块
SIEMENS 6ES7414-4HM14-0AB0 模块
SIEMENS 6ES7414-4HJ04-0AB0 模块
SIEMENS 6ES7407-0KR02-0AA0 模块TSXP57104M配件TSXP57104M配件TSXP57104M配件
SIEMENS 6*6643-0DD01-1AX1 触摸屏
SIEMENS 6ES7 331-7KF02-0AB0 模块
SIEMENS 6ES7 322-1BL00-0AA0 模块
SIEMENS 6*6648-0BC11-3AX0 显示屏
Siemens 6ES7 214-2AD23-0XB8 模块
SIEMENS 6EP1336-3BA00 电源
SIEMENS SQM56.687A2 电机
SIEMENS 6SE6440-2AD33-7EA1 变频器