우리의 목적은 이동로봇이 앞뒤로 왔다갔다 하면서 봉이 안 넘어지게 유지하는 것이므로
앞 게시물에 이어서 이동로봇 위에 매니퓰레이터를 달아보겠다.
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값을 실시간으로 확인할 수 있다.
'정나우 > ROS' 카테고리의 다른 글
DQN을 활용한 Cartpole 문제 풀기 (0) | 2022.04.12 |
---|---|
[에러 해결] sudo-apt get update가 안 될 때 (1) | 2022.04.10 |
[ROS] Gazebo상에서 joint_position rosservice값으로 로봇 PID제어하기 (0) | 2022.03.05 |
[ROS] Gazebo상에서 rosservice를 이용해서 joint position값 받기 (0) | 2022.02.10 |
ROS URDF로 이동로봇 만들기 (1) | 2022.01.09 |
댓글