MW-MDC24D200D-V2 ROS를 이용한 DC 모터 제어 > MotorControl_Forum

본문 바로가기
사이트 내 전체검색

MotorControl_Forum

MW-MDC24D200D-V2 ROS를 이용한 DC 모터 제어

페이지 정보

profile_image
작성자 gobbc
댓글 22건 조회 859회 작성일 24-06-23 22:37

본문

구매 MotorControl : MW-MDC24D200D-V2

사용 환경: ROS1 Noetic

개발 언어: C++ or Python3

MW-MDC24D200D-V2 모터 드라이버를 이용하여 ROS1 Noetic에서  DC 모터의 RPM을 제어하고 싶습니다.

2th_NtrexMotorDriver_lib_ROS을 다운받아 사용하려고 하는데 자세한 매뉴얼이 있을까요?

또 모터 드라이버의 232 serial port를 사용하지 않고 미니 USB 포토를 사용해도 통신이 정상적으로 가능한가요?

위 gitub에서 링크되어있는 블로그를 보면 AHRS 관련 내용만 있는데 AHRS 없이 DC 모터를 제어하는 매뉴얼이 있을까요?

첨부파일

댓글목록

profile_image

최고관리자님의 댓글

최고관리자 작성일

안녕하세요.

아이디어 로봇입니다.

모터 드라이버의 메뉴얼의 경우 아래 링크의 메뉴얼을 확인하여 주시면 됩니다.
https://github.com/ntrexlab/MW_MotorControllers_Manual

모터 드라이버 ROS의 경우 아래의 간단한 소개 글이 추가로 있습니다.
https://blog.naver.com/idea_robot/223016728314

2th_NtrexMotorDriver_lib_ROS의 경우 ROS2 예제 패키지가 들어있습니다.

해당 패키지는 ROS Noetic에서 사용은 어렵기 떄문에
대신 아래 STELLA N1의 ROS1 패키지에서 stella/stella_md 패키지만 사용하시면 ROS1의 예제로 사용하실 수 있을 것입니다.
https://github.com/ntrexlab/STELLA_N1_PI_X4_ROS1_v2.0

해당 패키지에서 lib의 라이브러리 파일은 2th_NtrexMotorDriver_lib_ROS에서 사용하시는 PC의 cpu에 맞게 변경하여 주세요.

통신의 경우 RS232, CAN, USB 모두 지원하기 때문에 USB 통신도 정상적으로 가능합니다.

profile_image

gobbc님의 댓글

gobbc 작성일

안녕하세요 답변 감사드립니다.

두번째 링크에 블로그에 게시된 내용을 보면 4)ROS 드라이버 사용 설명에서 설명 안내 이후에 자세한 설명이 없는데 내용이 누락된 것인가요??

우선 foxy에서 사용한다면 하드웨어적으로는 윈도우에서 UI를 사용할떄와 동일하게 연결해서 사용하면 되는건가요?

profile_image

최고관리자님의 댓글의 댓글

최고관리자 작성일

해당 블로그의 경우 ROS패키지 사용보단 ROS 패키지를 소개하는 글이어서 자세한 설명은 생략되었습니다.

ROS2 foxy를 기준으로
2th_NtrexMotorDriver_lib_ROS github에 있는 AHRS 블로그글과 같이
colcon_ws의 src에 stella_md 패키지를 git clone하여 주시고 colcon_ws에서 빌드하시면 ROS 패키지를 사용하실 수 있습니다.

빌드하신 후 ros2 launch stella_md stella_md_launch.py 로 launch 하여 주시면 /cmd_vel 토픽으로 모터를 제어하실 수 있습니다.

profile_image

gobbc님의 댓글

gobbc 작성일

답변 감사드립니다.

우선 윈도우에서 UI 상으로 연결하여 모터 제어를 하는 것은 완료하였는데
이를 ROS noeitc 환경에서 진행하고 싶어 위 에서 말씀해주신 STELLA N1의 ROS1 패키지의 예제로 구동시켜보았습니다.
PC의 cpu에 맞게 library 변경하고 stella_md 패키지의 stella_md_launch.py로 런치하고 /cmd_vel을 통해 모터를 제어해보려고 했는데 Cmd_vel을 통해 값을 변화시켜도
모터 제어가 되지 않고 있는데 혹시 리눅스 환경에서 사용할때 따로 확인해야할 것들이 있을까요?

예를들어 모터 드라이버를 USB로 연결하지 않고 launch를 시켰을때 포트가 아무것도 연결이 되어있지 않아도 launch는 되더라구요.
지금은 Port 연결이 문제인 것 같은데 (window UI 사용시 포트 SCAN이 필요한지) 혹시 Port 말고도 추가로 필요한 과정이 있을까요?

profile_image

최고관리자님의 댓글

최고관리자 작성일

stella_md/src/main.cpp 코드의 141번 줄을 보시면 /dev/MW가 있습니다.
/dev/MW는 모터드라이버가 연결된 port를 의미합니다.

ls -la /dev 명령어를 사용하였을 때 모터드라이버에 해당하는 ttyUSB 포트 명으로 141번 코드의 MW를 수정하여 주시거나
모터드라이버의 ttyUSB에 rules를 적용하여 MW로 맞추어 주시어 확인해 주세요.

profile_image

gobbc님의 댓글

gobbc 작성일

자세하고 친절한 답변 감사합니다!

profile_image

gobbc님의 댓글

gobbc 작성일

사용하는 DC 모터 사양에 따라 Stella.cpp의 파라미터 값들을 설정해서 사용하면 되는걸까요?

profile_image

gobbc님의 댓글

gobbc 작성일

main.cpp에서 sub한 cmd_vel을 바탕으로 goal_linear, angular velocity를 설정하고 dual_m_command 함수를 통해 모터를 제어하는 것 같은데 dual_m_command 함수가 헤더파일에 선언만 되어있고 정의된 내용을 찾을 수가 없는데 혹시 제어를 다르게 하고 있거나 cmd_vel에 따른 모터제어가 고정되어 있는건가요?

profile_image

최고관리자님의 댓글

최고관리자 작성일

안녕하세요.

수식을 적용해서 계산을 하고 모터로 바이너리 형태로 넘기는 방식입니다.

라이브러리 형식으로 되어 있어서 코드 확인은 어려우실 수 있으시나

선속도, 각속도 ( 입력 ) ----> 수식 변환 ----> 모터 전달

입니다.

profile_image

gobbc님의 댓글

gobbc 작성일

답변 감사드립니다.
그럼 사용하는 DC 모터 마다 스펙이 다를텐데 위에 말씀드린 것처럼 stella.cpp에 모터의 스펙을 파라미터로 설정하고 선속도, 각속도를 입력 하면 수식을 적용해서 모터에 전달되는 것인가요? 최대 선속도, 각속도 또한 모터의 spec에 맞춰서 출력되는 것인가요? 예를들어 모터의 최대 스펙이 선속도로  0.5m.s라고하면 모터 드라이버의 cmd_vel로 linear_x를 1m/s로 입력해도 최대 선속도인 0.5m/s만 나오는지 궁급합니다.
그럼 스펙 내에서 속도를 조절한 것이라면 모터의 종류가 달라도 cmd_vel 값이 동일하면 동일한 속도로 모터가 회전하고 있는 것인거죠?

profile_image

최고관리자님의 댓글

최고관리자 작성일

● ros2_example/stella_md/src/main.cpp

dual_m_command(dual_m_command_select::m_lav, goal_linear_velocity_, goal_angular_velocity_);

위 코드에 대한 내용은 아래 경로로 들어가시면 됩니다.

● ros2_example/stella_md/include/mw/MW_serial.hpp

int dual_m_command(int select, float Motor1, float Motor2);        //select = _position, _velocity, _current, _voltage

모바일로봇 제어에 대한 주석은 안되어 있지만 위 주석과 같이 정의가 되어 있습니다.

(선속도, 각속도 이용하여 제어하겠다는 파라메타, 선속도, 각속도) 현재는 이렇게 되어있는 것입니다.

만약에 RPM으로 제어하고 싶다고 하시면

dual_m_command(dual_m_command_select::_velocity, RPM1 , RPM2);

이렇게 변경하시면 됩니다.

선속도 및 각속도에 대한 계산은 소스코드 아래 경로 참고

● 2th_NtrexMotorDriver_lib_ROS/ros2_example/stella_md/mw/stella.cpp

        // 로봇 기구학 셋팅
        Differential_MobileRobot_SetValue.axle_length  = 0.33;            // 바퀴간 거리            (m)       
        Differential_MobileRobot_SetValue.wheel_radius  = 0.899;          // 바퀴 반지름            (m)       
        Differential_MobileRobot_SetValue.gear_ratio    = 27;              // 모터회전수 / 바퀴회전수  (감속비율)
 
이 내용을 따르고 있습니다.

그리고 또한 사용하시는 모터로 스펙을 변경하고 싶다고 하시면

● 2th_NtrexMotorDriver_lib_ROS/ros2_example/stella_md/mw/stella.cpp

위 경로를 수정하시고 switch 문을 적용하시면 될 것 같습니다.

만들어진 라이브러리 활용 방법에 대해서 블로그를 작성해야 했는데, 미흡했던 점 죄송합니다

profile_image

gobbc님의 댓글

gobbc 작성일

자세한 답변 감사드립니다! 현재는 https://github.com/ntrexlab/STELLA_N1_PI_X4_ROS1_v2.0에서 STELLA N1의 stella_md 패키지를 사용하고 있는데요.
그럼 dual_m_command() 함수는 select되는 파라미터에 따라 다르게 작동하고 있고 stella.cpp의 로봇 기구학 셋팅 부분의 바퀴간 거리, 바퀴 반지름, 모터 회전수/바퀴회전수 부분의 파라미터를 설정해주면 라이브러리 형식이기 때문에 수식은 알 수 없지만 알아서 리니어 속도와 각속도를 계산 해서 모터를 제어해주는 것인거죠?
혹시 그리고 마지막에 설명해주신 부분인 모터로 스펙을 변경하는 부분은 어떤 부분에 대한 설명인지 다시 답변해주실 수 있을까요?
제 질문 의도는 우선 기존 stella.cpp의 int stella_setting 부분이 이 어떤 한 모터의 스펙으로 설정되어있는 것 같아서 저희가 사용하는 모터의 스펙으로 이 부분을 설정해주면 될거라고 생각했는데 혹시 다른 의미 일까요?

profile_image

최고관리자님의 댓글

최고관리자 작성일

Differential drive mobile robot kinematics 기반으로 계산하여 제여를 합니다.

저희 모터드라이버는 제어기가 내장된 모델로서 사용하시는 모터 스펙이 있으실 것이며 모터 기구에 따라서 PID 튜닝은 직접 해주셔야 해서 말씀드렸습니다. 일정 전압 전류를 설정하셔서 쓰실 수 있으시니 이 점 말씀드렸고 또한 엔코더에 대한 값도 변경하셔야 할 수도 있습니다

profile_image

gobbc님의 댓글

gobbc 작성일

답변 감사드립니다!
dual_m_command() 함수에서 ROS1의 Stell_md 패키지에서는 mp,position,velocity,current,voltage,m_lav가 있는데
혹시 m_lav와 velocity의 차이점을 알 수 있을까요 m_lav는 linear, angular를 같이 사용하는 것으로 알고 있는데 둘다 velocity를 사용하는 것 같은데 라이브러리를 볼 수가 없어서 두 select 간의 차이를 알고 싶습니다.
또한 저희는 무한궤도 형식의로 로봇을 이용하려고 하는데 좌,우 회전에서 linear_velocity를 0으로 사용하려고합니다. 이때 그냥 m_lav 형식을 사용해도 될까요?

profile_image

gobbc님의 댓글

gobbc 작성일

안녕하세요! 저희가 사용하는 로봇이 무게가 꽤 나가서 dual_m_command()의 m_lav를 선택하고 제어를 하려고하면 모터가 stall torque 만큼 전류가 나오지 않는 것 같아서
current 제어를 통해서 제어를 하려고 합니다. 혹시 main.cpp내에서 첫 작동시에만 dual_m_command()를 통해 current 제어로 로봇을 구동시키고 이후에는 다시 dual_m_command()를 통해 velocity 제어나 m_lav를 선택해서 제어를 해도 소프트웨어에서 문제가 없을까요?
그리고 window 상에서 ui를 통해서 모터 드라이버에 기본 설정을 save to flash로 적용한 후에 ros에서 stella_md 패키지로 제어하면 ui에서 적용한 기본 설정들이 ros상의 stella.hpp에 있는 값들로 초기화 되는것인가요? 윈도우상에서 PID 게인을 제어한 후 그 값을 그대로 ros에서 사용하고 싶어서 질문드립니다. 아니면 window ui 에서 사용한 값들을 다시 stella.hpp에서 파라미터 수정을 통해 사용해야 될까요?

profile_image

최고관리자님의 댓글

최고관리자 작성일

안녕하세요.

current 제어를 하시기 보다는 RPM으로 제어 하시면 될 거 같습니다.

P게인을 확 올리시고 그 다음에 I 로 맞추시면 될 것 같습니다.

UI를 통해서 튜닝 했던 값을 코드에 적용하면 그거에 맞게 자동 확인하고 안되어 있다면

변경을 할 것 입니다.

그리고 사용하시는 모터 정보와 UI 설정된 거 캡쳐해서 올려주시면 검토해드리겠습니다.

profile_image

gobbc님의 댓글

gobbc 작성일

혹시 사진이 업로드가 안되는데 어떻게 해야할까요?

profile_image

최고관리자님의 댓글의 댓글

최고관리자 작성일

게시글 수정에서 파일 첨부로 업로드하여 주세요.

profile_image

gobbc님의 댓글

gobbc 작성일

현재 저희는 MY1016Z(24V - 250W) DC 모터를 사용하고 있습니다.
데이터 시트는 아래와 같은데 정격전류가 14A라고 나와있지만 실제로 10A 이상 사용하지 않을 것 같고 모터 드라이브 데이터 시트의 surge current도 30A라서 MW-MDC24D200D를 사용하고 있습니다.
윈도우 UI에서 모터 configuration을 다음과 같이 설정했습니다. 현재 저희 모터의 구조가 모터 shaft가 짧아서 새로운 shaft와 커플러로 연결한 후에 연결한 샤프트에 스프로킷(직경 5cm)과 엔코더를 장착하여 사용하고 있습니다.(첨부한 사진은 로봇에서 분리해 놓은 사진이고 원래 커플러와 엔코더 사이에 스프로킷 장착되어있습니다) 엔코더의 분해능은 1024ppr 입니다. 모터의 기어비가 9.78에 정격속도가 3000인데 저희 엔코더는 모터의 샤프트에 장착한 엔코더라서 기어비 약 10으로 나눈 속도 300rpm으로 설정했습니다. max current로 우선 모터 드라이버의 max current가 10A이기 때문에 10A로 설정해놨는데 혹시 motor configuration 과정에서 잘못된 점이 있으면 알려주시면 감사하겠습니다!
데이터 시트를 참고하여 설정하긴 했는데 임의로 설정한 값들이 잘못됐을 수 있다고 생각해서 질문드립니다. PID 게인들은 motor configuration 후에 맞추려고 합니다!
그리고 ui상에서 motor control을 통해서 모터를 제어해보고 있는데 가끔 설정한 over voltage 또는 over current값을 넘지 않아도 그런 fault가 뜨는 경우가 있는데 왜 그런건가요?

profile_image

최고관리자님의 댓글

최고관리자 작성일

사용모터

MY1016Z(24V - 250W) DC 모터
데이터 시트 참조 정격전류 14A,  Surge Current 30A

윈도우 UI에서 모터 configuration을 다음과 같이 설정에 대한 답변

RPM 조정 파라미터는 기어비에 대한 파라미터는 참고하지 않고 엔코더 펄스를 참고하여 제어하기 때문에 300 까지 내리지 않으셔도 됩니다.
제어 파라미터에서 전류 제어 항목 말고 한계를 정하는 항목이 있을 것입니다. 그 항목은 피크치을 생각하며 좀 더 높게 잡으셔도 상관은 없으며 지속 되었을 멈추게 하는 것입니다.

혹시 어떤 경고가 뜨는지 알려주실 수 있으실까요? 그 경고를 알려주시면 더 답변을 드리겠습니다

profile_image

gobbc님의 댓글

gobbc 작성일

답변 감사드립니다!
다른 파라미터 설정 파라미터 값들은 괜찮은건가요??
fault는 over current fault랑 over voltage fault가 간헐적으로 발생하는데 매뉴얼을 참고해봤을때는 ui에 표시 되는 현재 전류 및 전압값이 fault가 발생하는 조건이 아닌데도 간헐적으로 발생해서 질문드렸습니다. 그리고 surge Current는 모터 드라이버의 surge current 20A를 말씀드리려고 한건데 잘못 전달이 된것 같습니다.
저희 모터가 10A 이상으로 지속적으로 구동되는것이 아니고 사용환경에서 가끔 10A를 넘는 경우가 있는데 모터 드라이버의 surge current가 20A길래 우선 사용하고 있습니다.
아 그리고 엔코더가 오픈컬렉터 방식이라서 플로팅 현상이 일어나는 것 같은데 데이터 시트의 경우 엔코더 핀을 꽂는 쪽에는 내부 풀업 저항이 있는 것 같더라구요.
그 부분에 대해서는 외부에서 플로팅 방지를 위한 풀업저항 환경을 만들어 주지 않아도 될까요? 현 상태에서는 플로팅이 계속 일어나서 pulse 및 rpm을 정확히 측정하지 못하고 있는 것 같아 게인 조정을 할 수 가 없어 질문드립니다.

profile_image

최고관리자님의 댓글

최고관리자 작성일

엔코더 사양도 같이 보내주시면 감사드리겠습니다. 그리고 일단 전류 제한을 10A 에서 7A 까지 혹시 낮춰 보시겠습니까?

회원로그인

회원가입