编写ros节点

Posted by 肥仔 on March 8, 2020

编写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数值