$ cd ~/catkin_ws/src $ git clone https://github.com/ROBOTIS-GIT/open_manipulator.git $ cd ~/catkin_ws && catkin_make
==> 에러가 난다
CMakeFiles/dynamixel_controller.dir/src/dynamixel_controller.cpp.o: In function `open_manipulator_dynamixel_controller::DynamixelController::DynamixelController()': dynamixel_controller.cpp:(.text+0x2aa): undefined reference to `dynamixel_multi_driver::DynamixelMultiDriver::initSyncWrite()' dynamixel_controller.cpp:(.text+0x3cf): undefined reference to `dynamixel_multi_driver::DynamixelMultiDriver::initSyncRead()'
core service [/rosout] found process[open_manipulator_dynamixel_controller-1]: started with pid [11056] [ INFO] [1505028572.635044008]: Succeeded to open the port(/dev/ttyUSB0)! [ INFO] [1505028572.637931777]: Succeeded to change the baudrate(57600)! [ INFO] [1505028572.718853873]: open_manipulator_dynamixel_controller : Init OK! [ERROR] [1505028572.718904905]: Sync Read Failed! terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check: __n (which is 0) >= this->size() (which is 0)
/added by orasman 170930 모터 동작속도를 낮게 설정 //caution: speed declared as uint16 @dynamixel_multi_driver.h uint16_t default_moving_speed[MAX_DXL_NUM] = {70,70,70,70,70,70,170};
if (!setMovingSpeed(default_moving_speed) ) ROS_ERROR("Init SyncRead Failed!"); else ROS_INFO("dynamixel moving speed set succeeded");
...
}
///////////////////////////////////////// // added by orasman 170930 bool DynamixelController::setMovingSpeed(uint16_t* spd) //caution: speed declared as uint16 @dynamixel_multi_driver.h { writeValue_->spd.clear();
for (int id = 1; id <= MAX_DXL_NUM; id++) { writeValue_->spd.push_back(spd[id-1]); }
if (!multi_driver_->syncWriteMovingSpeed(writeValue_->spd)) { ROS_ERROR("SyncWrite MovingSpeed Failed!"); return false; }
[ 10%] Building NVCC (Device) object CMakeFiles/cuda_compile.dir/src/cuda_compile_generated_cuda_kde_depth_packet_processor.cu.o
nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).
nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).
/home/nvidia/libfreenect2/src/cuda_kde_depth_packet_processor.cu(413): warning: function "calculatePhaseUnwrappingVarDirect" was declared but never referenced
/home/nvidia/libfreenect2/src/cuda_kde_depth_packet_processor.cu(413): warning: function "calculatePhaseUnwrappingVarDirect" was declared but never referenced
[ 13%] Generating resources.inc.h
[ 16%] Building NVCC (Device) object CMakeFiles/cuda_compile.dir/src/cuda_compile_generated_cuda_depth_packet_processor.cu.o
nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).
nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).
Scanning dependencies of target freenect2
[ 20%] Building CXX object CMakeFiles/freenect2.dir/src/transfer_pool.cpp.o
[ 23%] Building CXX object CMakeFiles/freenect2.dir/src/event_loop.cpp.o
[ 26%] Building CXX object CMakeFiles/freenect2.dir/src/usb_control.cpp.o
[ 30%] Building CXX object CMakeFiles/freenect2.dir/src/allocator.cpp.o
[ 33%] Building CXX object CMakeFiles/freenect2.dir/src/frame_listener_impl.cpp.o
[ 36%] Building CXX object CMakeFiles/freenect2.dir/src/packet_pipeline.cpp.o
[ 40%] Building CXX object CMakeFiles/freenect2.dir/src/rgb_packet_stream_parser.cpp.o
[ 43%] Building CXX object CMakeFiles/freenect2.dir/src/rgb_packet_processor.cpp.o
[ 46%] Building CXX object CMakeFiles/freenect2.dir/src/depth_packet_stream_parser.cpp.o
[ 50%] Building CXX object CMakeFiles/freenect2.dir/src/depth_packet_processor.cpp.o
[ 53%] Building CXX object CMakeFiles/freenect2.dir/src/cpu_depth_packet_processor.cpp.o
[ 56%] Building CXX object CMakeFiles/freenect2.dir/src/resource.cpp.o
[ 60%] Building CXX object CMakeFiles/freenect2.dir/src/command_transaction.cpp.o
[ 63%] Building CXX object CMakeFiles/freenect2.dir/src/registration.cpp.o
[ 66%] Building CXX object CMakeFiles/freenect2.dir/src/logging.cpp.o
[ 70%] Building CXX object CMakeFiles/freenect2.dir/src/libfreenect2.cpp.o
[ 73%] Building CXX object CMakeFiles/freenect2.dir/src/tinythread/tinythread.cpp.o
[ 76%] Building CXX object CMakeFiles/freenect2.dir/src/turbo_jpeg_rgb_packet_processor.cpp.o
[ 80%] Building CXX object CMakeFiles/freenect2.dir/src/flextGL.cpp.o
[ 83%] Building CXX object CMakeFiles/freenect2.dir/src/opengl_depth_packet_processor.cpp.o
include "NiTE.h" then i have copied all the header files from NiTE's include dir to catkin_ws/src/kinect2_tracker/include dir. An easy fix is to edit cmakeLists.txt in line 80 and 81 by providing the path to NiTE-Linux-x64-2.2 dir.
심볼릭 링크를 하거나 include 파일을 모두 복사하거나 해서 컴파일은 진행할 수 있는데,
궁극적으로 NiTE 라이브러리가 플랫폼(젯슨)과 맞지 않는다!!
젯슨용 NiTE를 찾아보았으나 OpenNI 밑에 nite가 있는데
openNI 를 애플이 인수한뒤 폐쇄 시켜버려서 그런지 모든 nite 링크가 애플로 연결되고 페이지가 삭제 되었다고 나온다!
openni.ru 러시아 홈페이지는 살아 있긴 한데, 여기서 젯슨 또는 ARM core 를 지원하진 않고 있다!
결국 젯슨에서는 안되고 x86, x64 기반의 intel CPU 에 설치해서 해야 할 듯 하다!!
러시아쪽 OpenNI 싸이트에서 히스토리를 찾았는데, ARM 코어 지원이 없는듯 하다 http://openni.ru/openni-sdk/openni-sdk-history-2/index.html
Nite 설명문서를 보니 Nite가 인체모형을 추출하는 라이브러리 http://openni.ru/wp-content/uploads/2013/02/NITE-Algorithms.pdf
러시아 openni.ru 에서 ARM 코어용 NiTE 발견 <== 아!! 이건 NiTE가 아니고 openNI 였음 ㅠㅠ http://openni.ru/openni-sdk/index.html
젯슨보드가 아니고 노트북 (X64) 에서 컴파일 했더니 플랫폼이 맞는데 다른 종류의 에러가 발생 In file included from /home/orasman/catkin_ws/src/kinect2_tracker/src/kinect2_tracker_node.cpp:8:0: /home/orasman/catkin_ws/src/kinect2_tracker/src/../include/kinect2_tracker.hpp:218:2: error: expected unqualified-id before ‘-’ token -// This function publishes the calibration_space opposite the shoulders of the user ^ /home/orasman/catkin_ws/src/kinect2_tracker/src/kinect2_tracker_node.cpp:24:1: error: expected ‘}’ at end of input } ^ In file included from /home/orasman/catkin_ws/src/kinect2_tracker/src/kinect2_tracker_node.cpp:8:0: /home/orasman/catkin_ws/src/kinect2_tracker/src/../include/kinect2_tracker.hpp: In constructor ‘kinect2_tracker::kinect2_tracker()’: /home/orasman/catkin_ws/src/kinect2_tracker/src/../include/kinect2_tracker.hpp:55:7: error: class ‘kinect2_tracker’ does not have any field named ‘it_’ it_(nh_) ^ /home/orasman/catkin_ws/src/kinect2_tracker/src/../include/kinect2_tracker.hpp:55:11: error: ‘nh_’ was not declared in this scope it_(nh_) ^
해당 파일을 열어 봤더니 소스코드에 '-' 문자가 주르륵 붙어 있어서 에러가 난 것이었다. 코드를 수정하니 컴파일 성공!!
orasman@orasman-A515-K-AFLUL:~/catkin_ws$ catkin_make . . . [ 94%] Built target ros_tutorial_srv_server [ 96%] Built target laser_proc_ROS [ 98%] Built target laser_proc [ 98%] Built target LaserProcNodelet [100%] Linking CXX executable /home/orasman/catkin_ws/devel/lib/kinect2_tracker/kinect2_tracker_node [100%] Built target kinect2_tracker_node
내 노트북에서 USB2.0 포트를 통해서 키넥트를 연결하면 디바이스는 찾는데 USB가 저속이라 연결을 못한다
orasman@orasman-A515-K-AFLUL:~/libfreenect2/build$ ./bin/Protonect Version: 0.2.0 Environment variables: LOGFILE=<protonect.log> Usage: ./bin/Protonect [-gpu=<id>] [gl | cl | clkde | cuda | cudakde | cpu] [<device serial>] [-noviewer] [-norgb | -nodepth] [-help] [-version] [-frames <number of frames to process>] To pause and unpause: pkill -USR1 Protonect [Info] [Freenect2Impl] enumerating devices... [Info] [Freenect2Impl] 9 usb devices connected [Info] [Freenect2Impl] found valid Kinect v2 @2:16 with serial 095447635047 [Info] [Freenect2Impl] found 1 devices [Info] [Freenect2DeviceImpl] opening... [Error] [protocol::UsbControl] failed to claim interface with IrInterfaceId(=1)! LIBUSB_ERROR_BUSY Resource busy. Try debugging with environment variable: export LIBUSB_DEBUG=3 . [Info] [Freenect2DeviceImpl] closing... [Info] [Freenect2DeviceImpl] deallocating usb transfer pools... [Info] [Freenect2DeviceImpl] closing usb device... [Info] [Freenect2DeviceImpl] closed [Error] [Freenect2Impl] failed to open Kinect v2: @2:16 failure opening device!
TOSHIBA notebook re-install and roslaunch
bluesky@bluesky-Satellite-S55t-B:~$ roslaunch kinect2_tracker tracker.launch ... logging to /home/bluesky/.ros/log/820175c4-815f-11e7-9ca2-2c600c1c08fe/roslaunch-bluesky-Satellite-S55t-B-2385.log Checking log directory for disk usage. This may take awhile. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB.
core service [/rosout] found process[kinect2_tracker_node2-1]: started with pid [2403] process[brix_to_global2-2]: started with pid [2404] [FATAL] [1502763338.460627769]: Can't Open Device [kinect2_tracker_node2-1] process has finished cleanly log file: /home/bluesky/.ros/log/820175c4-815f-11e7-9ca2-2c600c1c08fe/kinect2_tracker_node2-1*.log
1. 스마트폰과 앱 2. 인터넷 서버 : 사물인터넷 연결 서비스 제공 3. 인터넷 중계망 : 인터넷 무선 공유기로 집안에 사물과 인터넷 서버를
어떻게 연결할 것인가 4. 가정용 허브 : 각종 홈 키트를 관장하는 중앙 제어 장치 5. 홈 키트(장치들) : 말단 장치들..열림감지, 전기 플러그, 전등스위치 등등
1번, 2번 앱과 서버를 직접 만드시는 분들도 있으나 난 그런 능력은 없으니
열심히 발품팔아서 해결책을 찾아보자. 3번은 집에 있으니 패스~ 4번 허브와 5번 홈키트는 아두이노로 직접 만들어 보자
# 이런저런 고민과 개발 과정.. 1년의 시간
(전원 플러그 자체로 WiFi 기능을 내장한 일체형 제품도 있다)
홈 키트 만들려고 아두이노+통신모듈을 내장해서 만들려고 컨셉을 잡았는데..
기본적으로 소비 전력이 커져서 배터리 구동이 어려워 AC전원을 항상 연결해야 한다
그러니 홈 키트는 아두이노 없이 무선 통신 모듈만으로
간단한 동작과 데이터 송수신 기능만 하자 이러한 이유로 홈키트 통신 방식을 블루투스(1:1통신)나
와이파이 모듈을 쓰는건 아닌거 같다.
사실 이런 고민을 시작했던 1년 전에는
ESP8266의 펌웨어를 바꿔서 아두이노 처럼 쓸 수 있다는걸 몰랐다. 그렇다고 해도 ESP8266으로 홈키트를 만들면 전력 소모가 커서 배터리는 어렵고
AC전원을 끌어 써야 할 듯.
찾아보니 HC-11 같은 RF 모듈에 간단한 I/O 제어기능이
포함되어 있어서 쓸 수 있을것 같다.
(HC-11 모듈은 결국 사용하지 않았다..)
여기서 더 찾아보니 RF 통신으로 배터리를 내장해서
열림감지, 인체감지, 전원 플러그, 전등 스위치 제품이 있더라!! (유레카!)
게다가 이런 제품들이 상당히 저렴해서 직접 만드는것 보다 구입하는게 훨씬 싸게 들더라. (무선 전원 플러그랑 전등스위치를 직접 만들려고 했더니 재료비만 각각 몇 만원이 넘더만..)
홈키트는 자작을 포기! 그냥 싼거 사서 쓰자.. 근데 이것들이 아두이노로 제어가 될까? 앗! 아두이노에 붙일수 있는 RF 송수신 모듈도 있었네?
잘하면 아두이노로 RF 제품들을 제어할 수 있겠군..
몇 달에 걸쳐 인터넷 서핑과 시행착오, 삽질을 통해 RF 제품들 제어(=해킹)에 성공함
다행히 RF 주파수는 서로 잘 맞았는데... 프로토콜은 제품마다 달라서..
이걸 찾고, 분석하는데 상당한 노력이 필요했음
그럼 이제 RF 제품들과 WiFi를 연결해 주는 허브를 아두이노로 만들자..
아두이노가 일종의 게이트웨이(IOT 허브) 역할이 되겠네..
[RF송수신 모듈 + 아두이노 + ESP8266]
이제 그럼.. 스마트폰으로 집안에 장치들을 제어하려면 어떤 앱이 좋을까?
이것 저것 검색하다가 IFTTT 라는 싸이트 발견! 게다가 Maker 를 위한 기능이 있다고 함 찾아보니 아두이노로 IFTTT와 통신이 가능하다는걸 알게됨 더 찾아보니 DO 라는 앱을 쓰면 스마트폰에서 아두이노로 명령도 내릴수 있다고 함
자... 이제 ESP8266을 써서 WiFi로 IFTTT, DO 앱하고 연결해 볼까?
HTTP, GET 뭐 이런 프로토콜을 알아야 하네.. 음.. 잘 모르겠고 일단 만들어 보자 이것도 몇달에 걸쳐 장님 코끼리 뒷다리 만지듯이 시행착오를 통해 IFTTT 서버로 전송 성공 열림감지 센서값을 RF로 받아서 IFTTT 통해서 스마트폰에 알람을 띄움
스마트 폰에서 DO앱으로 명령을 내리면 ESP8266+아두이노가 알아듣고 전등을 키고 싶다면, ESP8266를 서버 모드로 셋팅하고 문자를 받으면 해석해서 해당 명령에 맞는 동작을 함 이것도 역시 몇달 걸려서 ESP8266 서버 기능과 수신 문자 해석 기능을 만듬 하지만 내가 만든건 코드가 조잡해서 쓸만한 ESP8266 라이브러리를 찾아 개조함
필요한 기술은 다 개발했으니 시스템 통합을 하자!
이것도 ESP8266 동작시키는데 제한이 있어서 몇 달 정도 걸려서 통합을 완성함 결국 시작한지 1년 정도 걸려서 프로젝트를 완성할 수 있었다. 사실 탱자탱자 놀면서 짬짬히 하다보니 생각보다 오래 걸렸다...
# 시스템의 한계와 단점..
저렴한 RF 방식의 홈키트를 적용하다 보니 생기는 단점들.. ..전파 방해나 혼신, 보안문제, 해킹에 취약 할 수 있다 (사실 아직 사용자가 많아 질때 까지는 발생하지 않을 수 도 있다) ..홈키트 모듈에 프로세싱 기능이 없다보니 현재 상태를 피드백 해주지는 못한다 (그래서 싸다) (예를들어 전등을 켰는데 현재 켜진 상태인지, 꺼진 상태인지 응답 하는 기능은 없다)
그래서 국내 시판되는 IOT 홈오토메이션 제품들은 Z-wave 라는 무선통신을 쓴다. 아직 Z-wave는 공부를 안해서 어떤 기능까지 지원하는지 모르겠지만,
위에 언급한 문제들은 없겠지?
# 프로젝트 결과..
스마트폰으로 집 밖에서 집안에 전등과 전기 플러그를 ON/OFF 할 수 있다 잠자리에 누워서 집안에 모든 전등을 끌 수 있다 창문/현관문이 열리거나 사람이 감지되면 스마트폰에 알람이 온다 이 둘을 연결해서 집에 사람이 들어오면 자동으로 전등이나 전기 플러그가 켜진다
# 프로젝트 비용..
각 부품을 1개씩만 적용할 경우 전체 재료비는 대략 82,200원 정도
홈 오토메이션 키트 (건전지 값 포함) 열림감지 무선센서 (5,000원) 인체감지 무선센서 (12,500원) 무선 전원 플러그 (10,000원) 무선 전등스위치 (45,000원)
가정용 허브 구축 아두이노 (5,400원) ESP8266(3,500원) RF송수신모듈 (1,800원) 인터넷 서버 중계 : 무료 (IFTTT 서비스 활용)
# 상용 제품 대비 DIY 장단점과 가격 비교..
일단 DIY 를 하면 매달내는 통신비는 안낸다. (IFTTT 서비스가 유료로 되지 않는다면) 통신사에 사용기록이 남지 않아서 프라이버시를 지킬 수 있다. (특히 샤오미 같으면 중국서버에 기록이 남을수도..) 가정용 허브 코딩을 잘 하면 홈키트끼리 연동해서 동작하게 바꿀 수 있다. (상용제품에 없는 기능) 단점은 DIY를 하려면 알아야 할것도 많고, 귀찬고, 안되면 삽질도 해야한다.
상용제품을 쓰면 좀 비싸지만 좀 더 편리하게 귀찬은거 신경 안쓰고 쓸 수 있다. 다만 나만의 아이디어가 있을때 다양하게 확장하기 어렵고, 무엇보다 직접 만드는 재미는 없다.
# LG IOT@홈
통신요금 연결 제품 1개당 2,200원 가정용 허브 (별도 구입 안되고 서비스 가입시 제공) 열림감지 센서 단품 33,000원 전기 플러그 단품 44,000원 전등 스위치 단품 55,000원
# SK 스마트홈
선납이용료 (가입시 1회 납부, 5,500원) 통신요금 연결 제품 1개당 (1,100원 ,3년약정시) 연결제품 무제한(9,900원, 3년약정시) 브릿지(가정용 허브) 50,000원 전기 플러그 단품 44,000원 전등 스위치 단품 55,000원
# 샤오미 홈 오토 키트
허브+열림감지1개+인체감지1개+무선스위치1개 = 약 50달러 가격은 샤오미를 따라갈 수가 없다. 중국 서버를 거친다는게 찜찜 할 뿐..
# 개발 기술 공유를 위한 글 연재 순서..
RF수신 모듈로 프로토콜 해석하기 (열림센서, 인체감지센서, 무선리모콘 신호 받기) RF 송신 모듈로 제어 명령 보내기 (전등 스위치 또는 전기 플러그 ON/OFF) 무료 인터넷 중계 서버 IFTTT 사용법 ESP8266 으로 IFTTT에 트리거 보내서 스마트폰 알람 띄우기 스마트폰 DO 앱으로 ESP8266에 알림 보내기 ESP8266 AT명령으로 쓸 때 주의할 점 지금까지 기술을 집약해서 가정용 허브 만들기