전체 코드!

IMU로 Encoder를 보정할 때 칼만필터를 사용해야하는데, 이때 각속도가 필요하다고 한다!

그래서 IMU에서 받아온 yaw 값으로 각속도를 계산했다.

 

중심 식은 

                                         change_yaw=float((now_yaw-pre_yaw)/(now_sec-pre_sec))

 

간단하게 "yaw값의 변화량/시간의 변화량" 이다ㅋㅋ

 

time 라이브러리를 사용해서 현재 시간을 받아왔다. 

time 라이브러리는 epoch time(Unix time)을 다룰 때 사용한다고 한다. epoch time은 UTC 기준으로 1970년 1월 1일 0시 0분 0초 부터의 경과시간을 나타낸다고 한다! (신기행)

datetime 라이브러리를 사용해서 정규화된 시간을 사용할까도 했지만, 그냥 간단하게 변화량, 즉 빼기만 하면 되기 때문에 그냥 time 라이브러리를 사용했다ㅋㅋ

 

처음 코드가 실행될 때는 pre_sec, pre_yaw 즉 이전의 시간과 yaw 값이 없기 때문에 if 문으로 i=0일 때를 따로 나눠줬다.

간단한 코드지만 은근히 기분이 좋다ㅎㅎ

배송온 나사와 너트를 가지고 암을 열심히 조립하고 있다!

점점 깔깔이랑 육각랜치 쓰는게 쉬워지고 있다ㅋㅋㅋㅋ

열심히 조립중!
열심히 도안 그리는중

7월부터는 1학년이 전부 바하팀으로 가서 외장팀이 하는 일도 하게 됐다!! 저 사진은 차의 앞부분을 덮을 철판 사이즈를 측정하고 있는 건데,

차 앞부분이 구부러지는 모양이어서 도면을 만들기가 정말정말 어려웠다ㅏ...

열심히 일한 흔적!

오늘은 이 아이를 조립했다. 이름이 있었는데 기억이 안난다ㅏ.. 저 파란색은 대기어로, 선배가 절대로 날이 나가면 안된다고 신신당부 하셨던 놈이다!

'@뚝딱뚝딱-KURC' 카테고리의 다른 글

6~7월의 작업(2)!  (0) 2021.08.23
7월의 작업  (0) 2021.08.23

이건 처음 작업복을 입었을 때 사진ㅋㅋㅋ
직접 밀링!!(6.27)

이번에는 직접 밀링을 했다 ㄷㄷ(6월꺼긴 한데ㅋㅋㅋㅋ)

늘 선배가 하시는것만 보다가 직접 해봤는데, 축을 3개를 움직여야해서 정말 어려웠다...한번 잘못 깎으면 다시 시작해야하기 때문에

더 떨렸던 것 같다ㅜㅜ

 

그리고 저거로 18차의 녹을 벗기는 작업을 했다. 프레임을 재활용 하기로 했는데 녹이 너무 슬어서 다같이 매달려서 그라인더(?)로 겉면을 다 갈았다. 한여름에 작업복 입고, 얼굴 보호대 쓰고, 마스크 쓰고, 서서 계속 작업을 하니까 땀이 너무 났다ㅜㅜ

 

탭핑!

얘는 바퀴와 차체를 연결하는 암인데, 같이 녹슬고 야마가 나서 다시 탭핑을 해줬다ㅜㅜ진짜 힘이 많이 들어가서 나는 초반부분만 했다. 

완전 야마나고 녹이슨 부분은 끼기기긱! 이러면서 나면 안될 소리가 난다ㅋㅋㅋㅋ

 

이건 브레이크 잡을 때의 사진이다. 마스터 실린더의 브레이크 액 넣는 부분에 브레이크 액을 넣고, 브레이크 페달을 계속 밟으면 뒤에서 선배가 브레이크 압력이 잘 맞춰졌는지 확인하셨다. 은근 고되고 힘든 작업이었다...

캘리퍼가 최종적으로 브레이크를 잡는 역할을 해주는데, 결국 이게 문제였어서 다시 분해하고 캘리퍼를 고쳐서 다시 조립했다ㅎㅎ...

 

연료통 구상중!!

이건 대회에서 연료통에 대한 규칙이 새로 바뀌어서 다같이 어떻게 연료통을 만들지 구상했던 사진이다!!

꽤 잘그린듯ㅎㅎ

 

열심히 일하는중

암을 조립해야하는데, 옛날 차체다 보니 현재 동아리가 갖고있는 나사중에 호환이 되는게 없었다ㅜㅜ

어떤 사이즈의 나사와 너트가 들어갈지 일일이 다 측정했다..ㄷㄷ

나는야 정리의 신!

결국 모두 정리해서 주문했다ㅋㅋㅋㅋ

'@뚝딱뚝딱-KURC' 카테고리의 다른 글

7~8월 작업!  (0) 2021.08.23
7월의 작업  (0) 2021.08.23

코로나로 인해 대학 생활은 물건너가고 학교에서 생산적인 활동을 하고싶었던 나는 KURC에 들어갔다!

다른 친구들에 비해 좀 늦게 들어갔지만 바로 실전에 투입돼서 이것저것 배우고 있다ㅋㅋㅋ

이 글을 쓰는 지금 8월 23일은 코로나가 너무 심해서 작업을 나가고 있지 않는 상태다ㅜㅜ

작업이 힘들긴 하지만 얼른 코로나가 안정돼서 다시 작업에 나갈 수 있으면 좋겠다.

 

지금까지 내가 했던 활동들을 적어보려고 한다!

 

 

7월 15,16일

자동차의 페달 부분!

페달 부분을 만들었다. 정확히는 옛날에 썼던 거를 분해하고 다시 조립했다ㅋㅋ

마스터실린더는 다시 재활용하고, 악셀, 브레이크, 클러치의 발판은 다시 튼튼하게 만들었다.

페달은 엑셀, 브레이크, 클러치, 마스터실린더로 이루어져있다.

다른 자동차에 있는 마스터실린더를 분해해서 새로운 자동차에 달았다!

주문제작한 페달 부분의 철판을 선반과 용접으로 조립. (난 아직 용접은 못해봤다ㅎㅎ..)

 

카뷰레이터, 오일쿨러 연결중

카뷰레이터는 연소를 위해 연료(엔진오일)와 공기를 일정 비율로 혼합해주는 역할을 한다.

오일쿨러는 오일을 냉각시키고 오일 온도를 정상 작동 범위 내로 유지하는 역할을 한다. 엔진이 작동중일 때 오일의 점도는 온도가 증가함에 따라 감소해서 윤활 능력을 감소시킨다고 한다!!

오일쿨러와 카뷰레이터와 엔진을 연결해주고 CDI를 연결시켰다.

선배한테 저 쪼끄만 단자가 뭐냐고 물어보니, CDI라고 명령을 내려주는 역할을 한다고 했다. 쪼그만게 제법이다.

 

저 작업을 끝내고 핸들과 바퀴를 연결하고 균형이 맞는지 확인하는 작업을 했다. 아쉽게도 내사진은 없다ㅜㅅㅜ내가 찍었으니까ㅏㅇㅁㅇ...

 

 

 

7월 20일

케이블을 고정하는 마운트

새로운 페달은 케이블을 고정할 마운트가 안달려 있어서, 직접 만들어야했다! 크기를 정확히 가늠하려고 내 손가락과 비교샷ㅋㅋㅋ

클러치는 기어가 깨지지 않게 방지하는 역할을 한다!

면허를 안따서 그런지 모르는 용어가 많다ㅋㅋㅋ

드디어 그라인더 사용!!

그라인더로 마운트에 와이어가 들어갈 틈을 내줬다. 드디어 그라인더를 처음 써봤는데 무섭고 조절이 어려웠다ㅋㅋ

세이프티 와이어!

마지막으로 세이프티 와이어 제작!!

세이프티 와이어는 너트를 끼우지 못하는 부분에 8자 모양으로 와이어를 연결해줘서 서로 반대되는 힘을 받게해서 나사가 풀리지 않게 고정해주는 방법이다!!

은근 힘이 많이 들어가는 작업이어서 내껀 못난이가 돼버렸다ㅏ..

 

'@뚝딱뚝딱-KURC' 카테고리의 다른 글

7~8월 작업!  (0) 2021.08.23
6~7월의 작업(2)!  (0) 2021.08.23

방학동안 빅데이터 공부를 해보고싶어서 친구들과 참가하게 됐다. 어쩌다보니 자율주행까지 하게돼서 일정이 많이 빡빡해질 것 같지만 그래도 열심히 해보려고 한다!!

이제 대회가 얼마 안남았기 때문에 경기대에서 테스트 주행을 해봐야 한다!! 테스트 주행을 하기위해서는 경기대 waypoint 뿐만 아니라  시뮬레이터에서 전해주는 센서값이 아닌 실제 플랫폼의 센서값을 erp42_planner.py로 보내줘야 한다.

이 코드를 짜기 전까지는 "시뮬레이터에서 오는 값은 뭐고, 플랫폼에서 오는 값은 뭐지!??" , "파일 구조들이 대체 어떻게 되먹은거지!!"

싶었는데 선배랑 같이 그림을 그린 후 체계가 잘 잡혔다ㅎㅅㅎ

 

열띤 토의 끝의 계획도...

초기 계획도는 저게 아니었는데, 코딩을 하다보니 파일 구조가 많이 개편됐다.

원래는 serial_node.py에 gps, encoder, imu 정보를 한번에 publish하려고 했는데, 하나의 쓰레드 안에서 시리얼 통신을 하고 Publish 하는것은 불가능했다..

센서마다 데이터를 전하는 주기가 다른데, 세개를 하나의 쓰레드 안에서 Publish 하면 가장 느린 센서를 기준으로 Publish 하게돼서 세 파일로 나누기로 결정했다.

 

세개를 각각 Publish 해서 바로 erp42_planner.py에 전해주면 되지 왜 또 serial_node.py가 있나 싶을거다.

erp42_planner.py가 구독하는 토픽들

erp42_planner.py에서는 /Ego_topic 을 EgoVehicleStatus 자료형으로 받고 statusCB함수로 넘겨준다.

이 /Ego_topic에 gps, encoder, imu값이 들어가야 한다.

statusCB에 들어가보면 status_msg를 EgoVehicleStatus 형으로 만들어준 후 바로 data를 넣어준다.

그러나 gps.py , imu.py에서 publish되는 토픽은 Float32MultiArray이고,

encoder.py에서 publish되는 토픽은 Int16()이기 때문에 세개의 토픽을 erp42_planner.py에서 바로 합쳐주는 것이 많이 번거로웠다.

(선배가 뼈대가 되는 코드는 많은 사람들이 여러곳에서 접근하고, 수정할 수도 있기 때문에 왠만하면 바꾸지 않는것이 좋다고 하셨다.)

(그림에 Int16인데 Int36으로 적었네ㅋㅋㅋ)

 

그래서 gps, encoder, imu 정보를 serial_node.py에서 받아서 EgoVehicleStatus 형태로 합쳐준 다음에 다시 Publish해서 erp42_planner.py에서 sub 하기로 했다.

 

코드 짜고, 형태를 수정하고 하면서 진짜 이부분은 완전히 잘 알게된것같다ㅏ....ㄷㄷ

 

erp42_GPS.py

다행히 gps 정보를 받아오는 코드는 K-city에 가서 gps 값을 얻어올때 사용한 코드가 있었다. 이 코드를 가져와서 USB시리얼포트를 열어서 정보를 읽고 보정해서 publish 하는 코드를 만들었다. 

 

이 코드를 짜면서 처음으로 Float32MultiArray형의 토픽을 만들어봤다. GPS 값이 x, y가 나오는데 두개나 publish 하기 귀찮아서 배열에 담아서 publish 했다.

 

차선인식, 신호판별 등 자율주행에 쓰이는 카메라는 Logitech 제품으로 윈도우에서 Logitech Capture 프로그램으로 녹화를 하고있었다.

근데 팀장 선배가 혹시 Logitech Capture 프로그램에서 자체적으로 보정을 하고 있지는 않을까?!라는 의문을 제기해서 Ubuntu에서

카메라에 찍히는 영상을 바로 저장하는 코드를 만들어봤다. (이러다가 Opencv 고수될듯..아직 멀었지만ㅋㅋㅋ)

 

내가 처음 짰던 코드

찾아본 블로그들에서는 맨날 gray로 바꾸고 색 반전을 해서 그냥 비디오만 캡쳐하는 코드만 가져와서 돌려봤는데, 파일은 저장되지만 영상이 열리지 않았다ㅜㅅㅜ

VideoWriter() 함수의 파라미터를 좀 더 살펴볼걸 그랬다.

코드와 문제점을 Github Issue에 올렸더니, 선배가 조금 손봐주셨다ㅏ

 

바뀐점은 VideoWriter의 파라미터를 get함수를 사용해서 우리가 사용하는 캠에 맞는 값으로 변경 후 

if cv2.waitKey(1) == ord('q')로 바꿔줬다. 

&0xFF 부분에서 오류가 났다고 한다ㅜㅜ

 

#오류난 이유#

cv2.waitKey(1) 은 바로 전에 입력된 key를 반환한다. 입력된 key가 없으면 -1을 반환

&0xFF 는 키의 단일바이트 표시를 유지하기 위한 이진 AND 작업이라고 한다.

그니까 q키가 입력되기 전까지 계속 while문을 돌려야하는건데, 처음 짰던 코드에는 1이 아닌 0이 들어가있다...대체 왜 들어갔지?ㅋㅋㅋㅋ

저 코드들은 여러 코드들 조합 보면서 끄적끄적 적었던거여서 출처가 정확히 기억이 안난다ㅜㅅㅜ

 

 

 

결국 저 코드로 USB CAM 영상을 촬영했는데 결과는!!(뚜둥!!)

ㄸㄹㄹ...

 

선배가 카메라 영상을 RViz에 토픽 구독으로 띄우는걸 해보라고 하셔서 진행한 작업이다. 

이 블로그를 보고 작업했다.

http://chofukutomi.blogspot.com/2017/01/usb-camera-ros-kinetic-ubuntu-1604.html

 

[참고] ROS kinetic에서 WebCam 사용하기 (Ubuntu 16.04)

Reference: 1. https://github.com/bosch-ros-pkg/usb_cam/issues/53  2. http://zumashi.blogspot.jp/2016/12/ros-kinetic-usb-cam.html  3. ...

chofukutomi.blogspot.com

내가 나오고 있다!

 

 

 

 

 

그런데 선배가!!  "카메라에 직접 연결하는 형태 말고, image 전달하면 rviz에 띄워주는 함수로 구현되면 좋을 것 같습니다. 추가로, 카메라 여려개 사용할 예정인데, 여러개 띄우는것도 가능한지 궁금하네요" 라고 하셨다!! (뚜둥!)

이전까지는 ros의 pub, sub 개념을 직접 코드화 해보지 않아서 약간 멘붕이 왔었다.

ros의 pub,sub 개념을 잘 이해한 지금, 정말 이상한 질문 같다ㅋㅋㅋㅋ

다행히 선배가 이해하기 쉽게 잘 알려주셔서 ros의 빨리 개념이 잡히고 image를 publish 하는 함수를 짤 수 있었던 것 같다!

 

코드 완성본!!
main 부분에서 함수 두번 호출해서 이미지 2개 띄우기

 

시뮬레이터의 플랫폼에 달려있는 카메라에서 송출되는 이미지가 RViz에 뜨는 것이 신기했다ㅋㅋㅋ

시뮬레이터의 화면
RViz에 뜨는 카메라 두대의 image!!

 

 

코드 출처!!

정말 여러 블로그를 보면서 시도해봤는데 이 코드가 젤 잘돌아간다ㅋㅋㅋ 

https://www.programmersought.com/article/61544639460/

 

ROS uses python to publish Image topic - Programmer Sought

Use python to publish Image messages under ROS The blogger went to the official website for a long time, and there is no example of publishing Image on the python side. Specially to add. First, the Image type is derived from sensor_msgs.msg. Its types incl

www.programmersought.com

 

 

19일 전이니 8월 2일에 구현 완료했군ㅎㅅㅎ

+ Recent posts