Servo servo;
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(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
SIEMENS 6EP1 334-3BA00 电源
SIEMENS 6ES7972-4AA02-OXAO 模块
SIEMENS 6ES7317-2EK14-0AB0 模块
SIEMENS 6ES7492-1AL00-0AA0 连接器
SIEMENS 6ES7321-1BL00-0AA0 模块
SIEMENS 6GK5206-1BB10-2AA3 交换机
SIEMENS 6ES7972-0CA23-0XA0 适配器
SIEMENS 6GK1502-3CB10 转换器
SIEMENS 6AV2-124-0MC01-0AX0 触摸屏
SIEMENS 6AV6-647-0AE11-3AX0 触摸屏
SIEMENS 232-0HB22-0XA0 模块
SIEMENS 235-0KD22-0XA0 模块
SIEMENS 221-1BF22-0XA0 模块
SIEMENS 223-1BH22-0XA0 模块
SIEMENS 6AV6-643-0CD01-1AX1
SIEMENS 6AV6-642-0BA01-1AX0
SIEMENS 6ES7216-2BD23-0XB8 模块
SIEMENS 6ES7972-0AA01-0XA0 中继器
SIEMENS 6ES7 307-1KA00-0AA0 电源
SIEMENS 6ES7133-1BL01-0XB0 模块
SIEMENS 6SN1118-0DH21-0AA1 板卡
SIEMENS 4AV3300-2EB00-0A 漏电保护
SIEMENS 6ES7-332-5HB01-0AB0 模块
SIEMENS 6EW1881-8AA 电源
SIEMENS 6AV3515-1EB00 操作面板
SIEMENS 3RG6012-3AC00 传感器A06B-0859-B100A06B-0859-B100A06B-0859-B100
SIEMENS 6GK5206-1BB10-2AA3 交换机
SIEMENS 3RX9-502-0BA00 开关电源
SIEMENS 6SL3352-6BH00-0AA1 模块
SIEMENS 6ES7307-1EA01-0AA0 模块
SIEMENS 6ES7331-7KF02-0AB0 模块