728x90
8/17
- Teleoperation을 통한 수동 조작 성공
- RQT Plot Plugin, rostopic echo 명령어를 통한 IMU 값 정상 수신 확인
- rostopic echo 명령어를 통한 모터 Encoder 값 정상 수신 확인
- 현재까지는 TCP 10001 Port에 연결되어있는 Motion Sensing Controller와의 통신을 통해 IMU, Motor Driver를 제어하였음
- 장애물 감지를 위해 Lidar (RPLidar A2)를 10002 Port에 연결
- Ethernet IP : 192.168.0.60
- TCP Port Number : 10002
- Baudrate : 115200
- 8, N, 1
- No Flow Control
- Lidar값을 받아오기 위한 TCP 통신 코드 작성 (기존의 drrobot_player.cpp 파일에 추가)
// drrobot_player.cpp
// Add necessary includes for sockets
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
... ...
... ...
... ...
// Add laser publisher
ros::Publisher laser_pub_;
... ...
... ...
... ...
// Add laserscan data publisher
laser_pub_ = node_.advertise<jaguar4x4_2014::LaserData>("drrobot_scan", 1);
... ...
... ...
... ...
// Create socket for laser sensor
laserSocket_ = socket(AF_INET, SOCK_STREAM, 0);
if (laserSocket_ < 0){
ROS_ERROR("Error creating socket for laser sensor");
exit(-1);
}
... ...
... ...
... ...
bzero((char*)&laserServer_, sizeof(laserServer_));
laserServer_.sin_family = AF_INET;
laserServer_.sin_port = htons(10002); // Port 10002 for laser sensor
inet_aton(robotIP_.c_str(), &laserServer_.sin_addr);
if (connect(laserSocket_, (struct sockaddr*)&laserServer_, sizeof(laserServer_)) < 0) {
ROS_ERROR("Error connecting to laser sensor");
exit(-1);
}
... ...
... ...
... ...
void doUpdate(){
... ...
... ...
... ...
char laserBuffer[512];
int laserBytes = read(laserSocket_, laserBuffer, sizeof(laserBuffer));
if (laserBytes > 0){
// Add laser sensor data processing
}
}
- Scan 값을 받아온 뒤 처리하는 코드 작성 필요
- 추후 과제
- Navistack에 활용할 Motor Encoder, IMU에 해당하는 Topic 이름 찾기
- Scan 값 처리 부분 코드 작성
- Navigation에 필요한 모든 Sensor Data 수신 후 Navistack 구성
8/18
- DrRobotMotionSensorDriver.hpp 코드 분석
- drrobot_keyboard_teleop.cpp 코드 분석
- 분석 내용 : https://github.com/YoungSeong98/Project_Jaguar4x4
- stringstream : C++에서 string을 공백과 '\n'을 기준으로 int / string / float type 등으로 다양하게 자를수 있게 함
- C++ 프로그램은 파일이나 콘솔의 입출력을 직접 다루지 않고 Stream을 통해 다룸
- Stream이란 실제의 입출력이 표현된 데이터의 이상적인 흐름을 뜻하는, OS가 입출력을 다루기 위해 가상으로 만든 중간자 역할이다
- Stream은 내부에 buffer라는 임시 메모리 공간을 가져 프로그램의 입출력을 효율적으로 관리한다
- Buffer는 입력받은 값들을 임시로 모아놓는 공간으로, 프로그래밍 시 가장 느린 작업인 입출력 작업의 속도 개선을 위해 사용
- 입력을 받을때마다 하나씩 바로바로 출력하면 속도가 느리므로 입력을 버퍼에 모았다가 아래의 2가지 경우가 되면 출력한다
- 버퍼가 다 찼을 때
- 엔터를 쳤을 때 ('\n' 이 들어올 때) -> 지금까지 우리가 봐온 방식은 전부 이 방식
- 입력을 받을때마다 하나씩 바로바로 출력하면 속도가 느리므로 입력을 버퍼에 모았다가 아래의 2가지 경우가 되면 출력한다
- stringstream은 string에서 동작하는 stream class로, 외부에서 입출력으로 받는 것이 아니라 string type을 받아 동작
- string에서 내가 원하는 type의 data를 추출할 때 사용
- #include <sstream> 선언 필요
참고 자료 :
https://roadtosuccess.tistory.com/83
https://reakwon.tistory.com/219
https://blockdmask.tistory.com/442
https://life-with-coding.tistory.com/403
https://chelseashin.tistory.com/40
https://80000coding.oopy.io/13bd7bb7-3a7f-4b51-b84a-905c47368277
'Project > Jaguar 4X4 Human Tracking' 카테고리의 다른 글
[Jaguar 4x4 Human Tracking] 7/28 (0) | 2023.07.28 |
---|---|
6/28 About NGIMU Protocol (미완) (0) | 2023.06.28 |
[Jaguar 4x4 Human Tracking] 3/22 (0) | 2023.03.22 |