编写ros节点 基于arduino
基于rosserial_python,使arduino与ros进行通信,一些自己写的小例子
1602_i2c液晶显示模块(sub)
主要思路,1602作为接受端,接收来自ros的string数据,然后在自己显示出来
代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include<ros.h>
#include <std_msgs/String.h>
LiquidCrystal_I2C lcd(0x27,16,2);
ros::NodeHandle nh;
void lcd_cb( const std_msgs::String& lcd_msg)
{
lcd.print(lcd_msg.data);
digitalWrite(13, HIGH-digitalRead(13)); //toggle led
}
ros::Subscriber<std_msgs::String> sub_lcd("show_lcd",lcd_cb);
void setup() {
lcd.init(); // initialize the lcd
lcd.backlight();
Serial.begin(57600);
nh.initNode();
nh.subscribe(sub_lcd);
pinMode(13, OUTPUT);
}
void loop() {
nh.spinOnce();
delay(1);
}
触摸模块,模拟量(pub)
主要思路,触摸模块作为发送端向ros,提供数据(pub)
代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<ros.h>
#include<std_msgs/Int32.h>
#define buttonPin A0
#define fmq 7
ros::NodeHandle nh;
std_msgs::Int32 int_msg;
ros::Publisher pub_button("input_button",&int_msg);
int val;
void setup() {
nh.initNode();
nh.advertise(pub_button);
pinMode(buttonPin,INPUT); //设置引脚 A0 为输出模式
pinMode(fmq,OUTPUT);
Serial.begin(57600); //设置波特率为57600
}
void loop() {
// put your main code here, to run repeatedly:
val = analogRead(buttonPin);
Serial.println(val); //串口输出
int_msg.data=val;
pub_button.publish(&int_msg);
nh.spinOnce();
}
执行
roscore
rosrun rosserial_python serial_node.py /dev/ttyACM0
rostopic pub show_lcd std_msgs/String “hello”
rostopic echo input_button //读取pub数值