ROS
Ubuntu16.04 ROS Kinetic - 초음파센서(HC-SR04) 4개 연결 실습
donie
2021. 1. 18. 00:36
1. 하드웨어 연결
각 초음파센서들의 Vcc, Gnd를 하나로 연결하고 그것을 아두이노의 5V, GND에 연결하였다.
또 각 초음파센서들의 Trig, Echo핀들을 2,3 / 4,5 / 6,7 / 8,9에 각각 연결함.
빵판은 없고 전선들의 피복을 벗겨서 연결하였다.
아두이노를 PC에 연결하고 가상머신(리눅스)에 연결한다.
연결 확인 명령어:
lsusb
2. 아두이노
ultrasonic_4_fw.ino 파일 작성
4개의 초음파센서 거리 정보를 아래와 같이 출력하기. 가운데 띄어쓰기 한칸씩.
300mm 121mm 186mm 67mm |
1) 아두이노 실행 명령어
sudo arduino
2) 아두이노 코드
/*
HC-SR04 초음파 센서 4개 아두이노 펌웨어
1번 초음파 센서 trig=2, echo=3
2번 초음파 센서 trig=4, echo=5
3번 초음파 센서 trig=6, echo=7
4번 초음파 센서 trig=8, echo=9
*/
void setup()
{
Serial.begin(9600);
for(int i=1;i<=4;i++)
{
pinMode(2*i, OUTPUT); // trig
pinMode(2*i+1, INPUT); // echo
}
}
int calcdist(int num)
{
long duration, distance;
int trig = 2 * num;
int echo = 2 * num + 1;
// 트리거 핀으로 10us동안 펄스 출력
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
// pulseIn 함수는 핀에서 펄스 신호를 읽어서 마이크로초 단위로 반환
duration = pulseIn(echo, HIGH);
distance = duration * 170 / 1000;
Serial.print(distance);
Serial.print("mm ");
if(num==4){
Serial.println();
}
delay(100);
}
void loop(){
calcdist(1);
calcdist(2);
calcdist(3);
calcdist(4);
delay(100);
}
3) 실행 결과
3. ROS
1) ultrasonic 패키지
아래 실습때 만들었던 패키지를 사용한다.
2021/01/14 - [ROS] - Ubuntu16.04 ROS Kinetic - 초음파센서(HC-SR04) 실습
Ubuntu16.04 ROS Kinetic - 초음파센서(HC-SR04) 실습
Ubuntu16.04 아두이노 나노 초음파센서 실행은 아래 글 참고. 2021/01/13 - [프로그래머스 자율주행스쿨] - Ubuntu16.04 - 아두이노 나노 - 초음파센서(HC-SR04) 실습 'HL-340 USB 어쩌구' 확인 lsusb USB를 꽂..
donie.tistory.com
2) 실행파일
ultra4_pub.py
#!/usr/bin/env python
import serial, time, rospy
from std_msgs.msg import Int32MultiArray
ser_front = serial.Serial(
port='/dev/ttyUSB0',
baudrate=9600,
)
def read_sensor():
serial_data = ser_front.readline()
ser_front.flushInput()
ser_front.flushOutput()
ultrasonic_data = serial_data.split()
for i, x in enumerate(ultrasonic_data):
ultrasonic_data[i] = int(x[:-2])
msg.data = ultrasonic_data
if __name__ == '__main__':
rospy.init_node('ultrasonic_pub', anonymous=False)
pub = rospy.Publisher('ultra4', Int32MultiArray, queue_size=1)
msg = Int32MultiArray()
while not rospy.is_shutdown():
read_sensor()
pub.publish(msg)
time.sleep(0.2)
ser_front.close()
ultra4_sub.py
#!/usr/bin/env python
import rospy
from std_msgs.msg import Int32MultiArray
def callback(msg):
print(msg.data)
rospy.init_node('ultrasonic_sub')
sub = rospy.Subscriber('ultra4', Int32MultiArray, callback)
rospy.spin()
3) launch 파일
ultra4.launch
<launch>
<node pkg="ultrasonic" type="ultra4_pub.py" name="ultra4_pub"/>
<node pkg="ultrasonic" type="ultra4_sub.py" name="ultra4_sub" output="screen"/>
</launch>
4) 빌드 및 실행
빌드
cm
실행
roslaunch ultrasonic ultra4.launch
실행 결과
참고
위 화면과 같이 에러가 발생하면서 실행이 안되는 오류가 종종 있는데, 무시하고 다시 실행하였다.
rqt_graph