Turtle 라이브러리 사용해서 거북이 움직여보기

|

Turtle 라이브러리 사용해서 거북이 움직여보기


기본 예제

import turtle

t = turtle.Turtle()
t.shape("turtle")
t.shapesize(3, 3, 3)

t.speed(3)
# 'fastest': 0
# 'fast': 10
# 'normal': 6
# 'slow': 3
# 'slowest': 1

t.forward(300)
t.right(90)
t.forward(300)
t.right(90)
t.forward(300)
t.right(90)
t.forward(300)

while True:
    pass


거북이 좌표 출력하기

import turtle

t = turtle.Turtle()
t.shape("turtle")
t.shapesize(3, 3, 3)
t.speed(3)

print(t.position())

t.forward(300)
print(t.position())

t.right(90)
t.forward(300)
print(t.position())

t.right(90)
t.forward(300)
print(t.position())

t.right(90)
t.forward(300)
print(t.position())

t.setpos(300, 300)
print(t.position())

while True:
    pass

TTS(Text to Speech) 샘플

|

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context=".MainActivity">

  <EditText
    android:id="@+id/edittext"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="TTS Text를 입력하세요."/>

  <Button
    android:id="@+id/run"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="실행"/>

</LinearLayout>


MainActivity.java

import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import java.util.Locale;

public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {

  EditText editText;

  TextToSpeech tts;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    editText = findViewById(R.id.edittext);
    findViewById(R.id.run).setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        String text = editText.getText().toString();
        speakText(text);
      }
    });

    initTts();
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    tts.shutdown();
  }

  private void initTts() {
    tts = new TextToSpeech(getApplicationContext(), this);
    tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {

      @Override
      public void onStart(String utteranceId) {
        Log.i("snowdeer", "[snowdeer] onStart: " + utteranceId);
      }

      @Override
      public void onDone(String utteranceId) {
        Log.i("snowdeer", "[snowdeer] onDone: " + utteranceId);
      }

      @Override
      public void onError(String utteranceId) {
        Log.i("snowdeer", "[snowdeer] onError: " + utteranceId);
      }
    });
  }

  @Override
  public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {
      Log.i("snowdeer", "[snowdeer] TTS is ready.");
      tts.setLanguage(Locale.KOREA);
      tts.setPitch(1.0f);
      tts.setSpeechRate(1.0f);
    } else {
      Log.w("snowdeer", "[snowdeer] TTS is not ready !!");
    }
  }

  private void speakText(String text) {
    String utteranceId = "utteranceId";
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
  }
}

OpenCV 이미지 Receiver 예제 (TCP 기반)

|

OpenCV 이미지 Receiver 예제 (TCP 기반)

OpenCV 이미지를 다운로드한다기보다는 일반적인 파일을 다운로드(TCP 기반) 하는 예제입니다.

CMakeLists.txt

cmake_minimum_required(VERSION 3.12)
project(ImageTcpReceiver)

set(CMAKE_CXX_STANDARD 14)

add_executable(ImageTcpReceiver main.cpp ImageServer.cc ImageServer.h ClientHandlerThread.cc ClientHandlerThread.h)

target_link_libraries(ImageTcpReceiver pthread)


ImageServer.h

#ifndef IMAGETCPRECEIVER_IMAGESERVER_H
#define IMAGETCPRECEIVER_IMAGESERVER_H

#include "ClientHandlerThread.h"

#include <thread>
#include <vector>

using namespace std;

class ImageServer {
 public:
  ImageServer();
  ~ImageServer();

  void start();
  void stop();


 private:
  bool initAcceptSocket();
  void finAcceptSocket();

  void run();

  bool mIsRunning;
  thread mAcceptorThread;

  int mSocketId;
  vector<shared_ptr<ClientHandlerThread>> mClientList;

};

#endif //IMAGETCPRECEIVER_IMAGESERVER_H


ImageServer.cc

#include "ImageServer.h"

#include <iostream>
#include <sys/socket.h>
#include <zconf.h>
#include <arpa/inet.h>

const int PORT = 10050;

ImageServer::ImageServer() {
  mIsRunning = false;
  mSocketId = -1;
  mClientList.clear();
}

ImageServer::~ImageServer() {

}

void ImageServer::start() {
  cout << "ImageServer::start() " << endl;
  mAcceptorThread = std::thread(&ImageServer::run, this);
}

void ImageServer::stop() {
  cout << "ImageServer::stop() " << endl;
  mIsRunning = false;
  if (mAcceptorThread.joinable()) {
    mAcceptorThread.join();
  }
}

bool ImageServer::initAcceptSocket() {
  cout << "ImageServer::initAcceptSocket() " << endl;

  struct sockaddr_in loc_addr = {0};
  loc_addr.sin_family = AF_INET;
  loc_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  loc_addr.sin_port = htons(PORT);

  mSocketId = socket(AF_INET, SOCK_STREAM, 0);

  int opt = 1;
  int error;
  error = setsockopt(mSocketId, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt));
  if (error < 0) {
    perror("AcceptSocket - setsockopt(mSocketId, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT) Failed");
    return false;
  }

  error = bind(mSocketId, (struct sockaddr *) &loc_addr, sizeof(loc_addr));
  if (error < 0) {
    return false;
  }

  error = listen(mSocketId, 1);
  if (error < 0) {
    return false;
  }

  cout << "Server Socker is binding to " << PORT << ". " << endl;

  return true;
}

void ImageServer::finAcceptSocket() {
  cout << "ImageServer::finAcceptSocket() " << endl;
  if (mSocketId > 0) {
    shutdown(mSocketId, SHUT_RDWR);
    close(mSocketId);
    mSocketId = -1;
  }
}

void ImageServer::run() {

  bool ret = initAcceptSocket();
  if (ret == false) {
    cout << "Creating Accept Socket is failed." << endl;
    return;
  }

  struct sockaddr_in client_address;
  socklen_t client_len = sizeof(client_address);
  int clientSocketId;

  mIsRunning = true;
  while (mIsRunning) {
    cout << "Waiting Client..." << endl;

    //clientSocketId = accept(mSocketId, (struct sockaddr *) &rem_addr, &opt);
    clientSocketId = accept(mSocketId, (struct sockaddr *) &client_address, &client_len);

    if (mIsRunning == false) {
      break;
    }

    if (clientSocketId > 0) {
      char clntName[INET_ADDRSTRLEN];
      inet_ntop(AF_INET, &client_address.sin_addr.s_addr, clntName, sizeof(clntName));

      cout << "Client is Connected. (" << clientSocketId << ")"<<endl;

      shared_ptr
          clientHandler(new ClientHandlerThread(clientSocketId));
      clientHandler->start();
      mClientList.push_back(clientHandler);
    }

  }

  finAcceptSocket();
}
</pre>


## ClientHandlerThread.h
#ifndef IMAGETCPRECEIVER_CLIENTHANDLERTHREAD_H
#define IMAGETCPRECEIVER_CLIENTHANDLERTHREAD_H

#include <thread>

using namespace std;

class ClientHandlerThread {
 public:
  ClientHandlerThread(int socketId);
  virtual ~ClientHandlerThread();

  void start();
  void stop();

 private:
  void run();

  void savePacketAsFile(string filepath);

  thread mThread;
  bool mIsRunning;

  int mSocketId;
};

#endif //IMAGETCPRECEIVER_CLIENTHANDLERTHREAD_H

## ClientHandlerThread.cc
#include "ClientHandlerThread.h"

#include <iostream>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/time.h>
#include <zconf.h>

ClientHandlerThread::ClientHandlerThread(int socketId) {
  mSocketId = socketId;
  mIsRunning = false;
  thread_local int optval = 1;
  setsockopt(mSocketId, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
}

ClientHandlerThread::~ClientHandlerThread() {

}

void ClientHandlerThread::start() {
  cout << "ClientHandlerThread::start() " << endl;
  mThread = thread(&ClientHandlerThread::run, this);
}

void ClientHandlerThread::stop() {
  cout << "ClientHandlerThread::stop() " << endl;
  mIsRunning = false;
}

void ClientHandlerThread::run() {
  mIsRunning = true;
  while (mIsRunning) {
    struct timeval tp;
    gettimeofday(&tp, NULL);
    long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;

    char filename[256] = "";
    sprintf(filename, "image_%ld.jpg", ms);

    savePacketAsFile(filename);
  }
}

void ClientHandlerThread::savePacketAsFile(string filepath) {
  thread_local char packet[1024];

  long file_size = 0;
  read(mSocketId, &file_size, sizeof(long));

  if(file_size == 0) return;

  cout << "size: " << file_size << endl;
  
  FILE *file;
  file = fopen(filepath.c_str(), "wb+");

  int bytes_received = 0;
  int length;
  while (bytes_received < file_size) {
    //cout << "remains: " << remains << endl;
    int remains = file_size - bytes_received;

    int packetSize = sizeof(packet);
    if (remains < packetSize) {
      length = read(mSocketId, packet, remains);
    } else {
      length = read(mSocketId, packet, sizeof(packet));
    }

    bytes_received += length;
    fwrite(packet, length, 1, file);
  }

  fclose(file);
}

## Main.cc
#include "ImageServer.h"

#include <iostream>
#include <unistd.h>

int main() {
  std::cout << "Hello, World!" << std::endl;

  shared_ptr<ImageServer> server = make_shared<ImageServer>();
  server->start();

  while(true) {
    usleep(1000 * 1000);
  }

  server->stop();

  return 0;
}

OpenCV 이미지 Sender 예제 (파일로 저장 후 TCP로 전송)

|

OpenCV 이미지 Sender 예제 (파일로 저장 후 TCP로 전송)

OpenCV 이미지를 파일에 저장한 다음 파일을 전송하는 예제 코드입니다.

CMakeLists.txt

cmake_minimum_required(VERSION 3.12)
project(ImageTcpSender)

set(CMAKE_CXX_STANDARD 14)

find_package(OpenCV REQUIRED)

add_executable(ImageTcpSender main.cpp ImageSender.cc ImageSender.h)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})


ImageSender.h

#ifndef IMAGETCPSENDER_IMAGESENDER_H
#define IMAGETCPSENDER_IMAGESENDER_H

#include <string>

using namespace std;

class ImageSender {
 public:
  ImageSender();
  ~ImageSender();

  void connectToServer(string ipAddress, int port);
  void disconnectFromServer();

  void sendImageFile(string filename);

 private:
  long getFileSize(std::string filename);

  int mSocketId;
};


ImageSender.cc

#include "ImageSender.h"

#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>
#include <arpa/inet.h>
#include <zconf.h>

ImageSender::ImageSender() {
  mSocketId = -1;
}

ImageSender::~ImageSender() {
}

void ImageSender::connectToServer(string ipAddress, int port) {
  struct sockaddr_in server_addr = {0,};
  char buf[1024];

  mSocketId = socket(AF_INET, SOCK_STREAM, 0);
  if (mSocketId < 0) {
    cout << "Error: Create client socket" << endl;
    return;
  }

  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = inet_addr(ipAddress.c_str());
  server_addr.sin_port = htons(port);

  int ret = connect(mSocketId, (struct sockaddr *) &server_addr, sizeof(server_addr));
  if (ret < 0) {
    cout << "Error: Connect to Server" << endl;
    return;
  }

}

void ImageSender::disconnectFromServer() {
  // TODO
}

long ImageSender::getFileSize(std::string filename) {
  FILE *f;
  f = fopen(filename.c_str(), "r");
  fseek(f, 0, SEEK_END);
  return (long) ftell(f);
}

long min(long a, long b) {
  if (a < b) return a;
  return b;
}

void ImageSender::sendImageFile(string filename) {
  if (mSocketId < 0) {
    cout << "There is no connection !!" << endl;
    return;
  }

  long file_size = getFileSize(filename);
  write(mSocketId, &file_size, sizeof(file_size));

  FILE *file = fopen(filename.c_str(), "rb");
  char packet[1024];
  long remains = file_size;
  while (remains > 0) {
    //cout << "remains: " << remains << endl;
    int packetSize = sizeof(packet);

    if (remains < packetSize) {
      fread(packet, 1, remains, file);
      write(mSocketId, &packet, remains);
    } else {
      fread(packet, 1, packetSize, file);
      write(mSocketId, &packet, packetSize);
    }

    remains -= packetSize;
  }
  fclose(file);

}


main.cc

#include "ImageSender.h"

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv2/videoio.hpp>
#include <cv.hpp>
#include <iostream>
#include <fstream>
#include <memory>
#include <sys/time.h>
#include <cstdio>

using namespace std;

const int PORT = 10050;

string getFilenameFromTime() {
  struct timeval tp;
  gettimeofday(&tp, NULL);
  long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;

  char filename[256] = "";
  sprintf(filename, "image_%ld.jpg", ms);

  return filename;
}

int main() {
  std::cout << "Hello, World!" << std::endl;

  auto sender = make_shared<ImageSender>();
  sender->connectToServer("127.0.0.1", PORT);

  cv::VideoCapture capture(0);
  if (!capture.isOpened()) {
    cout << "Failed to open Camera..." << endl;
    return -1;
  }

  while (true) {
    cv::Mat frame;

    try {
      capture >> frame;

      cv::imshow("Camera", frame);
      string filename = getFilenameFromTime();

      imwrite(filename.c_str(), frame);
      sender->sendImageFile(filename);
      remove(filename.c_str());

      if (cv::waitKey(30) == 27) break;
    } catch (cv::Exception &e) {
      cout << "Exception: " << e.err << endl;
    }

  }

  return 0;
}

ftp 서버 설치 방법

|

ftp 서버 설치 방법

sudo apt install vsftpd


설정

/etc/vsftpd.conf 파일을 내용을 수정하면 됩니다.

예를 들어 초기 접속 디렉토리는

local_root=/home/snowdeer/ftp_home

과 같이 파일 끝에 추가해주면 됩니다.

익명 접속 허용 설정은

anonymous_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES
anon_world_readable_only=NO
anon_umask=0022

등과 같이 할 수 있으며, 파일 수정 후 sudo service vsftpd restart 해주어야 반영이 됩니다.