1. 程式人生 > >ROS URDF(一):自定義robot model -----解決WARN:Fixed Frame [base_link] does not exist

ROS URDF(一):自定義robot model -----解決WARN:Fixed Frame [base_link] does not exist

1 建立一個package


catkin_create_pkg myurdf  joint_state_controller robot_state_publisher roscpp std_msgs tf

2 建立urdf資料夾

cd myurdf
mkdir urdf

3 建立urdf檔案

gedit myfirstrobot.urdf

輸入以下內容,並儲存:

<?xml version="1.0"?> 
	<robot name="myfirstrobot"> 
	<!-- Base Link --> 
	<link name="base_link"> 
		<visual> 
			<geometry> 
				<box size="0.1 0.1 2"/> 
			</geometry> 
		</visual> 
	</link> 
</robot>

4 建立launch檔案

cd myurdf
mkdir launch
gedit display.launch

輸入並儲存以下內容:

<launch>
        <param name="robot_description"
        textfile="$(find myurdf)/urdf/myfirstrobot.urdf"/>
        
        <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher"/>
        
	<node name="rviz" pkg="rviz" type="rviz" respawn="false" output="screen"/>
</launch>

5 啟動launch檔案

roslaunch myurdf display.launch

得到下圖結果:
在這裡插入圖片描述

6 增加一個連桿

更新後的urdf檔案如下:

<?xml version="1.0"?>
<robot name="myfirstrobot">
    <!-- Base Link -->
    <link name="base_link">
        <visual>
                <geometry>
                                <box size="0.1 0.1 2"/>
                </geometry>
        </visual>
    </link>

        <joint name="joint1" type="continuous">
                <parent link="base_link"/>
                <child link="middle_link"/>
                <origin rpy="0 0 0" xyz="0 0 1"/>
                <axis xyz="0 1 0"/>
        </joint>

        <link name="middle_link">
        <visual>
                <geometry>
                                <box size="0.2 0.2 1"/>
                </geometry>
        </visual>
    </link>
</robot>

得到下圖結果:
在這裡插入圖片描述

發現問題:
(1) Global Status: WARN狀態,顯示資訊為No tf data. Actual error: Fixed Frame [base_link] does not exist.

(2) 在TF顯示控制元件中,並沒優tf tree存在,由於此時機器人模型由兩個杆件組成,因此tf tree 應包含 base_link 和 middle_link.

問題原因:
urdf檔案中,joint type=“continuous”,說名該joint為旋轉型。對於旋轉型關節,必須給出robot_state_publisher 節點所需的sensor_msgs/JointState型topic :joint_states。可參見:robot_state_publisher

解決方案:
以任意方式釋出sensor_msgs/JointState型topic :joint_states。

7 以下是自定義節點發布joint_states

建立state_publisher.cpp

#include <string>
#include <ros/ros.h>
#include <sensor_msgs/JointState.h>

int main(int argc, char** argv) {
    ros::init(argc, argv, "state_publisher");
    ros::NodeHandle n;

    ros::Publisher joint_pub = n.advertise<sensor_msgs::JointState>("joint_states", 1);
    ros::Rate loop_rate(30);


    const double degree = M_PI/180;

    // robot state
    double tilt = 0, tinc = degree, swivel=0, angle=0, height=0, hinc=0.005;

    // message declarations
    sensor_msgs::JointState joint_state;

    while (ros::ok()) {
        //update joint_state
        joint_state.header.stamp = ros::Time::now();
        joint_state.name.resize(3);
        joint_state.position.resize(3);
        joint_state.name[0] ="joint1";
        joint_state.position[0] = swivel;

        joint_pub.publish(joint_state);

        // This will adjust as needed per iteration
        loop_rate.sleep();
    }
    return 0;
};

正確配置CMakelists檔案,在此不再贅述,完成後編譯。

8 配置launch檔案

<launch>
        <param name="robot_description"
        textfile="$(find myurdf)/urdf/myfirstrobot.urdf"/>
        
        <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher"/>
        <node name="state_publisher" pkg="myurdf" type="state_publisher"/>
	<node name="rviz" pkg="rviz" type="rviz" respawn="false" output="screen"/>
</launch>

8 再次啟動launch檔案

roslaunch myurdf display.launch

得到如下結果:
在這裡插入圖片描述

發現:
(1) Global Status:狀態正常
(2) tf tree 中包含 base_link 和 middle_link
(3) 顯示視窗顯示base_link和middle_link frame

還可以通過其他方式處理,如通過joint_state_publisher節點,相關處理可參考wiki。

至此,問題解決。

建模參考:https://blog.csdn.net/wxflamy/article/details/79235493