'잡동사니'에 해당되는 글 13415건
- 2025.05.08 폭주 2
- 2025.05.08 bit banging
- 2025.05.08 stm32flash
- 2025.05.08 renesas ra6 rfp-cli
- 2025.05.08 아이나비 dmb 안테나
- 2025.05.07 kinect 1.x, 2.x color <-> depth mapping
- 2025.05.07 numa 와 smp
- 2025.05.06 가족 추가요~
- 2025.05.06 kinect v2 잘못된 깊이 맵 맵핑
- 2025.05.05 libfreenect2 rgb / depth 매핑 소스코드 분석
bit band는 들어봤는데
[링크 https://blog.naver.com/eziya76/220983418293]
bit banging은 첨 들어봐서 검색해보니, 그냥 gpio로 uart / i2c / spi 등을 통신할 수 있도록 구현하는 것을 지칭한다.
그냥 깡으로 구현한다고 생각해서 지칭하는 용어가 없는 줄 알았는데...
[링크 https://article2.tistory.com/338]
Bit banging is a term of art that describes a method of digital data transmission as using general-purpose input/output (GPIO) instead of computer hardware that is intended specifically for data communication.[1] Controlling software is responsible for satisfying protocol requirements including timing which can be challenging due to limited host system resources and competing demands on the software. |
'이론 관련 > 컴퓨터 관련' 카테고리의 다른 글
numa 와 smp (0) | 2025.05.07 |
---|---|
USB BOS - Binary Object Store (0) | 2024.07.14 |
DDR3 pinout과 ECC (0) | 2024.04.01 |
uefi dxe pei (0) | 2024.04.01 |
radix 4 - fp4 (0) | 2024.03.21 |
리눅스 배포판에 포함된 stm32용 bootloader용 uart / i2c 업데이트 프로그램
나중에 한번 써봐야지
stm32flash - flashing utility for STM32 through UART or I2C |
[링크 https://manpages.ubuntu.com/manpages/bionic/man1/stm32flash.1.html]
[링크 https://sourceforge.net/p/stm32flash/wiki/Home/]
'embeded > Cortex-M3 STM' 카테고리의 다른 글
stm32 boot loader(shipping) (0) | 2025.05.13 |
---|---|
stm32 timer로 gpio 에 연결된 led on/off (0) | 2025.03.26 |
stm32 sleep mode (0) | 2025.03.10 |
STM32 float point support 활성화시 %f 출력 NaN (0) | 2025.03.07 |
STM32 timer 사용하기 (0) | 2024.12.13 |
리눅스(x86) 에서 작동 확인
$ ./rfp-cli -device RA -port /dev/ttyUSB0 -read dump.bin Renesas Flash Programmer CLI V1.12 Module Version: V3.19.00.000 Connecting the tool (COM port) Tool: /dev/ttyUSB0 Interface: 2 wire UART Connecting the target device Speed: 115,200 bps Connected Reading data from the device [Code Flash 1] 00000000 - 001FFFFF 93% [======================================================> ] |
-device 옵션은 필수로 들어가야 하고
메뉴얼을 보면 도구에서 uart가 있어야 할 것 같은데 이건 아예 지정하지 않아도 된다.
장치와 접속 방법만 알려주면 작동할 용도가 없어서 no operation 뜨고 종료된다.
$ ./rfp-cli -device RA -port /dev/ttyUSB0 Renesas Flash Programmer CLI V1.12 Module Version: V3.19.00.000 Connecting the tool (COM port) Tool: /dev/ttyUSB0 Interface: 2 wire UART Disconnecting the tool No operation |
-write* 은 특정 영역에 값을 쓸 수 있고
-write32 <addr> <data>[,<data>...] -writebit <addr> <pos> <bitdata> |
-read 는 읽어서 파일에 쓸 수 있고
-read <file>, -r <file> -read-bin <addr> <size> <file>, -rb <addr> <size> <file> -read-view <addr> <size>, -rv <addr> <size> |
-erase , -program 으로 장치를 삭제할 수 있다.
-erase, -e Erases flash memory of the device. -program, -p Erases the range for writing to the device and writes to the device. -erase-chip Erases all data in the flash memory of the device and clears the configuration settings. |
파일 지정은 가장 마지막에 해주면 된다.
rfp-cli [option...] [hexfile...] |
일단은 나쁘지 않게 사용중. 그런데 실내 + 짧아서 그런지 모르겠지만
혹은 새로 바꾸고 더 신경써서 그런진 모르겠지만 묘하게 수신 안되는 곳이 꽤 많아 보인다.
ytn 채널인지 먼진 모르겠지만 dmb 수신이 되는데 tpeg은 신호 없음이 뜨다니 멀까..
[링크 : http://itempage3.auction.co.kr/DetailView.aspx?itemno=D721489963]
[링크 : https://m.11st.co.kr/products/ma/33687866?prdNo=33687866]
이건 아이나비 커넥터 쪽
왼쪽은 그냥 굴러 다니던 안테나 커넥터 인데 아쉽게도.. 맞지 않는다.
오른쪽이 아이나비 dmb 안테나. 먼가 딱 봐도 좀 비싸 보이네
히로세 533 규격 이라고 한다.
근데 검색해도 드럽게 안나오네
[링크 : https://blog.naver.com/pkw00/221497143443]
kms 533 으로 검색하면 나오는 녀석들.. 이거 맞...나?
그 와중에 male은 찾는데 실패
[링크 : https://entertec.cafe24.com/product/kms-533-s/2987/]
[링크 : https://kjtelecom.co.kr/mall2/shop/prod_view.jsp?cc=5121]
링크와는 다르게 내용상으로는 preview 시절(?) api 같은데
colorframe -> depth
public void MapColorFrameToDepthSpace ( Array<UInt16>[] depthFrameData, out Array<DepthSpacePoint>[] depthSpacePoints ) |
depth -> colorframe 가 존재한다.
public void MapDepthFrameToCameraSpace ( Array<UInt16>[] depthFrameData, out Array<CameraSpacePoint>[] cameraSpacePoints ) |
v1.8에도 존재 (링크 사라짐)
[링크 : https://learn.microsoft.com/en-us/previous-versions/windows/kinect-1.8/jj663707(v=ieb.10)]
[링크 : https://stackoverflow.com/questions/17012585/how-do-you-map-kinects-depth-data-to-its-rgb-color]
그래서 함수 명으로 검색했는데 좀 이름이 다르다.
HRESULT MapDepthFrameToColorFrame( NUI_IMAGE_RESOLUTION eDepthResolution, DWORD cDepthPixels, NUI_DEPTH_IMAGE_PIXEL *pDepthPixels, NUI_IMAGE_TYPE eColorType, NUI_IMAGE_RESOLUTION eColorResolution, DWORD cColorPoints, NUI_COLOR_IMAGE_POINT *pColorPoints ) |
[링크 : https://learn.microsoft.com/en-us/previous-versions/windows/kinect-1.8/jj883691(v=ieb.10)]
HRESULT MapColorFrameToDepthFrame( NUI_IMAGE_TYPE eColorType, NUI_IMAGE_RESOLUTION eColorResolution, NUI_IMAGE_RESOLUTION eDepthResolution, DWORD cDepthPixels, NUI_DEPTH_IMAGE_PIXEL *pDepthPixels, DWORD cDepthPoints, NUI_DEPTH_IMAGE_POINT *pDepthPoints ) |
[링크 : https://learn.microsoft.com/en-us/previous-versions/windows/kinect-1.8/jj883688(v=ieb.10)]
'프로그램 사용 > kinect' 카테고리의 다른 글
libfreenect2 VAAPI 버그? (2) | 2025.05.22 |
---|---|
kinect v2 잘못된 깊이 맵 맵핑 (0) | 2025.05.06 |
libfreenect2 rgb / depth 매핑 소스코드 분석 (0) | 2025.05.05 |
kinect rgb - depth mapping (0) | 2025.05.01 |
kinect 깊이 정밀도 (0) | 2025.04.15 |
문득 numa 라는게 보여서 먼가 해서 찾아보는데
smp는 north bridge가 있던 시절이고(!)
north bridge의 memory controller가 cpu의 요청에 따라 큐잉되어 메모리를 읽어서 보내주고
메모리에 cpu들이 많이 요청하면 응답대기가 길어지는 문제가 발생
그래서 NUMA 에서는 cpu 별로 메모리를 장착하고
local memory라고 이름짓고는 자기에게 할당된 메모리에서는 쌩쌩하게
그게 아니면 cpu 간의 inter-connect를 이용하여 다른 cpu의 메모리를 접근해서 대용량 메모리를 쓰는 구조
[링크 : https://jeongzero.oopy.io/94ef3e61-c27c-4fba-b8b9-2b9b8aac933a]
[링크 : https://brunch.co.kr/@dreaminz/4]
아.. 그래서 요즘 서버가 cpu 별로 메모리가 구성되어야 해서 특정 슬롯에 꽂아 해당 cpu에 local memory로 구성되게 되는거였군..
반대로 그러면.. cpu 에서 스케쥴링 할때 cpu 에 round robin등으로 임의 할당하면 안되고
어느정도는 벗어날수 없는(?) 경계가 존재하는 affinity 제한적 스케쥴링을 해야 하는건가?
'이론 관련 > 컴퓨터 관련' 카테고리의 다른 글
bit banging (0) | 2025.05.08 |
---|---|
USB BOS - Binary Object Store (0) | 2024.07.14 |
DDR3 pinout과 ECC (0) | 2024.04.01 |
uefi dxe pei (0) | 2024.04.01 |
radix 4 - fp4 (0) | 2024.03.21 |
6개월 만에 다시 똥 치우는 신세로 전락할 느낌.. 후..
코코(1살, 성별 모름, 코뉴어)
걍 꼬꼬 하자니까.. -_-
'개소리 왈왈 > 육아관련 주저리' 카테고리의 다른 글
폭주 (2) | 2025.05.08 |
---|---|
아이나비 dmb 안테나 (0) | 2025.05.08 |
피곤 (0) | 2025.05.04 |
여유 (0) | 2025.05.02 |
참관수업 그리고 데이트 (2) | 2025.04.23 |
심심해서(?) 실행해봤는데 어라...
아무래도 depth 카메라와 rgb 카메라의 거리가 떨어져있어서 시차로 인한 오류가 발생을 하는지
특수한 각도에서는 다음과 같이 이상하게 맵핑이 된다.
(노트북 뒤로 몽둥이를 들고 있는데 3d로 합성된 쪽에서는 투명하게 뚫는 것 처럼 보임)
libfreenect2의 한계인가.. 아니면 윈도우 버전도 이럴려나?
'프로그램 사용 > kinect' 카테고리의 다른 글
libfreenect2 VAAPI 버그? (2) | 2025.05.22 |
---|---|
kinect 1.x, 2.x color <-> depth mapping (0) | 2025.05.07 |
libfreenect2 rgb / depth 매핑 소스코드 분석 (0) | 2025.05.05 |
kinect rgb - depth mapping (0) | 2025.05.01 |
kinect 깊이 정밀도 (0) | 2025.04.15 |
libfreenect2 내의 매핑 코드가 이해가 안되서 다른걸 찾아보는데 여전히 이해가 안된다..
코드 상으로는 크게 차이가 없는 것 같지만, color map에 depth map을 합성하는게 더 자연스러워 보이는 것 같다.
The following snippet shows us how to locate the color bytes from the ColorSpacePoint: // we need a starting point, let's pick 0 for now int index = 0; ushort depth = _depthData[index]; ColorSpacePoint point = _colorSpacePoints[index]; // round down to the nearest pixel int colorX = (int)Math.Floor(point.X + 0.5); int colorY = (int)Math.Floor(point.Y + 0.5); // make sure the pixel is part of the image if ((colorX >= 0 && (colorX < colorWidth) && (colorY >= 0) && (colorY < colorHeight)) { int colorImageIndex = ((colorWidth * colorY) + colorX) * bytesPerPixel; byte b = _colorFrameData[colorImageIndex]; byte g = _colorFrameData[colorImageIndex + 1]; byte r = _colorFrameData[colorImageIndex + 2]; byte a = _colorFrameData[colorImageIndex + 3]; } ![]() |
그나저나 depth sensor가 더 FOV가 넓어서 왜곡되다보니
depth map에 맵핑했을 경우에는 lens 왜곡 보정을 한 것 같기도 한데
코드 상에는 별 내용이 없는 것 같기도 하고.. 멀 한거지?
// clear the pixels before we color them Array.Clear(_pixels, 0, _pixels.Length); for (int depthIndex = 0; depthIndex < _depthData.Length; ++depthIndex) { ColorSpacePoint point = _colorSpacePoints[depthIndex]; int colorX = (int)Math.Floor(point.X + 0.5); int colorY = (int)Math.Floor(point.Y + 0.5); if ((colorX >= 0) && (colorX < colorWidth) && (colorY >= 0) && (colorY < colorHeight)) { int colorImageIndex = ((colorWidth * colorY) + colorX) * bytesPerPixel; int depthPixel = depthIndex * bytesPerPixel; _pixels[depthPixel] = _colorData[colorImageIndex]; _pixels[depthPixel + 1] = _colorData[colorImageIndex + 1]; _pixels[depthPixel + 2] = _colorData[colorImageIndex + 2]; _pixels[depthPixel + 3] = 255; } } ![]() |
[링크 : https://www.bryancook.net/2014/03/mapping-between-kinect-color-and-depth.html]
[링크 : https://stackoverflow.com/questions/29479746/kinect-v2-color-depth-mapping-using-c-sharp]
[링크 : https://kr.mathworks.com/matlabcentral/answers/268152-mapping-rgb-and-depth-kinect-v2]
[링크 : https://tommyhsm.tistory.com/124]
libfreenct의 Protonect 실행하는 부분에서, rgb와 depth를 어떻게 매핑하는지 궁금해서 찾아보는데 크게 자료가 있진 않다.
/// [registration setup] libfreenect2::Registration* registration = new libfreenect2::Registration(dev->getIrCameraParams(), dev->getColorCameraParams()); libfreenect2::Frame undistorted(512, 424, 4), registered(512, 424, 4); /// [loop start] while(!protonect_shutdown && (framemax == (size_t)-1 || framecount < framemax)) { if (!listener.waitForNewFrame(frames, 10*1000)) // 10 sconds { std::cout << "timeout!" << std::endl; return -1; } libfreenect2::Frame *rgb = frames[libfreenect2::Frame::Color]; libfreenect2::Frame *ir = frames[libfreenect2::Frame::Ir]; libfreenect2::Frame *depth = frames[libfreenect2::Frame::Depth]; /// [loop start] if (enable_rgb && enable_depth) { /// [registration] registration->apply(rgb, depth, &undistorted, ®istered); /// [registration] } framecount++; if (!viewer_enabled) { if (framecount % 100 == 0) std::cout << "The viewer is turned off. Received " << framecount << " frames. Ctrl-C to stop." << std::endl; listener.release(frames); continue; } #ifdef EXAMPLES_WITH_OPENGL_SUPPORT if (enable_rgb) { viewer.addFrame("RGB", rgb); } if (enable_depth) { viewer.addFrame("ir", ir); viewer.addFrame("depth", depth); } if (enable_rgb && enable_depth) { viewer.addFrame("registered", ®istered); } protonect_shutdown = protonect_shutdown || viewer.render(); #endif /// [loop end] listener.release(frames); /** libfreenect2::this_thread::sleep_for(libfreenect2::chrono::milliseconds(100)); */ } /// [loop end] |
void Registration::apply(const Frame *rgb, const Frame *depth, Frame *undistorted, Frame *registered, const bool enable_filter, Frame *bigdepth, int *color_depth_map) const { impl_->apply(rgb, depth, undistorted, registered, enable_filter, bigdepth, color_depth_map); } void RegistrationImpl::apply(const Frame *rgb, const Frame *depth, Frame *undistorted, Frame *registered, const bool enable_filter, Frame *bigdepth, int *color_depth_map) const { // Check if all frames are valid and have the correct size if (!rgb || !depth || !undistorted || !registered || rgb->width != 1920 || rgb->height != 1080 || rgb->bytes_per_pixel != 4 || depth->width != 512 || depth->height != 424 || depth->bytes_per_pixel != 4 || undistorted->width != 512 || undistorted->height != 424 || undistorted->bytes_per_pixel != 4 || registered->width != 512 || registered->height != 424 || registered->bytes_per_pixel != 4) return; const float *depth_data = (float*)depth->data; const unsigned int *rgb_data = (unsigned int*)rgb->data; float *undistorted_data = (float*)undistorted->data; unsigned int *registered_data = (unsigned int*)registered->data; const int *map_dist = distort_map; const float *map_x = depth_to_color_map_x; const int *map_yi = depth_to_color_map_yi; const int size_depth = 512 * 424; const int size_color = 1920 * 1080; const float color_cx = color.cx + 0.5f; // 0.5f added for later rounding // size of filter map with a border of filter_height_half on top and bottom so that no check for borders is needed. // since the color image is wide angle no border to the sides is needed. const int size_filter_map = size_color + 1920 * filter_height_half * 2; // offset to the important data const int offset_filter_map = 1920 * filter_height_half; // map for storing the min z values used for each color pixel float *filter_map = NULL; // pointer to the beginning of the important data float *p_filter_map = NULL; // map for storing the color offset for each depth pixel int *depth_to_c_off = color_depth_map ? color_depth_map : new int[size_depth]; int *map_c_off = depth_to_c_off; // initializing the depth_map with values outside of the Kinect2 range if(enable_filter){ filter_map = bigdepth ? (float*)bigdepth->data : new float[size_filter_map]; p_filter_map = filter_map + offset_filter_map; for(float *it = filter_map, *end = filter_map + size_filter_map; it != end; ++it){ *it = std::numeric_limits<float>::infinity(); } } /* Fix depth distortion, and compute pixel to use from 'rgb' based on depth measurement, * stored as x/y offset in the rgb data. */ // iterating over all pixels from undistorted depth and registered color image // the four maps have the same structure as the images, so their pointers are increased each iteration as well for(int i = 0; i < size_depth; ++i, ++undistorted_data, ++map_dist, ++map_x, ++map_yi, ++map_c_off){ // getting index of distorted depth pixel const int index = *map_dist; // check if distorted depth pixel is outside of the depth image if(index < 0){ *map_c_off = -1; *undistorted_data = 0; continue; } // getting depth value for current pixel const float z = depth_data[index]; *undistorted_data = z; // checking for invalid depth value if(z <= 0.0f){ *map_c_off = -1; continue; } // calculating x offset for rgb image based on depth value const float rx = (*map_x + (color.shift_m / z)) * color.fx + color_cx; const int cx = rx; // same as round for positive numbers (0.5f was already added to color_cx) // getting y offset for depth image const int cy = *map_yi; // combining offsets const int c_off = cx + cy * 1920; // check if c_off is outside of rgb image // checking rx/cx is not needed because the color image is much wider then the depth image if(c_off < 0 || c_off >= size_color){ *map_c_off = -1; continue; } // saving the offset for later *map_c_off = c_off; if(enable_filter){ // setting a window around the filter map pixel corresponding to the color pixel with the current z value int yi = (cy - filter_height_half) * 1920 + cx - filter_width_half; // index of first pixel to set for(int r = -filter_height_half; r <= filter_height_half; ++r, yi += 1920) // index increased by a full row each iteration { float *it = p_filter_map + yi; for(int c = -filter_width_half; c <= filter_width_half; ++c, ++it) { // only set if the current z is smaller if(z < *it) *it = z; } } } } /* Construct 'registered' image. */ // reseting the pointers to the beginning map_c_off = depth_to_c_off; undistorted_data = (float*)undistorted->data; /* Filter drops duplicate pixels due to aspect of two cameras. */ if(enable_filter){ // run through all registered color pixels and set them based on filter results for(int i = 0; i < size_depth; ++i, ++map_c_off, ++undistorted_data, ++registered_data){ const int c_off = *map_c_off; // check if offset is out of image if(c_off < 0){ *registered_data = 0; continue; } f const float min_z = p_filter_map[c_off]; const float z = *undistorted_data; // check for allowed depth noise *registered_data = (z - min_z) / z > filter_tolerance ? 0 : *(rgb_data + c_off); } if (!bigdepth) delete[] filter_map; } else { // run through all registered color pixels and set them based on c_off for(int i = 0; i < size_depth; ++i, ++map_c_off, ++registered_data){ const int c_off = *map_c_off; // check if offset is out of image *registered_data = c_off < 0 ? 0 : *(rgb_data + c_off); } } if (!color_depth_map) delete[] depth_to_c_off; } |
'프로그램 사용 > kinect' 카테고리의 다른 글
kinect 1.x, 2.x color <-> depth mapping (0) | 2025.05.07 |
---|---|
kinect v2 잘못된 깊이 맵 맵핑 (0) | 2025.05.06 |
kinect rgb - depth mapping (0) | 2025.05.01 |
kinect 깊이 정밀도 (0) | 2025.04.15 |
libfreenect2 on 2760p 성공 (0) | 2024.08.18 |