본문 바로가기

쓰기

?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
안녕하세요!

ros serial 직렬통신에 대해서 올려주신걸 보았습니다. <ROS(Robot Operating System) 개념과 활용 - 4. ROS node를 이용하여 direct serial 통신하기>

다름이 아니라 제가 RS232 serial 통신을 이용하여 1/4 scale car를 구동시켜야 하는데

명령어를 보내는방법에 대해서 많이 부족해서 어려움을 겪고 있습니다.

 

밑에 같은 명령어를 보내어 speed, steer, brake 값을 제가 제어하고 싶은데 올려주신 코드에서 어느부분을 수정해서 보내야 제어가 가능할까요??

 

 Packet(14byte)

 BYTE NAME 

 S

T  

X  

AorM  

E-STOP  

GEAR  

SPEED0  

SPEED1  

STEER0  

STEER1  

BRAKE  

ALIVE  

ETX0  

EXT1  

 값

 0x53

0x54  

0x58  

0x00 or 0x01  

0x00 or 0x01  

0~2 

0~200  

 -2000~2000

1~33  

0~255  

0x0D  

0X0A  


#include <ros/ros.h>
#include <serial/serial.h>
#include <std_msgs/String.h>
#include <std_msgs/Empty.h>

serial::Serial ser;

void write_callback(const std_msgs::String::ConstPtr& msg){
    ROS_INFO_STREAM("Writing to serial port" << msg->data);
    ser.write(msg->data);
}

int main (int argc, char** argv){
    ros::init(argc, argv, "serial_example_node");
    ros::NodeHandle nh;

    ros::Subscriber write_sub = nh.subscribe("write", 1000, write_callback);
    ros::Publisher read_pub = nh.advertise<std_msgs::String>("read", 1000);

    try
    {
        ser.setPort("/dev/ttyACM0");
        ser.setBaudrate(9600);
        serial::Timeout to = serial::Timeout::simpleTimeout(1000);
        ser.setTimeout(to);
        ser.open();
    }
    catch (serial::IOException& e)
    {
        ROS_ERROR_STREAM("Unable to open port ");
        return -1;
    }

    if(ser.isOpen()){
        ROS_INFO_STREAM("Serial Port initialized");
    }else{
        return -1;
    }

    ros::Rate loop_rate(5);
    while(ros::ok()){

        ros::spinOnce();
        char testStr[]="Testype";
        ser.write(testStr);

        if(ser.available()){
            ROS_INFO_STREAM("Reading from serial port");
            std_msgs::String result;
            result.data = ser.read(ser.available());
            ROS_INFO_STREAM("Read: " << result.data);
            read_pub.publish(result);
        }
        loop_rate.sleep();

    }

  • profile
    박정현 2017.03.26 11:22

    간단히 ser.write(testStr); 부분에서 testStr 대신 원하시는 패킷 배열을 보내주시면 됩니다.
    패킷 내부 데이터들이 다른 노드에서 계산되는 것들이라면 이 시리얼 노드 내에 subscriber를 만들어 그 callback 함수 내에서 데이터들을 받아 보낼 배열로 바꾸신 뒤, 이를 ser.write()를 통해 보내시면 됩니다.
    포트나 baudrate 설정도 확인하시기 바랍니다.
    만약 노드의 메시지나 데이터 전달을 그대로 사용하는게 편하시다면 시리얼 클라이언트 쪽에 rosserial을 적용해서 쓰시는 방법도 있습니다(http://enssionaut.com/xe/board_robotics/1337).


    다른 질문 있으시면 언제든 문의해주세요.

    감사합니다.


List of Articles
번호 제목 글쓴이 날짜 조회 수
» 포스트해주신 serial 통신에 대해서 궁금한점이 있습니다! 1 Lee 2017.03.20 575
2 rqt에 관하여 질문이있습니다 1 Gun 2016.03.26 547
1 안녕하십니까~ 1 Gun 2016.03.11 466
Board Pagination Prev 1 Next
/ 1