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); }
接下來(lái)要設(shè)法透過(guò)Arduino在ROS的世界說(shuō)話。簡(jiǎn)單的方法是使用機(jī)器人啟動(dòng)檔。雖然以下的檔案內(nèi)容非常簡(jiǎn)單,但是這里要追加啟動(dòng)檔,如此一來(lái)即使是非常復(fù)雜的機(jī)器人,也能用一個(gè)指令啟動(dòng)。
$ cat rosservo.launch
$ roslaunch ./rosservo.lanch
rostopic指令可以看出ROS訊息傳送到機(jī)器人的哪個(gè)部位??戳讼旅娴某绦虼a就會(huì)發(fā)現(xiàn),「/head/tilt」可以透過(guò)Arduino使用。訊息要使用「rostopic」傳送。-1的選項(xiàng)只會(huì)發(fā)布(publish)訊息一次,通知/head/tilt傳送一個(gè)浮點(diǎn)數(shù)。
$ 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 交換機(jī)
SIEMENS 6ES7972-0CA23-0XA0 適配器
SIEMENS 6GK1502-3CB10 轉(zhuǎn)換器
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 漏電保護(hù)
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 交換機(jī)
SIEMENS 3RX9-502-0BA00 開(kāi)關(guān)電源
SIEMENS 6SL3352-6BH00-0AA1 模塊
SIEMENS 6ES7307-1EA01-0AA0 模塊
SIEMENS 6ES7331-7KF02-0AB0 模塊