Tuesday, June 2, 2020
Thursday, May 14, 2020
linux에서 unreal engine + market place setting
1. Unreal engine 설치
https://docs.unrealengine.com/en-US/Platforms/Linux/BeginnerLinuxDeveloper/SettingUpAnUnrealWorkflow/index.html
Github에 가입후, 직접 소스코드를 컴파일하면 됨.
컴파일후 UE4 editor 처음 실행할때 또 설치가 있어서 오래걸림.
2. Marketplace를 사용하기 위한 epic games launch 설치
공식버전은 없으며, 오픈소스 비공식 버전만 가능.
https://github.com/nmrugg/UE4Launcher.git
https://docs.unrealengine.com/en-US/Platforms/Linux/BeginnerLinuxDeveloper/SettingUpAnUnrealWorkflow/index.html
Github에 가입후, 직접 소스코드를 컴파일하면 됨.
컴파일후 UE4 editor 처음 실행할때 또 설치가 있어서 오래걸림.
2. Marketplace를 사용하기 위한 epic games launch 설치
공식버전은 없으며, 오픈소스 비공식 버전만 가능.
https://github.com/nmrugg/UE4Launcher.git
Wednesday, April 8, 2020
G2O Build
설치전 suitesparse를 먼저 설치한다음,
g2o를 빌드하고, 그다음으로
openvslam을 설치한다.
```
sudo apt-get install libsuitesparse-dev
````
g2o를 빌드하고, 그다음으로
openvslam을 설치한다.
```
sudo apt-get install libsuitesparse-dev
````
Monday, February 17, 2020
Sunday, August 18, 2019
git : commit 나누기
$ git checkout -b dev
~~ 작업 ~~
$ git commit -m "어떤 많은 분량의 작업"
>> SHA-1 84f5148
PR을 받기에 너무 길다는 가정하에 다음과 같이 commit 을 나눈다.
$ git checkout master
$ git checkout -b pr1
$ git cherry-pick 84f5148
너무 많은 변화가 있으니, 이전 commit으로 돌아간다.
$ git reset HEAD~1
~~ 변화의 일부만 남기는 작업~~
branch pr1 을 PR하는동안 다음 branch 를 더 준비한다.
------
$ git checkout -b PR2
$ git cherry-pick 84f5148
$ git mergetool
------
* mergetool에서 적당히 잘 작업했으면 git reset 명령은 필요 없다.
* 위 작업(branch 생성, cherry-pick, merge resolve)을 반복하면 하나의 commit을 여러개의 branch의 commit으로 잘게 나눌 수 있다.
Tuesday, July 23, 2019
latex install
$ sudo apt-get install texlive-latex-base
$ tlmgr init-usertree
$ sudo apt-get install xzdec
$ tlmgr option repository ftp://tug.org/historic/systems/texlive/2015/tlnet-final
$ tlmgr update --self
$ tlmgr install IEEEtran
$ tlmgr init-usertree
$ sudo apt-get install xzdec
$ tlmgr option repository ftp://tug.org/historic/systems/texlive/2015/tlnet-final
$ tlmgr update --self
$ tlmgr install IEEEtran
Thursday, March 7, 2019
Del G5 관리 후기
freedos로 제공된 ubuntu 16.04를 삭제하고 다시 설치했는데, 생긴 문제 정리.
서비스 메뉴얼 링크>
https://www.dell.com/support/manuals/kr/ko/krdhs1/g-series-15-5587-laptop/g5-5587-servicemanual/before-working-inside-your-computer?guid=guid-5d3b1051-9384-409a-8d5b-9b53bd496de8&lang=en-us
freezing>
어떻게 해결한건지 정확히 모르겠다.
1) 우선 grub window에서 'E' 키를 누르고, network enable 설정, recovery mode로 부팅한 다음 apt-get install nvidia-384 를 실행한 덕분인지
(sudo service lightdm stop 는 실행안하고도 설치후 재부팅 하니까 잘 적용됬다.)
2) 아니면 다음 링크대로 수정한거 때문인지.
https://askubuntu.com/questions/875173/nmi-watchdog-bug-soft-lockup-cpu2-stuck-for-23s-plymouthd305
TODO : 다음 포맷때에는 1) 안 먼저해서 문제 해결되는지 확인하기.
키캡 관리문제>
https://www.youtube.com/watch?v=kh88cn_rtLo
https://www.computerhope.com/issues/ch001244.htm
아래방향 화살표 키캡을 분해했는데, 적어도 이건, 키캡 상단이 걸쇠(위쪽이 열려있고, 아래쪽이 막힌 ㄴ자 ) 에 걸려있고, 아래쪽이 snap-fit? 방식으로 걸려있음.
따라서 키캡 아래쪽을 먼저 scissor-switch 와 분해해야 걸쇠에 걸린 흰지가 안 부러짐.
서비스 메뉴얼 링크>
https://www.dell.com/support/manuals/kr/ko/krdhs1/g-series-15-5587-laptop/g5-5587-servicemanual/before-working-inside-your-computer?guid=guid-5d3b1051-9384-409a-8d5b-9b53bd496de8&lang=en-us
freezing>
어떻게 해결한건지 정확히 모르겠다.
1) 우선 grub window에서 'E' 키를 누르고, network enable 설정, recovery mode로 부팅한 다음 apt-get install nvidia-384 를 실행한 덕분인지
(sudo service lightdm stop 는 실행안하고도 설치후 재부팅 하니까 잘 적용됬다.)
2) 아니면 다음 링크대로 수정한거 때문인지.
https://askubuntu.com/questions/875173/nmi-watchdog-bug-soft-lockup-cpu2-stuck-for-23s-plymouthd305
TODO : 다음 포맷때에는 1) 안 먼저해서 문제 해결되는지 확인하기.
키캡 관리문제>
https://www.youtube.com/watch?v=kh88cn_rtLo
https://www.computerhope.com/issues/ch001244.htm
아래방향 화살표 키캡을 분해했는데, 적어도 이건, 키캡 상단이 걸쇠(위쪽이 열려있고, 아래쪽이 막힌 ㄴ자 ) 에 걸려있고, 아래쪽이 snap-fit? 방식으로 걸려있음.
따라서 키캡 아래쪽을 먼저 scissor-switch 와 분해해야 걸쇠에 걸린 흰지가 안 부러짐.
Thursday, February 28, 2019
find_package가 지원되는 CMake module 만들기
Reference : https://cmake.org/cmake/help/v3.4/module/CMakePackageConfigHelpers.html#example-generating-package-files
여기서 예시된 cmake 프로젝트의 이름은 Foo 이다.
configure_file을 직접 쓸수도 있으나, 그보다는
include(CMakePackageConfigHelpers) 호출후 사용할 수 있는 명령어
configure_package_config_file 를 권장한다.
아래는 CMakeLists.txt의 예시로, 취소선은 version 선언을 생략한 것이다.
# foo/CMakeLists.txt
이상의 cmake lists의 명령어가 cmake_modules/FooConfig.cmake.in 파일을 참고하여, FooConfig.cmake를 binary directory (예를 들면 build) 에 생성한다.
추가적으로 필요한 FooConfig.cmake.in 는 다음과 같다.
# foo/cmake_modules/FooConfig.cmake.in
Bar project에서 foo package를 찾아보자.
# bar/CMakeLists.txt
TODO
export(PACKAGE ) 의 역할.
https://stackoverflow.com/questions/48661265/what-does-export-package-mean
P.S
cmake 를 실행하고 나면, build directory에 CMakeCache.txt가 생성된다. 다음은 find_package(OpenCV)의 결과, CMakeCache.txt에 추가된 message이다.
//The directory containing a CMake configuration file for OpenCV. OpenCV_DIR:PATH=/~~~~~/OpenCV-3.3.1-dev
이를통해 find_package는 /~~~~ 에 설치된 opencv의 configuration file, "OpenCVConfig.cmake" 를 선택했음을 알 수 있다. 해당 config.cmake
파일을 보면, find_package를 실행함으로써 주어진 정보들에 대해 알 수 있다.

여기서 예시된 cmake 프로젝트의 이름은 Foo 이다.
configure_file을 직접 쓸수도 있으나, 그보다는
include(CMakePackageConfigHelpers) 호출후 사용할 수 있는 명령어
configure_package_config_file 를 권장한다.
아래는 CMakeLists.txt의 예시로, 취소선은 version 선언을 생략한 것이다.
# foo/CMakeLists.txt
project(Foo) set(INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include/) # find_package 로 알려줄 header file path set(LIB_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) # library 가 생성될 path ... add_library(foo src/foo.cpp) target_link_libraries(foo some_lib_a some_lib_b some_lib_c) ... include(CMakePackageConfigHelpers) # 명령어 추가. configure_package_config_file(cmake_modules/FooConfig.cmake.in # <Input> ${PROJECT_NAME}Config.cmake # <Output> INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR} # <Desntination> of output. Both Absolute,relative PATH_VARS INCLUDE_DIR LIB_DIR) # <PATH_VARS> are the variables which contain install destinationswrite_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake VERSION 1.2.3 COMPATIBILITY SameMajorVersion )install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake# Version information 생략 DESTINATION lib/${PROJECT_NAME}/cmake ) # /usr/local/lib/Foo/cmake/에 FooConfig.cmake 설치 # foo library 에 dependent한 module이 some_lib_[a/b/c] 를 자동으로 링크할 수 있도록 export. export(TARGETS foo some_lib_a some_lib_b some_lib_c FILE "${CMAKE_BINARY_DIR}/fooTargets.cmake" )export(PACKAGE ${PROJECT_NAME} )
이상의 cmake lists의 명령어가 cmake_modules/FooConfig.cmake.in 파일을 참고하여, FooConfig.cmake를 binary directory (예를 들면 build) 에 생성한다.
추가적으로 필요한 FooConfig.cmake.in 는 다음과 같다.
# foo/cmake_modules/FooConfig.cmake.in
set(FOO_VERSION x.y.z)@PACKAGE_INIT@ # configure_package_config_file 함수가 호출하는 .cmake.in 에서는 set 대신 set_and_check를 권장. set_and_check(FOO_INCLUDE_DIR "@PACKAGE_INCLUDE_DIR@" set_and_check(FOO_LIB_DIR "@PACKAGE_LIB_DIR@") set_and_check(FOO_SRC_DIR "@PROJECT_SOURCE_DIR@") # ${} 대신 @ 연산자로 foo module의 변수를 넘겨줌. include("@CMAKE_BINARY_DIR@/fooTargets.cmake") # CMakeLists.txt에서 export한 target들을 포함.check_required_components(Foo)# component를 선언했을때만 필요
Bar project에서 foo package를 찾아보자.
# bar/CMakeLists.txt
... find_package(Foo REQUIRED) include_directories(${FOO_INCLUDE_DIR}) # FooConfig.cmake.in 에서 선언한 경로를 확인할 수 있음 add_executable(bar src/main.cpp) target_link_libraries(bar foo) # libfoo.so 를 링크 ...
TODO
export(PACKAGE ) 의 역할.
https://stackoverflow.com/questions/48661265/what-does-export-package-mean
P.S
cmake 를 실행하고 나면, build directory에 CMakeCache.txt가 생성된다. 다음은 find_package(OpenCV)의 결과, CMakeCache.txt에 추가된 message이다.
//The directory containing a CMake configuration file for OpenCV. OpenCV_DIR:PATH=/~~~~~/OpenCV-3.3.1-dev
이를통해 find_package는 /~~~~ 에 설치된 opencv의 configuration file, "OpenCVConfig.cmake" 를 선택했음을 알 수 있다. 해당 config.cmake

Friday, February 15, 2019
git merge tool
$ sudo apt-get install meld
$ git config -global merge.tool meld
$ git merge [Other branch to merge]
$ git mergetool
$ git config -global merge.tool meld
$ git merge [Other branch to merge]
$ git mergetool
Sunday, November 25, 2018
c++ / vtk trackball camera style
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/TrackballCamera
vtk 만으로 style을 수정하려면 위 링크처럼 하면된다.
단, Qt를 사용할경우, QVTKWidget은 기본 스타일이 트랙볼카메라 이므로 속편하게 그냥 쓰면 된다.
$ sudo apt-get install libvtk6-qt-dev # QVTKWidget이 제공되는 vtk 설치
vtk 만으로 style을 수정하려면 위 링크처럼 하면된다.
단, Qt를 사용할경우, QVTKWidget은 기본 스타일이 트랙볼카메라 이므로 속편하게 그냥 쓰면 된다.
$ sudo apt-get install libvtk6-qt-dev # QVTKWidget이 제공되는 vtk 설치
CMakeLists.txt --------------------------------------------------------
find_package(VTK 6 REQUIRED)
include(${VTK_USE_FILE}) # Not include_directories
find_package(Qt5Widgets REQUIRED)
include_directories( ${Qt5Widgets_INCLUDE_DIRS})
QT5_WRAP_CPP(moc_src viewer.h)
add_executable(${PROJECT_NAME}
main.cpp
${moc_src}
)
target_link_libraries(${PROJECT_NAME}
${VTK_LIBRARIES}
${QT_LIBRARIES}
)
main.cpp ------------------------------------------------
#include <stdio.h>
#include <QVTKWidget.h>
#include <QWidget>
#include <QApplication>
#include <QVBoxLayout>
#include <vtkSphereSource.h>
#include <vtkActor.h>
#include <vtkSphere.h>
#include <vtkSphereSource.h>
#include <vtkCone.h>
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <QKeyEvent>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCamera.h>
class MyWidget : public QWidget {
public:
MyWidget()
:qvtk_widget_(new QVTKWidget(this))
{
QVBoxLayout* layout = new QVBoxLayout;
setLayout(layout);
layout->addWidget(qvtk_widget_);
qvtk_widget_->setFixedSize(640,480);
renderer_ = vtkSmartPointer<vtkRenderer>::New();
renderer_->SetBackground(1.0, 1.0, 1.0);
render_window_ = vtkSmartPointer<vtkRenderWindow>::New();
render_window_->AddRenderer(renderer_);
qvtk_widget_->SetRenderWindow(render_window_);
qvtk_widget_->installEventFilter((QWidget*)this);
tarckball_style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
auto qvtk_interactor = vtkSmartPointer<QVTKInteractor>::New();
// Make sure that don't auto adjust camera clipping range, because of zoom in/out.
// AutoAdjust will cause glitch because of wrong adjustment.
tarckball_style->SetAutoAdjustCameraClippingRange(false);
qvtk_interactor->SetInteractorStyle(tarckball_style);
qvtk_interactor->SetRenderWindow(render_window_);
Initialize();
}
vtkSmartPointer<vtkInteractorStyleTrackballCamera> tarckball_style;
void Initialize(){
auto sphereSource = vtkSmartPointer<vtkSphereSource>::New();
sphereSource->SetCenter(1.0, 0.0, 0.0);
sphereSource->Update();
auto sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
auto sphereActor = vtkSmartPointer<vtkActor>::New();
sphereActor->SetMapper(sphereMapper);
auto coneSource = vtkSmartPointer<vtkConeSource>::New();
auto coneMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
coneMapper->SetInputConnection(coneSource->GetOutputPort());
vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();
coneActor->SetMapper(coneMapper);
renderer_->AddActor(sphereActor);
renderer_->AddActor(coneActor);
ResetCamera();
return;
}
void ResetCamera(){
renderer_->ResetCamera();
// Don't forget reset clipiing range after Reset camera.
vtkCamera* camera = renderer_->GetActiveCamera();
camera->SetClippingRange(0.001, 1e+8);
render_window_->Render();
return;
}
bool eventFilter(QObject *obj, QEvent *ev){
if (ev->type() == QEvent::KeyPress ) {
QKeyEvent* keyevent = dynamic_cast<QKeyEvent*>(ev);
if(keyevent->key() == Qt::Key_Q){
close();
// eventFilter intercepts the event.
return true;
}
else if(keyevent->key() == Qt::Key_R){
ResetCamera();
return true;
}
else{
vtkCamera* camera = renderer_->GetActiveCamera();
std::cout << tarckball_style->GetAutoAdjustCameraClippingRange()
<< " : " << camera->GetClippingRange()[0]
<< " : " << camera->GetClippingRange()[1] << std::endl;
}
}
// eventFilter doesn't intercept the event.
return false;
}
private:
QVTKWidget*const qvtk_widget_;
vtkSmartPointer<vtkRenderer> renderer_;
vtkSmartPointer<vtkRenderWindow> render_window_;
};
int main(int argc, char**argv){
QApplication app(argc, argv);
MyWidget mywidget;
mywidget.show();
app.exec();
return 1;
}
------------------------------------------------------------
#include <stdio.h>
#include <QVTKWidget.h>
#include <QWidget>
#include <QApplication>
#include <QVBoxLayout>
#include <vtkSphereSource.h>
#include <vtkActor.h>
#include <vtkSphere.h>
#include <vtkSphereSource.h>
#include <vtkCone.h>
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <QKeyEvent>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCamera.h>
class MyWidget : public QWidget {
public:
MyWidget()
:qvtk_widget_(new QVTKWidget(this))
{
QVBoxLayout* layout = new QVBoxLayout;
setLayout(layout);
layout->addWidget(qvtk_widget_);
qvtk_widget_->setFixedSize(640,480);
renderer_ = vtkSmartPointer<vtkRenderer>::New();
renderer_->SetBackground(1.0, 1.0, 1.0);
render_window_ = vtkSmartPointer<vtkRenderWindow>::New();
render_window_->AddRenderer(renderer_);
qvtk_widget_->SetRenderWindow(render_window_);
qvtk_widget_->installEventFilter((QWidget*)this);
tarckball_style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
auto qvtk_interactor = vtkSmartPointer<QVTKInteractor>::New();
// Make sure that don't auto adjust camera clipping range, because of zoom in/out.
// AutoAdjust will cause glitch because of wrong adjustment.
tarckball_style->SetAutoAdjustCameraClippingRange(false);
qvtk_interactor->SetInteractorStyle(tarckball_style);
qvtk_interactor->SetRenderWindow(render_window_);
Initialize();
}
vtkSmartPointer<vtkInteractorStyleTrackballCamera> tarckball_style;
void Initialize(){
auto sphereSource = vtkSmartPointer<vtkSphereSource>::New();
sphereSource->SetCenter(1.0, 0.0, 0.0);
sphereSource->Update();
auto sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
auto sphereActor = vtkSmartPointer<vtkActor>::New();
sphereActor->SetMapper(sphereMapper);
auto coneSource = vtkSmartPointer<vtkConeSource>::New();
auto coneMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
coneMapper->SetInputConnection(coneSource->GetOutputPort());
vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();
coneActor->SetMapper(coneMapper);
renderer_->AddActor(sphereActor);
renderer_->AddActor(coneActor);
ResetCamera();
return;
}
void ResetCamera(){
renderer_->ResetCamera();
// Don't forget reset clipiing range after Reset camera.
vtkCamera* camera = renderer_->GetActiveCamera();
camera->SetClippingRange(0.001, 1e+8);
render_window_->Render();
return;
}
bool eventFilter(QObject *obj, QEvent *ev){
if (ev->type() == QEvent::KeyPress ) {
QKeyEvent* keyevent = dynamic_cast<QKeyEvent*>(ev);
if(keyevent->key() == Qt::Key_Q){
close();
// eventFilter intercepts the event.
return true;
}
else if(keyevent->key() == Qt::Key_R){
ResetCamera();
return true;
}
else{
vtkCamera* camera = renderer_->GetActiveCamera();
std::cout << tarckball_style->GetAutoAdjustCameraClippingRange()
<< " : " << camera->GetClippingRange()[0]
<< " : " << camera->GetClippingRange()[1] << std::endl;
}
}
// eventFilter doesn't intercept the event.
return false;
}
private:
QVTKWidget*const qvtk_widget_;
vtkSmartPointer<vtkRenderer> renderer_;
vtkSmartPointer<vtkRenderWindow> render_window_;
};
int main(int argc, char**argv){
QApplication app(argc, argv);
MyWidget mywidget;
mywidget.show();
app.exec();
return 1;
}
------------------------------------------------------------
Friday, November 2, 2018
Logging
1) glog를 이용한 logging 예시
-------------------------------------------------------------------------------------------
int f3(){
print_stacktrace();
printf("hello f3\n");
LOG(INFO) << "Hello" << std::endl;
std::vector<int> vec = {1, 2, 3, 4};
int j = vec.at(20);
return j;
}
void f2(){
f3();
return;
}
void f1(){
f2();
return;
}
void WriteToStderr(const char* data, int size) {
//LOG(ERROR) << __pretty_function__ << ":Error..." << std::string(data,size);
LOG(ERROR) << __func__ << ":Error..." << std::string(data,size);
}
int main(int argc, char** argv){
std::string log_destination = "/home/geonuk/atlas/ws/test/output/log";
google::InstallFailureSignalHandler();
google::InstallFailureWriter(WriteToStderr);
google::InitGoogleLogging(argv[0]);
google::SetLogDestination(google::GLOG_INFO, log_destination.c_str() );
f3();
return 0;
}
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
int f3(){
print_stacktrace();
printf("hello f3\n");
LOG(INFO) << "Hello" << std::endl;
std::vector<int> vec = {1, 2, 3, 4};
int j = vec.at(20);
return j;
}
void f2(){
f3();
return;
}
void f1(){
f2();
return;
}
void WriteToStderr(const char* data, int size) {
//LOG(ERROR) << __pretty_function__ << ":Error..." << std::string(data,size);
LOG(ERROR) << __func__ << ":Error..." << std::string(data,size);
}
int main(int argc, char** argv){
std::string log_destination = "/home/geonuk/atlas/ws/test/output/log";
google::InstallFailureSignalHandler();
google::InstallFailureWriter(WriteToStderr);
google::InitGoogleLogging(argv[0]);
google::SetLogDestination(google::GLOG_INFO, log_destination.c_str() );
f3();
return 0;
}
-------------------------------------------------------------------------------------------
2) subtrace를 얻는법 예시
void print_trace(void) {
void *array[10];
char **strings;
size_t size = backtrace(array, 10);
backtrace_symbols_fd(array, size, STDERR_FILENO);
void print_trace(void) {
void *array[10];
char **strings;
size_t size = backtrace(array, 10);
backtrace_symbols_fd(array, size, STDERR_FILENO);
}
-------------------------------------------------------------------------------------------
Thursday, November 1, 2018
Monday, October 22, 2018
vrep study, memo
1) 우선 model browser에서 Bill on path.ttm 불러와, scene에 추가. bill on path의 script를 참고해서, camera motion을 구현하려고함.
2) bill on path 를 모방해서 path를 추종하는 camera를 만든다.
vision_sensor가 보는 화면을 확인하기 위해서, floating view를 추가한다.
scene viewer에서 마우스 우클릭 - Add - Floating view
새로 추가된 Floating view (empty) 우클릭 - View - view selector - Vision_sensor 선택
default parameter는 resolution이 매우 안좋다. 속성을 바꾸기 위해서 Scene hierarchy의vision_sensor의 아이콘 클릭.
Resolution X/Y를 최소 640/480 픽셀 이상으로, 적절하게 지정.
Near/far clipping도 최소값/최대값으로 지정해서 자연스러운 카메라 화면이 나오게 한다.
이번에는 bill on path의 script를 참고해서 path 를 추종하도록 함.
path의 편집은 path edit mode에서 add point를 통해 수행.
http://www.coppeliarobotics.com/helpFiles/en/pathEditMode.htm
Scene hierarchy - root Dummy (Cam) 우클릭 - Add - associated child script - non threaded
미리 만든 환경에 bill on path.ttm model 추가.
이름(Bill#0) 옆의 script (문서모양 아이콘)을 클릭하면 예시로 참고할 Non-threaded child script가 표시된다.
그림과 같이 root Dummy를 Cam이라 명명하고, 그 밑에 path, dummy 추가. dumyy의 자식에 vision_sensor를 더 추가.
vision_sensor가 보는 화면을 확인하기 위해서, floating view를 추가한다.
scene viewer에서 마우스 우클릭 - Add - Floating view
새로 추가된 Floating view (empty) 우클릭 - View - view selector - Vision_sensor 선택
default parameter는 resolution이 매우 안좋다. 속성을 바꾸기 위해서 Scene hierarchy의vision_sensor의 아이콘 클릭.
Resolution X/Y를 최소 640/480 픽셀 이상으로, 적절하게 지정.
Near/far clipping도 최소값/최대값으로 지정해서 자연스러운 카메라 화면이 나오게 한다.
이번에는 bill on path의 script를 참고해서 path 를 추종하도록 함.
path의 편집은 path edit mode에서 add point를 통해 수행.
http://www.coppeliarobotics.com/helpFiles/en/pathEditMode.htm
Scene hierarchy - root Dummy (Cam) 우클릭 - Add - associated child script - non threaded
Wednesday, October 17, 2018
언리얼
1.우분투
github 계정 / epicgames 계정 필요 (가입)
epicgames 계정에 github 계정 연결 필요. 자세한 내용은 아래링크 참고
https://www.unrealengine.com/en-US/ue4-on-github
https://wiki.unrealengine.com/Building_On_Linux
퀵스타트 와 엔진내 튜토리얼(학사모 모양 아이콘) 을 조회하면 대략적인 사용법을 익힐 수 있다.
특히 actor와 blue print 개념이 중요해 보임.
2. 윈도우
마켓플레이스의 asset donwload는 기본적으로 윈도우에서만 된다.
https://www.reddit.com/r/unrealengine/comments/5lqub5/unreal_asset_installation_linux/
대부분의 asset을 마켓플레이스에서 구해야하므로, 리눅스에서 개발여부와는 상관없이 윈도우 버전도 설치해두는게 편리.
http://api.unrealengine.com/KOR/GettingStarted/Installation/
윈도우에서 설치는 install guide에 따라 unreal launcher 설치 -> launcher 내에서 engine 설치.
* 필요한 mesh가 없으면 freeCAD나, blender를 이용해서 구현. 유튜브의 튜토리얼 참고.
github 계정 / epicgames 계정 필요 (가입)
epicgames 계정에 github 계정 연결 필요. 자세한 내용은 아래링크 참고
https://www.unrealengine.com/en-US/ue4-on-github
https://wiki.unrealengine.com/Building_On_Linux
$ git clone https://github.com/EpicGames/UnrealEngine.git
$ cd UnrealEngine
$ ./Setup.sh
$ ./GenerateProjectFiles.sh
퀵스타트 와 엔진내 튜토리얼(학사모 모양 아이콘) 을 조회하면 대략적인 사용법을 익힐 수 있다.
특히 actor와 blue print 개념이 중요해 보임.
2. 윈도우
마켓플레이스의 asset donwload는 기본적으로 윈도우에서만 된다.
https://www.reddit.com/r/unrealengine/comments/5lqub5/unreal_asset_installation_linux/
대부분의 asset을 마켓플레이스에서 구해야하므로, 리눅스에서 개발여부와는 상관없이 윈도우 버전도 설치해두는게 편리.
http://api.unrealengine.com/KOR/GettingStarted/Installation/
윈도우에서 설치는 install guide에 따라 unreal launcher 설치 -> launcher 내에서 engine 설치.
* 필요한 mesh가 없으면 freeCAD나, blender를 이용해서 구현. 유튜브의 튜토리얼 참고.
Tuesday, September 18, 2018
matplotlib
https://stackoverflow.com/questions/4098131/how-to-update-a-plot-in-matplotlib
https://matplotlib.org/examples/pylab_examples/axis_equal_demo.html
Pick scatter
https://matplotlib.org/examples/event_handling/pick_event_demo.html
Wednesday, September 12, 2018
vim 변수 설정, 디버깅
https://www.reddit.com/r/vim/comments/4ozqm9/why_is_vim_doing_4_spaces_for_tabs_even_though_i/
set tabstop
* tabstop의 현재 값 확인
verbose set tabstop?
* tabstop이 가장마지막에 어느 파일에 의해 변경됬는지 확인.
set tabstop=2
* tabstopㅇ
set tabstop
* tabstop의 현재 값 확인
verbose set tabstop?
* tabstop이 가장마지막에 어느 파일에 의해 변경됬는지 확인.
set tabstop=2
* tabstopㅇ
Tuesday, August 21, 2018
gdb 멀티쓰레드 디버깅
중단점이 걸렸다는 가정하에,
모든 thread 나열
gdb> info thread
해당 thread로 이동
gdb> thread [thread_number]
이하는 아직 이해 안됨. 정리중.
모든 thread 나열
gdb> info thread
해당 thread로 이동
gdb> thread [thread_number]
이하는 아직 이해 안됨. 정리중.
- break linespec thread threadno
- set scheduler-locking mode
- mode 가 on 일 경우 현재 현재 쓰레드에 대해서만 추적.
- https://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_39.html
Tuesday, August 7, 2018
std::remove_if
#include <iostream>
#include <vector>
#include <algorithm>
int main(int argcv, char** argv)
{
std::vector<int> test = {-1, 2, -3,-1,-5, 5,-5, -7, -3, -3 , 6, -1, 9 ,};
#if 1
// success case
auto f = [](int i) { return i < 0; };
auto new_end =std::remove_if(test.begin(), test.end(), f);
test.erase(new_end, test.end());
#else
// failure case
if(i < 0)
test.erase(it);
}
#endif
for(auto it = test.begin(); it != test.end(); it++){
int i = *it;
printf("%d,", i);
}
printf("\n");
return 0;
}
#include <vector>
#include <algorithm>
int main(int argcv, char** argv)
{
std::vector<int> test = {-1, 2, -3,-1,-5, 5,-5, -7, -3, -3 , 6, -1, 9 ,};
#if 1
// success case
auto f = [](int i) { return i < 0; };
auto new_end =std::remove_if(test.begin(), test.end(), f);
test.erase(new_end, test.end());
#else
// failure case
for(auto it = test.begin(); it != test.end(); it++){
int i = *it;if(i < 0)
test.erase(it);
}
#endif
for(auto it = test.begin(); it != test.end(); it++){
int i = *it;
printf("%d,", i);
}
printf("\n");
return 0;
}
Monday, August 6, 2018
소스코드 부분 최적
https://twitter.com/MittringMartin/status/912817354827907073
Visual studio :
#pragma optimize( "", off )
..code..
#pragma optimize( "", on )
GCC 44.4 and up:
https://news.ycombinator.com/item?id=4711571
#pragma GCC push_options
#pragma GCC optimize ("O0")
memset(a, 0, 3); // .. code ..
#pragma GCC pop_options
Visual studio :
#pragma optimize( "", off )
..code..
#pragma optimize( "", on )
GCC 44.4 and up:
https://news.ycombinator.com/item?id=4711571
#pragma GCC push_options
#pragma GCC optimize ("O0")
memset(a, 0, 3); // .. code ..
#pragma GCC pop_options
Thursday, July 26, 2018
c++ template 연습 몇가지.
#include <iostream>
#include <string>
#include <memory>
template<typename T>
void swap(T& a, T& b){
T tmp = a;
a = b;
b = tmp;
}
template<typename T>
void print(T a){
std::cout <<"print1 : " << a << std::endl;
}
template<typename T>
void print(T a, T b){
std::cout <<"print2 : " << a <<", " << b << std::endl;
}
template<typename... Args>
void prints(Args... args){
print(args...);
return;
}
class C{
public:
template<typename... Args>
static std::shared_ptr<C> create(Args&&... args){
return std::shared_ptr<C>(new C(args...));
}
private:
explicit C(const int& a, int& b){
printf("construct C(%d, %d)\n", a, b);
int tmp = a;
//a = b;
b = tmp;
}
};
int main()
{
int a = 10;
int b = 20;
prints(a); // variadic templates
prints(a,b);
printf("before swap : %d, %d\n", a, b);
swap(a,b); // == swap<int>(a,b)
printf("after swap : %d, %d\n", a, b);
std::shared_ptr<C> c1 = C::create(a, b);
printf("after construct : %d, %d\n", a, b);
return 1;
}
#include <string>
#include <memory>
template<typename T>
void swap(T& a, T& b){
T tmp = a;
a = b;
b = tmp;
}
template<typename T>
void print(T a){
std::cout <<"print1 : " << a << std::endl;
}
template<typename T>
void print(T a, T b){
std::cout <<"print2 : " << a <<", " << b << std::endl;
}
template<typename... Args>
void prints(Args... args){
print(args...);
return;
}
class C{
public:
template<typename... Args>
static std::shared_ptr<C> create(Args&&... args){
return std::shared_ptr<C>(new C(args...));
}
private:
explicit C(const int& a, int& b){
printf("construct C(%d, %d)\n", a, b);
int tmp = a;
//a = b;
b = tmp;
}
};
int main()
{
int a = 10;
int b = 20;
prints(a); // variadic templates
prints(a,b);
printf("before swap : %d, %d\n", a, b);
swap(a,b); // == swap<int>(a,b)
printf("after swap : %d, %d\n", a, b);
std::shared_ptr<C> c1 = C::create(a, b);
printf("after construct : %d, %d\n", a, b);
return 1;
}
Subscribe to:
Posts (Atom)


