본문 바로가기
정나우/ROS

ROS URDF로 이동로봇 위에 매니퓰레이터 만들기 + imu센서 달기

by 정_나우 2022. 1. 22.

우리의 목적은 이동로봇이 앞뒤로 왔다갔다 하면서 봉이 안 넘어지게 유지하는 것이므로

 

앞 게시물에 이어서 이동로봇 위에  매니퓰레이터를 달아보겠다.

 

xacro 파일을 열어서 wheel 내용 다음에 아래 내용을 추가한다.

 

<!--......................................... Base_Link........................................................-->

    <joint name="body" type="revolute">
        <parent link="body"/>
        <child link="base_link"/>
        <origin rpy="0 0 0" xyz="0 0 0.35"/>
        <axis xyz="0 1 0"/>
        <limit effort="10" velocity="1.0" upper="0.7" lower="-0.7"/>
    </joint>
    
    <link name="base_link">
        <collision>
            <origin xyz="0 0 1.5" rpy="0 0 0"/>
            <geometry>
	            <box size="0.3 0.3 3"/>
            </geometry>
        </collision>

        <visual>
            <origin xyz="0 0 1.5" rpy="0 0 0"/>
            <geometry>
	            <box size="0.3 0.3 3"/>
            </geometry>
            <material name="orange"/>
        </visual>

        <inertial>
            <origin xyz="0 0 1.5" rpy="0 0 0"/>
            <mass value="1"/>
            <inertia
	        ixx="0.7575" ixy="0.0" ixz="0.0"
	        iyy="0.7575" iyz="0.0"
	        izz="0.015"/>
        </inertial>
    </link>

지금은 매니퓰레이터가 하나밖에 없지만 추가로 더 만들고 싶다면 다음과 같은 방식으로 계속해서 추가해 나가면 된다.

 

처음에는 fixed 타입의 링크와 continuous타입의 링크를 사용해서 흔들리는 모습을 구현했지만,

나중에는 revolute타입의 링크 하나로 구현했다.

 

그리고 링크가 똑바로 서있게 제어를 할 수 있도록 링크의 끝에 imu센서를 부착한다.

 

아래 내용을 링크내용 밑에 추가한다.

<!--............................................imu......................................................-->  

    <joint name="imu_joint" type="fixed">
        <parent link="base_link"/>
        <child link="imu_link"/>
        <origin xyz="0 0 3" rpy="0 0 0"/>
        <axis xyz="0 1 0"/>
    </joint>

    <link name="imu_link">
        <collision>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <geometry>
	            <box size="0.1 0.1 0.1"/>
            </geometry>
        </collision>

        <visual>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <geometry>
	            <box size="0.1 0.1 0.1"/>
            </geometry>
            <material name="orange"/>
        </visual>

        <inertial>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <mass value="0.1"/>
            <inertia
	        ixx="0.00016667" ixy="0.0" ixz="0.0"
	        iyy="0.00016667" iyz="0.0"
	        izz="0.00016667"/>
        </inertial>
    </link>

 

그리고 gazebo 밑에 imu 플러그 인을 추가한다. 이때 reference, bodyname 등 자신이 작성한 링크와 이름이 일치하도록 작성하는 데에 주의한다.

 

<gazebo reference="imu_link">
        <gravity>true</gravity>
        <sensor name="imu_sensor" type="imu">
            <always_on>true</always_on>
            <update_rate>30</update_rate>
            <visualize>true</visualize>
            <topic>__default_topic__</topic>
            <plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin">
                <topicName>imu</topicName>
                <bodyName>imu_link</bodyName>
                <updateRateHZ>30.0</updateRateHZ>
                <gaussianNoise>0.0</gaussianNoise>
                <xyzOffset>0 0 0</xyzOffset>
                <rpyOffset>0 0 0</rpyOffset>
                <frameName>imu_link</frameName>
                <initialOrientationAsReference>false</initialOrientationAsReference>
            </plugin>
            <pose>0 0 0 0 0 0</pose>
        </sensor>
    </gazebo>

 

이렇게 xacro 파일 작성을 마치고, launch파일과 yaml파일을 따로 건드리지 않는다.

 

이제 다음과 같은 명령어로 gazebo를 실행하면 

roslaunch mobile_robot mobile_robot_gazebo.launch

 

링크가 처음에는 서 있다가 다음과 같이 옆으로 쓰러진다. 그리고 링크를 클릭하고 화면 좌측을 보면 imu_sensor라는 글씨가 보이면 imu가 정상적으로 만들어진 것이다.

다른 확인 방법으로는 터미널 창에

rostopic list

를 입력하면 /imu라는 글씨로 확인도 가능하다.

 

마지막으로 

rostopic echo /imu

라는 명령어로 입력하면 gazebo상의 imu값을 실시간으로 확인할 수 있다.

 

 

댓글