二、建立机器人模型

创建工作空间

工作空间是存放工程开发的相关文件的文件夹。

src:代码空间
build:编译空间
devel:开发空间
install:安装空间

在根目录打开终端,输入mkdir robot,可以看到在根目录下生成一个名为robot的工作空间,名字任取。

输入cd robot/进入robot文件夹中,输入mkdir src创建代码空间,输入cd src/进入src并输入catkin_init_workspace初始化src,输入cd ..返回robot/目录下,输入catkin_make对工作空间进行编译,可以看到产生build编译空间和devel开发空间,输入catkin_make install生成install安装空间,存放生成的编译后的可执行文件。

创建机器人模型文件包

安装ros-melodic-joint-state-publisher-gui

sudo apt-get install ros-melodic-joint-state-publisher-gui

cd到src目录下,输入catkin_create_pkg jethexa_description urdf xacro创建模型描述包,该包依赖于urdf和xacro 。

将例程中的gzebo、launch、rviz、urdf、meshes文件夹复制进去,并在launch文件夹中新建一个名为jethexa_rviz_view.launch文件,写入如下代码并保存。

<launch>
    <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find jethexa_description)/urdf/jethexa.urdf.xacro'" />
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen" />
    <node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
    <node name="rviz_jethexa" pkg="rviz" type="rviz" output="screen" args="-d $(find jethexa_description)/rviz/jethexa.rviz" />
</launch>

cd 到robot/目录下输入catkin_make编译,输入source ./devel/setup.bash添加环境变量,输入echo $ROS_PACKAGE_PATH查看路径添加是否成功。为了避免每次打开终端都要添加一次路径,我们在根目录下按Ctrl+h找到.bashrc文件,打开在最后一行加上source /home/rw/robot/devel/setup.bash,rw为用户名,robot为工作空间名。

在终端输入roslaunch jethexa_description jethexa_rviz_view.launch执行.lanuch文件即可加载机器人模型。

请添加图片描述

机器人模型和训练环境导入gazebo

下载GitHub - SyllogismRXS /gazebo_terrain_tutorial 代码包,将整个包克隆到src文件下。我们将terrain_1.launch打开将husky_description改成我们自己的包名jethexa_description,将husky.urdf.xacro改成我们自己的文件名jethexa.urdf.xacro,返回工作空间,编译,添加环境变量。可以rospack list查看包是否导入成功。打开新的终端输入roslaunch gazebo_terrain_tutorial terrain_1.launch,如下图。

请添加图片描述

当中机器人所处环境为该代码包例子里的模型,我们通过blender来创造我们自己的模型。

通过Ubuntu安装Blender来安装。

进入blender中国社区下载安装Linux版本,解压后双击blender进入界面。

参考使用blender创建仿真模型并导入GazeboBlender雕刻地形教程来建立我们自己的地形图。如下图。

请添加图片描述

我们将该模型导出成**.dae文件**,然后将gazebo_terrain_tutorial包中的models文件夹中的terrain_1.dae替换。我们也可以将Grass.png替换成自己的纹理图片。打开新的终端输入roslaunch gazebo_terrain_tutorial terrain_1.launch,如下图。此时机器人关节不受控制,从在gazebo中控制机器人运动可以解决。

请添加图片描述

但是这里很明显,建成的模型会使机器人凹陷下去。

解决办法:打开/jethexa_description/gazebo下的文件jethexa.gazebo.xacro,发现gazebo_tibia下的物理属性接触参数设置有问题。

元素contact是sdformat中嵌套在“碰撞(collision)”->“表面(surface)”->“接触(contact)”下的一个元素。其参数包括:

  1. soft_cfm参数:即软约束力混合参数,它对使表面变软很有用。

  2. soft_erp参数:即软误差减小参数,它对使表面变软很有用。

  3. kp参数:即接触点的动态“刚度”当量系数。

  4. kd参数:即接触点的动态“阻尼”当量系数。

详细参考Gazebo 11分类教程——物理库Physics Library(八)

由于kp参数设置的太小导致这种情况出现,我们将"gazebo_tibia"下的kp参数改成100,000。

在gazebo中控制机器人运动

打开终端输入sudo apt-get install ros-melodic-ros-control ros-melodic-ros-controllers安装ros_control,ros_control软件包将来自机器人执行器编码器的关节状态数据和输入设定点作为输入。它使用一般的控制回路反馈机制(通常是PID控制器)来控制发送到执行器的输出(通常是工作量)。可参考古月居 ROS入门八详细学习。

新建一个名为jethexa_control的包,将例程中的config文件夹克隆到jethexa_control包下,创建launch文件夹,在launch文件夹下创建control.launch文件,输入以下内容:

<?xml version="1.0"?>

<launch>
  <arg name="gui" default="true"/>
  <arg name="world_name" default="terrain_1"/>

  <!-- Robot pose -->
  <arg name="x" default="0"/>
  <arg name="y" default="0"/>
  <arg name="z" default="5"/>
  <arg name="roll" default="0"/>
  <arg name="pitch" default="0"/>
  <arg name="yaw" default="0"/>

  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find gazebo_terrain_tutorial)/worlds/$(arg world_name).world"/>
    <arg name="gui" value="$(arg gui)"/>
  </include>

  <!-- Convert an xacro to URDF and put on parameter server -->
  <param name="robot_description"
         command="$(find xacro)/xacro.py $(find jethexa_description)/urdf/jethexa.urdf.xacro" />

    <!-- 运行一个 python 脚本来通过 service call 调用 gazebo_ros 以生成一个 URDF机器人 -->
    <node name="urdf_spawner" 
          pkg="gazebo_ros" 
          type="spawn_model" 
          respawn="false" 
          output="screen" 
                  args="-param robot_description -urdf
              -x $(arg x) -y $(arg y) -z $(arg z)
              -R $(arg roll) -P $(arg pitch) -Y $(arg yaw)
              -model jethexa"/>

    <!-- step4: 运行joint_state_publisher节点,发布机器人的关节状态  -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node> 

    <!-- step5: 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"  output="screen" >
        <param name="publish_frequency" type="double" value="50.0" />
    </node>

    <!-- step7-8:运行controller_manager中的spawner,加载并运行controller -->
    <!-- step7: 加载step5中xxx.yaml定义的控制器参数到参数服务器 -->
  <rosparam file="$(find jethexa_control)/config/jethexa_controller.yaml" command="load"/>

  <!-- load the controllers -->
  <node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
	output="screen" ns="/jethexa" args="joint_state_controller
					    coxa_joint_LR_position_controller
                                            coxa_joint_RR_position_controller
                                            coxa_joint_LM_position_controller
                                            coxa_joint_RM_position_controller
                                            coxa_joint_LF_position_controller
                                            coxa_joint_RF_position_controller
                                            femur_joint_LR_position_controller
                                            femur_joint_RR_position_controller
                                            femur_joint_LM_position_controller
                                            femur_joint_RM_position_controller
                                            femur_joint_LF_position_controller
                                            femur_joint_RF_position_controller
                                            tibia_joint_LR_position_controller
                                            tibia_joint_RR_position_controller
                                            tibia_joint_LM_position_controller
                                            tibia_joint_RM_position_controller
                                            tibia_joint_LF_position_controller
                                            tibia_joint_RF_position_controller"/>
</launch>


输入roslaunch jethexa_control control.launch运行上述launch文件。

手动给控制器发布命令,打开另一个终端输入rostopic pub -1 /jethexa/coxa_joint_RR_position_controller/command std_msgs/Float64 "data: 1.0",其中coxa_joint_RR_position_controller为关节名,改变data的值即可使该关节运动。

使用RQT发送命令,输入rosrun rqt_gui rqt_gui,在RQT的菜单栏中“Plugins”中点击"Topics->Message Publisher"插件,然后从Topic的下拉框中选择你想要给控制器发布的话题。具体操作可以参考古月居 ROS入门八

使用python脚本来发送命令,新建一个功能包,该功能包需要依赖rospy、std_msgs和话题定义文件.yaml的功能包jethexa_control。在该包下创建如下内容的python文件,发布某个或多个话题来控制机器人关节运动,这里只控制了一个关节。在control.launch运行的基础上rosrun 运行该程序即可控制。

#! /usr/bin/env python
# coding=utf-8

import rospy
from std_msgs.msg import Float64

def velocity_publisher():

    rospy.init_node('velocity_publisher', anonymous=True)

    pos_pub = rospy.Publisher('/jethexa/coxa_joint_RM_position_controller/command', Float64, queue_size=10)

	#设置循环的频率
    rate = rospy.Rate(10) 

    while not rospy.is_shutdown():
		# 初始化geometry_msgs::Twist类型的消息
        vel_msg = 1.57


		# 发布消息
        pos_pub.publish(vel_msg)

		# 按照循环频率延时
        rate.sleep()

if __name__ == '__main__':
    try:
        velocity_publisher()
    except rospy.ROSInterruptException:
        pass
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值