요즘 CAN 통신으로 장비를 제어할 일이 좀 생겨서 Ixxat 社의 USB-to-CAN 장비를 사용하게 되었다. 

외형은 아래와 같다. 

https://www.ixxat.com/products/products-industrial/can-interfaces/usb-can-interfaces/usb-to-can-v2-professional

이 장비는 윈도우 뿐 아니라 리눅스, RTOS등 다양한 OS를 지원하기때문에 사용하기 편리한데,

프로그램을 작성하기 위해서는 약간의 학습 곡선이 필요하다.

드라이버 및 SDK 설치

일단 장비 사용을 위한 드라이버를 설치하기 위해 아래 링크에서 윈도우 11, 10용 VCI V4 드라이버를 다운로드 한다.

https://www.ixxat.com/technical-support/resources/downloads-and-documentation?ordercode=1.01.0281.12001 

 

Downloads and Documentation for Ixxat Products

 

www.ixxat.com

설치하는 도중 SDK를 설치하기 위해 다음 항목을 추가 선택한다.

- SDK VCI4 (.NET)

장비 사용 확인

설치가 완료되면 일단 장비가 잘 동작하는지를 확인하기 위해 canAnalyser3 Mini  프로그램을 열어서 CAN 메세지를 확인한다.

자세한 사용 방법은 매뉴얼을 참조 할 것.

샘플 코드

 .NET용 샘플 코드는 아래 위치에 존재한다.

C:\Users\Public\Documents\HMS\Ixxat VCI 4.0\Samples\dotnet

 

프로그래밍 매뉴얼은 아래 위치의 pdf 문서를 참조한다.

C:\Program Files\HMS\Ixxat VCI\Manual\VCI-DotNetSoftwareDesignGuide_en.pdf 

 

이 코드는 크게 다음의 4가지 서브 프로젝트를 포함한다.

  • CanConNet
  • CanFdConNet
  • CanVbNet
  • LinConNet

CanConNet 프로젝트는 장치를 125kbps로 열고 들어오는 메세지를 콘솔에 표시하는 간단한 프로그램이다.

이 프로그램에서는 다음 namespace를 참조한다.

CanConNet 클래스는 main 함수에서 다음과 같은 순서로 CAN 소켓을 열고 메세지 수신 쓰레드를 실행하게 된다.

 

SelectDevice();

InitSocket(0)

rxThread = new Thread(new ThreadStart(ReceiveThreadFunc));
        rxThread.Start();

 

이 프로젝트를 실행하기 위해서는 빌드 설정을 Debug 대신 Release 로 변경하고 실행하면 정상적으로 실행된다.

 

비쥬얼 스튜디오 프로젝트 만들기

WPF 프로젝트를 하나 만들고

  • NuGet Package 설치

IXXAT VCI는 NuGet 패키지를 지원하므로 NuGet 패키지 관리자를 통해 필요한 라이브러리를 추가할 수 있다.

Tools > NuGet Package Manager > Package Manager Console을 열고

나타나는 터미널 콘솔에서 다음을 입력하여 Ixxat.Vci4.StringName 패키지를 설치한다.

> Install-Package Ixxat.Vci4.StrongName

프로그램에서 이 소켓 프로그램을 사용하기 위해서 위의 샘플 코드에 포함된 CanConNet.cs 파일을 일부 수정한 클래스 파일을 첨부한다. 

can_con_net.cs
0.02MB

사용 방법은 다음과 같다.

Forms1.cs 파일을 열고 using 항목에 다음을 추가한다.

Form1 클래스 선언부에 다음 전역변수를 추가한다.

Form1() 초기화 함수 부분에 can 포트의 동작 모드와 통신 속도를 선택하고 소켓을 열기 위해 다음 내용을 추가한다.

can.NewCanMessageEvent += 부분은 새로운 메세지가 들어오면 호출되는 콜백함수를 아래와 같이 등록한다.

 

소스 코드 다운로드

전체 코드는 다음 깃허브 페이지에서 다운로드 하기 바랍니다.

https://github.com/kyuhyong/usbcan_net

 

GitHub - kyuhyong/usbcan_net

Contribute to kyuhyong/usbcan_net development by creating an account on GitHub.

github.com

개발 환경은 Visual Studio 2019 Community Edition에서 만들어졌습니다.

간만에 ros python 패키지를 만들 일이 생겨서 그 과정을 정리하였다.

1. python 노드가 포함된 패키지를 만들고

2. 서비스를 만들고 호출하는 방법을 설명


1. 패키지 만들기

일단 workspace의 src 디렉토리로 이동한 다음 다음을 입력한다

<패키지이름>은 사용할 패키지 이름이고 Python으로 작성할 예정이므로 rospy 를 추가해준다.

$ catkin_create_pkg <패키지이름> std_msgs rospy

1-1. 노드 python 만들기

이제 ws/src/<패키지이름>/ 디렉토리로 이동하여 python 노드를 하나 추가하기 위해 디렉토리와 노드가 될 파일을 만든다.

일반적으로 /nodes 안에 "<패키지이름>_node.py" 로 작성한다.

반드시!!! .py 파일을 실행파일로 바꾸어준다.

$ cd <패키지이름>
$ mkdir nodes
$ cd nodes
$ touch <패키지이름>_node.py

1-2. setup.py 만들기

파이썬 패키지를 위해서 패키지 디렉토리에 setup.py 파일을 하나 만들고 다음을 추가한다.

"패키지 이름"만 수정하고 나머지는 그대로 둔다.

## ! DO NOT MANUALLY INVOKE THIS setup.py, USE CATKIN INSTEAD

from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup

# fetch values from package.xml
setup_args = generate_distutils_setup(
    packages=['패키지이름'],
    package_dir={'': 'src'}
)

setup(**setup_args)

1.3. package.xml 수정하기

패키지 디렉토리로 이동하여 package.xml 파일을 열고 필요한 부분을 수정한다.

불필요한 것들이 잔뜩 있기때문에 필요한 것만 추가하면 된다.

필요한 메세지나 패키지가 있으면 <depend> </depend> 에 넣으면 된다.

<?xml version="1.0"?>
<package format="2">
  <name>패키지이름</name>
  <version>0.0.0</version>
  <description>The 패키지 package</description>
  <maintainer email="메일@주소">관리자이름</maintainer>
  <license>TODO</license>

  <buildtool_depend>catkin</buildtool_depend>
  
  <depend>rospy</depend>
  <depend>std_msgs</depend>
  <exec_depend>message_runtime</exec_depend>
</package>

 

1.4. CmakeLists.txt 수정하기

cmakelist에는 build를 하기 위한 항목들이 있는데 역시 불필요한 것들이 잔뜩 있으므로 아래와 같이 정리한다.

중요한 부분은 다음과 같다. launch 파일이 있는 경우 해당 디렉토리를 install에 포함시킨다.

  • find_package(catkin REQUIRED COMPONENTS) : 필요한 패키지
  • catkin_package(): catkin에 필요한 패키지들 
  • catkin_install_python(PROGRAMS
      nodes/패키지이름_node.py
      DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
  • install(DIRECTORY launch
      DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
cmake_minimum_required(VERSION 3.0.2)
project(패키지이름)

## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++11)

################################################################################
# Find catkin packages and libraries for catkin and system dependencies
################################################################################
find_package(catkin REQUIRED COMPONENTS
  rospy
  std_msgs
)

## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)

catkin_python_setup()

################################################
## Declare ROS messages, services and actions ##
################################################

## Generate services in the 'srv' folder
# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

## Generate added messages and services with any dependencies listed here
# generate_messages(
#   DEPENDENCIES
#   nav_msgs#   std_msgs
# )

################################################
## Declare ROS dynamic reconfigure parameters ##
################################################
## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
#   cfg/DynReconf1.cfg
#   cfg/DynReconf2.cfg
# )

###################################
## catkin specific configuration ##
###################################
catkin_package(
  CATKIN_DEPENDS 
  rospy 
  message_runtime
  std_msgs
)

###########
## Build ##
###########

#############
## Install ##
#############
catkin_install_python(PROGRAMS
  nodes/패키지이름_node.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

install(DIRECTORY launch
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)

1.5. 노드 파일 수정하기

이제 노드 역할을 할 파이썬 코드를 작성한다.

다음은 토픽을 읽고 다른 메세지를 publish 하는 노드 템플릿이다.

import rospy
import std_msgs.msg from String, Int32

class 패키지이름Node:
    def __init__(self):
        print('Hello package')
        rospy.Subscriber("Subscribe토픽", Int32, self.메세지콜백, queue_size=10)
        self.pub_msg = rospy.Publisher("Publish토픽", String, queue_size=10)
        rospy.Timer(rospy.Duration(0.1), self.timer_callback)
        
    def timer_callback(self, event):
    	msg = String()
        msg.data = 'Hello'
    	self.pub_msg.publish(msg);
    
    def 메세지콜백(self, msg):
    	int num = int(msg.data)
    	rospy.loginfo('new message! %d', num)
    
    def main(self):
        rospy.spin()

if __name__ == '__main__':
    rospy.init_node('패키지이름_node')
    node = 패키지이름Node()
    node.main()

2. 서비스 추가하기

srv 파일을 추가하면 특정한 작업을 수행하는 서비스를 만들 수 있다.

2.1 서비스파일 만들기

먼저 패키지 안에 srv 디렉토리를 만들고 서비스 이름.srv 파일을 만든다.

$ cd to package
$ mkdir srv
$ cd srv
$ nano 서비스이름.srv

그리고나서 다음 내용을 추가한다. 

srv 파일은 전달할 데이터와 응답 데이터가 "---" 으로 구분된 파일이다.

전달하거나 응답할 데이터가 없으면 그냥 비워두면 된다.

float 설정할변이름1
bool 설정할변수이름2
---
bool 응답할변수이름

2.2 CmakeLists.txt 수정하기

기존 CmakeLists.txt에 다음 내용이 추가되어야 한다.

## Generate added messages and services with any dependencies listed here
generate_messages(
  DEPENDENCIES
  std_msgs
)

 

2.3 터미널에서 실행하기

해당 서비스를 호출하기 위해서는 노드를 띄우고 터미널에 다음과 같이 입력한다.

$ rosservice call /서비스토픽 "{'설정할변수이름1':0.0, '설정할변수이릅2':true}"

ros2 foxy에서 yolov4 object detector를 사용할 수 있는 패키지를 소개한다.

 

https://github.com/Ar-Ray-code/darknet_ros_fp16/tree/foxy-cudnn

 

GitHub - Ar-Ray-code/darknet_ros_fp16: darknet + ROS2 Humble + OpenCV4 + CUDA 11(cuDNN, Jetson Orin)

darknet + ROS2 Humble + OpenCV4 + CUDA 11(cuDNN, Jetson Orin) - GitHub - Ar-Ray-code/darknet_ros_fp16: darknet + ROS2 Humble + OpenCV4 + CUDA 11(cuDNN, Jetson Orin)

github.com

 

설치 환경은 다음과 같다.

Ubuntu 20.04 + ros2 foxy

GPU: RTX3070Ti

CUDA: 11.6

Cudnn 8.3.3

Opencv 3.4.11 with CUDA enabled

 

패키지 다운로드

ros2_yolo라는 작업공간을 하나 만들고 패키지를 다운로드 한다.

$ mkdir -p ~/ros2_yolo/src
$ cd ~/ros2_yolo/src
$ git clone --recursive https://github.com/Ar-Ray-code/darknet_ros_fp16.git -b foxy-cudnn

darknet_ros/CMakeLists.txt 파일을 열고 다음 부분을 GPU의 Architecture에 맞게 수정하고 #을 제거한다.

set(CMAKE_CUDA_ARCHITECTURES 86)

빌드하기

colcon 명령어로 빌드한다.

$ cd ~/ros2_yolo
$ colcon build --symlink-install

추가 설치

데모 launch를 실행하기 위해 다음 패키지를 설치한다.

$ sudo apt install ros-foxy-v4l2-camera

실행하기

이제 빌드된 결과를 source 하고 데모를 실행한다.

$ source install/setup.bash
$ ros2 launch darknet_ros demo-v4-tiny.launch.py

demo-v4-tiny.launch.py 는 카메라 노드를 자동으로 실행시킨다. 

만약 카메라를 별도로 실행시키려면 그냥 v4-tiny.launch.py를 실행하면 된다.

 

'ROBOTICS > ROS 2' 카테고리의 다른 글

YOLOv4 for ROS 2 foxy  (0) 2022.07.20

+ Recent posts