본문 바로가기

programming

ROS 연습장 (python, C++)

-     ros 기본 setup

 Cd ~ 에서

sudo gedit ~/.bashrc

 

에서 제일 밑에

source ~/catkin_ws/devel/setup.bash 넣기

 

-     ros package 만들기

Catkin_ws/src 에서

catkin_create_pkg <페키지 이름> std_msgs rospy roscpp <depend>

 

패키지 안에 있는 xml, cmake.txt 수정하기 (dependencies 설정)

 

- ros package build

catkin_ws 에서 catkin_make 로 빌드 가능

특정 패키지 빌드 원하면 아래와 같이 적기

catkin_make --pkg <my_package_name>

 

-     ros script 작성

파이썬으로 작성할시

#!/usr/bin/python

제일 위에다가 적어야지 파이썬으로 인식함 (파이썬 경로)

파이썬 경로는

which python

으로 알아보기

 

-      ros message(topic)

첫줄에다가

Ex) from geometry_msgs.msg import PoseWithCovarianceStamped  라고 적어줘야함

 

- Ros custom message(메시지 새로운거 만들기)

1) 패키지 폴더 안에 msg 파일 생성 

2) find_package에 message_generation를 추가한다.

 

 

3)Cmakelists에서 정의한 Object.msg 를 add_message_files에 추가한다.

 

 

4)message를 추가하기 위해서는 dependencies를 설정해줘야 한다

 

 

5) 새로 빌드 하기 (catkin_make)

 

6) node 파일 첫줄 에다가 from <패키지 이름>.msg import <msg 파일 이름>

  ex) from att_est.msg import error_msg

 

       -ros subscriber,

Ex)

rospy.Subscriber("/mag_raw", MagneticField, self.mag_raw_data)

 

subscriber = rospy.Subscriber(“/토픽” , 메시지 종류 , 콜백 함수)

 

call back 함수 = 매시지를 다시 변수를 각각에 대입 하는과정

ex)

def mag_raw_data(self,

 

-     ros publisher

 

ex)

self.Kalman_cov_pub = rospy.Publisher("/pose_covariance",PoseWithCovarianceStamped, queue_size=1)

 

함수 이름 = rospy.Publisher(“/토픽 이름” , 토픽 종류 , queen_size = 개수)

(queen_size 는 메시지가 끊겼을 때 몇 개 저장하는지 갯수 지정해 주는 과정 )

 

메시지 변수 이름 = 메시지 변수 종류()

메시지 종류, 타입은 ros.wiki 에서 확인 한다. 메시지 안에 메시지가 있으면

첫번째_메시지.2nd_메시지.3rd_메시지.해당_변수 로 적으면 된다.

Ex)

pose_topic = PoseWithCovarianceStamped()

 

위 처럼 메시지에다가 다 대입후 이제 publish 하는 과정을 거쳐야 하는것이다.

다 만들어진 메시지를 처음에 퍼블리시_함수.publish(메시지_변수)로 메시지를 퍼블리시 할수 있다.

Ex)

self.Kalman_cov_pub.publish(pose_topic)

 

추후에 rviz 와 같이 visualization 을 하려면 일반 메시지가 아닌 stamped 된 메시지를 통해서 frame 등을 표시 하여야 한다.

 

-     Ros topic 확인 방법

 Rostopic echo /토픽_이름 = 토픽을 받아 볼수 있다.

 Rostopic pub /토픽_이름 메시지.변수들 = 토픽을 임의의 값으로 publish 할 수 있다.

 Rostopic hz /토픽 = 토픽이 1초에 얼마나 오는지 hz 알려고 할 때 쓰는 용어

 Rostopic rqt_graph rqt_graph = 노드들에서 토픽들이 어떻게 연결되어 있는지 알 수 있다.

 Rostopic list = publish 되는 모든 토픽들을 볼 수 있다.
rqt_plot 으로 토픽을 그래프로 볼 수 있다

 

-     Ros 여러기기 연결

1)    마스터 기기와 다른 기기들이 하나의 와이파이로 연결 되어있어야한다.

2)    마스터 기기의 ifconfig 로 ip 주소를 알아낸다 ex)192.068.0.135

3)    마스터 기기의 bashrc 에서 아래 내용을 추가한다.

 

export ROS_IP=master_의_ip_주소

export ROS_MASTER_URI=http:// master_의_ip_주소:11311

export ROS_HOSTNAME= master_의_ip_주소

 

4)    연결할 기기에서의 bashrc 에 아래 내용을 추가한다.

export ROS_MASTER_URI=http:// master_의_ip_주소:11311

export ROS_HOSTNAME= 연결하는기기_의_ip_주소

 

-     Rosbag

 

토픽들을 저장하고, 저장한 토픽들을 다시 재생 할 수 있는 명령이 rosbag 이다.

rosbag 로 저장된 파일은 <파일이름. bag>로 저장된다.

 

rosbag record -o <저장할 이름> /토픽이름_1 /토픽이름_2   => 와 같이 저장할수 있다.

 

rosbag play <bag file>  => 로 실행 할 수 있다.

 

또한 

 

 rosbag info <bag file>   => 로 정보를 볼 수 있다.

- roslaunch

 

roslaunch 는 여러 노드들과 roscore 까지를 한번에 실행하는것이다.

launch 파일을 만들기 위한 형식의 예시는 아래와 같다.

 

<launch>
<rosparam command="load" file="$(find termproject-coop)/config/sensor_config.yaml" />
 
<node pkg="termproject-coop" name="imu_raw_publisher" type="imu_raw_publisher.py" output="screen" />
<node pkg="termproject-coop" name="compliementary_filter" type="complementary_filter.py" output="screen" />
 
</launch>

yaml 은  parameter에 해당되는 값들의 모음이다.

/ =  실행 버튼이다

name =  실행되는 패키지의 이름(우리가 지정하는것)

type = 실제 node 의 파일 명

output =  값이 어디에 출력될껀지 정하는 것이다.

 

- Yaml 파일 작성법

yaml 은 파라미터들의 모음이다. 이것을 사용하면 하나의 파일에 파라미터들을 저장하여 값을 바꿔야 할때 유용하게 쓸 수 있다. 

 

-yaml 파일의 작성의 예시이다.

아래와 같이 작성하고, config 파일 안에 xxx.yaml 로 저장하면된다.

!! 단 탭이 아니라 띄어쓰기로만 작성해야함(탭으로 띄어쓰기 하면 에러발생)

imu:
raw_rate : 250 # imu : 200hz # mag : 100hz
sampling_rate : 100.0
bus_address : 0
gyro_scale : 0x00 # 0x00 : 250DPS
accel_scale : 0x00 # 0x00 : 2G

 

-yaml 파일의 파라미터를 불러오는 코드이다.

self.cf_rate = rospy.get_param("/complementary/rate")

 

yaml 파일에 있는 값을 node 에서 불러와서 사용할때 위와 같이 사용하면 값이 배정이 됩니다.

 

 

C++

python 과 다르게 새로운 cpp 파일을 만든다면 Cmakelist 에다가 새로 적어줘야 한다.

ex) 새로운 파일이 src 안에 talker.cpp 이라면 아래와 같다.

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})

만약 새로운 파일이 message generation 을 포함한다면 

ex)

add_executable(talker src/talker.cpp)
add_dependencies(talker${${PROJECT_NAME}_EXPORTED_TARGETS}
${catkin_EXPORTED_TARGETS})
target_link_libraries(talker ${catkin_LIBRARIES})

의존성까지 적어줘야 한다.

 

'programming' 카테고리의 다른 글

C ++ 연습장  (0) 2020.07.07
아두이노 센서 사용 코드 예시  (0) 2020.05.07
git hub 사용법 Manual  (0) 2020.02.16
파이썬 코딩 연습장  (0) 2020.01.10