【笔记】ROSjava-android控制ROS机器人——ROSjava消息发送的解密

通过前面一篇Android上ROS开发——android_core创建一个android应用 应该已经懂了怎么把消息发布给某主题,但是由于发送消息的格式不同,代码有些许改动。虽然通过eclipse可以自己琢磨出如何处理某消息格式下的数据,或者直接google ROS的格式,但是找起来还是有点麻烦,我这还是详细讲解下。

首先是最基本最简单的发送std_msg格式:

package rosjava.wtf.pocketsphinx.version1;

import org.ros.concurrent.CancellableLoop;
import org.ros.namespace.GraphName;
import org.ros.node.AbstractNodeMain;
import org.ros.node.ConnectedNode;
import org.ros.node.topic.Publisher;

public class TalkChnString extends AbstractNodeMain {

	  
  @Override
  public GraphName getDefaultNodeName() {
    return GraphName.of("rosjava_tutorial_pubsub/talkerchnstring");
  }

  @Override
  public void onStart(final ConnectedNode connectedNode) {
    final Publisher<std_msgs.String> publisher =
        connectedNode.newPublisher("chatter", std_msgs.String._TYPE);
    // This CancellableLoop will be canceled automatically when the node shuts
    // down.
    connectedNode.executeCancellableLoop(new CancellableLoop() {
    	
      @Override
      protected void setup() {
      }

      @Override
      public void loop() throws InterruptedException {
          std_msgs.String chnstr = publisher.newMessage();
        chnstr.setData( IsrActivity.tmpchnstring );
        if(PocketSphinxROS.sendchnstring)
        {
        publisher.publish(chnstr);
      PocketSphinxROS.sendchnstring = false;
        }
       Thread.sleep(500);
      }
    });
  }
}
这里可以看出,我们取出IsrAcitivity.tmpchnstring中的字符串,通过PocketSphinxROS.sendchnstring控制单次发布给chatter主题。

package rosjava.wtf.pocketsphinx.version1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.ros.concurrent.CancellableLoop;
import org.ros.namespace.GraphName;
import org.ros.node.AbstractNodeMain;
import org.ros.node.ConnectedNode;
import org.ros.node.topic.Publisher;

import android.R.string;

import sensor_msgs.JointState;

public class TalkServo extends AbstractNodeMain {
	
	public static double[] vel= {0.5,0.5};
	public static double[] pos= {-0.17,0.75};

    String[] s = {"pan","tilz"}; 
    ArrayList<String> list = new ArrayList<String>(Arrays.asList(s));
    
  @Override
  public GraphName getDefaultNodeName() {
    return GraphName.of("rosjava_tutorial_pubsub/talkerserver");
  }

  @Override
  public void onStart(final ConnectedNode connectedNode) {
	  final Publisher<JointState> publisher =
		       connectedNode.newPublisher("joint_states", "sensor_msgs/JointState");
    // This CancellableLoop will be canceled automatically when the node shuts
    // down.
    connectedNode.executeCancellableLoop(new CancellableLoop() {
    	
      @Override
      protected void setup() {
      }

      @Override
      public void loop() throws InterruptedException {
    		JointState joint = (JointState) publisher.newMessage();
        if(PocketSphinxROS.sendservo)
        {
        	joint.setName(list);
        	joint.setVelocity(vel);
        	joint.setPosition(pos);
        	publisher.publish(joint);
        }
       Thread.sleep(100);
      }
    });
  }
}
这篇代码发送控制舵机信息到joint_states主题,重点来说明下舵机信息sensor_msgs/JointState的格式。官方说明该消息的格式是:
Header header

string[] name
float64[] position
float64[] velocity
float64[] effor


name就是舵机名,position就是舵机需要运动到的位置,velocity是舵机运动的速度,本质就是控制运动延迟。3个以数组形式一一对应,比如上面代码所示,舵机pan对应速度0.5,姿态-0.17。这样我们就可以通过处理这3个数据(这里是list,vel,pos)发送控制舵机的命令了。要说明的是这里和PC上ROS C++开发不一样,name需要放到ArrayList<String>中。

package rosjava.wtf.pocketsphinx.version1;

import geometry_msgs.Twist;
import org.ros.concurrent.CancellableLoop;
import org.ros.namespace.GraphName;
import org.ros.node.AbstractNodeMain;
import org.ros.node.ConnectedNode;
import org.ros.node.topic.Publisher;

public class TalkParam extends AbstractNodeMain {

	  public static String tmpstring="WTF";
	  public static float LX,LY,LZ,AX,AY,AZ;
	  
  @Override
  public GraphName getDefaultNodeName() {
    return GraphName.of("rosjava_tutorial_pubsub/talker");
  }

  @Override
  public void onStart(final ConnectedNode connectedNode) {
	  final Publisher<Twist> publisher =
		       connectedNode.newPublisher("cmd_vel", "geometry_msgs/Twist");
    // This CancellableLoop will be canceled automatically when the node shuts
    // down.
    connectedNode.executeCancellableLoop(new CancellableLoop() {
    	
      @Override
      protected void setup() {
      }

      @Override
      public void loop() throws InterruptedException {
    		Twist cmd = publisher.newMessage();
        if(PocketSphinxROS.send)
        {
        cmd.getLinear().setX(LX);
        cmd.getLinear().setY(LY);
        cmd.getLinear().setZ(LZ);
        cmd.getAngular().setX(AX);
        cmd.getAngular().setY(AY);
        cmd.getAngular().setZ(AZ);
        publisher.publish(cmd);
        }
       Thread.sleep(100);
      }
    });
  }
}
这一篇代码讲述控制机器人运动(电机)的消息发布。这里使用geometry_msgs/Twist格式发布到cmd_vel主题。这里消息参数分为6个,线性运动的三个轴数据,角运动的三个轴数据。默认机器人正方向为线性X轴方向,头顶向上为Z轴。官方定义:

Vector3  linear
Vector3  angular

比如前进:

			TalkParam.AX=0;
			TalkParam.AY=0;
			TalkParam.AZ=0;
			TalkParam.LX=0.4f;
			TalkParam.LY=0;
			TalkParam.LZ=0;
后退则给LX负值。

左转:(这里的左转是原地左转,因为你也看到,没有给线速度)这里AZ表示绕Z轴转动。

			TalkParam.AX=0;
			TalkParam.AY=0;
			TalkParam.AZ= 0.6f;
			TalkParam.LX=0;
			TalkParam.LY=0;
			TalkParam.LZ=0;
右转则给负值。具体速度大小相关于机器人电机参数和底层参数,所以具体机器人具体测试。

以上给出的是机器人常用到的几种消息发送格式,你也可以找到官方提供的其他消息格式,当然你也可以自己定义所发送消息的格式。


by:season




  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
搭建自己的机器人模型需要进行以下步骤: 1. 安装ROS和仿真工具包 2. 创建ROS包和机器人模型 3. 编写机器人控制程序 4. 启动仿真环境并加载机器人模型 5. 运行机器人控制程序,观察仿真结果 下面是一个简单的机器人模型搭建示例,使用ROS Kinetic和Gazebo仿真工具包: 1. 安装ROS和仿真工具包 在Ubuntu系统中使用以下命令安装ROS Kinetic和Gazebo仿真工具包: ``` sudo apt-get update sudo apt-get install ros-kinetic-desktop-full sudo apt-get install ros-kinetic-gazebo-ros-pkgs ros-kinetic-gazebo-ros-control ``` 2. 创建ROS包和机器人模型 使用以下命令创建一个名为my_robot的ROS包,并在其中创建一个名为urdf的目录用于存放机器人模型文件: ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_create_pkg my_robot cd my_robot mkdir urdf ``` 在urdf目录中创建一个名为my_robot.urdf的机器人模型文件,内容如下: ```xml <?xml version="1.0"?> <robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro"> <link name="base_link"> <visual> <geometry> <box size="0.3 0.3 0.1"/> </geometry> </visual> </link> <joint name="base_joint" type="fixed"> <parent link="world"/> <child link="base_link"/> <origin xyz="0 0 0.05"/> </joint> <link name="left_wheel_link"> <visual> <geometry> <cylinder length="0.05" radius="0.1"/> </geometry> </visual> </link> <joint name="left_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="left_wheel_link"/> <origin xyz="0.15 0 -0.05"/> <axis xyz="0 1 0"/> </joint> <link name="right_wheel_link"> <visual> <geometry> <cylinder length="0.05" radius="0.1"/> </geometry> </visual> </link> <joint name="right_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="right_wheel_link"/> <origin xyz="0.15 0 0.05"/> <axis xyz="0 1 0"/> </joint> </robot> ``` 这个机器人模型由一个长方体的底座和两个圆柱形的轮子组成,使用URDF格式描述。其中base_link表示机器人的底座,left_wheel_link和right_wheel_link分别表示左右两个轮子。 3. 编写机器人控制程序 在ROS包的src目录中创建一个名为my_robot_control.cpp的控制程序文件,内容如下: ```cpp #include <ros/ros.h> #include <geometry_msgs/Twist.h> int main(int argc, char** argv) { ros::init(argc, argv, "my_robot_control"); ros::NodeHandle nh; ros::Publisher cmd_vel_pub = nh.advertise<geometry_msgs::Twist>("cmd_vel", 10); ros::Rate loop_rate(10); while (ros::ok()) { geometry_msgs::Twist cmd_vel; cmd_vel.linear.x = 0.1; cmd_vel.angular.z = 0.5; cmd_vel_pub.publish(cmd_vel); ros::spinOnce(); loop_rate.sleep(); } return 0; } ``` 这个控制程序使用ROS的Twist消息类型发布机器人的线速度和角速度,以控制机器人的运动。在这个示例中,机器人线速度为0.1,角速度为0.5。 4. 启动仿真环境并加载机器人模型 使用以下命令启动Gazebo仿真环境,并加载机器人模型: ``` roslaunch my_robot my_robot.launch ``` 在my_robot包中创建一个名为my_robot.launch的启动文件,内容如下: ```xml <?xml version="1.0"?> <launch> <arg name="model" default="$(find my_robot)/urdf/my_robot.urdf"/> <param name="robot_description" textfile="$(arg model)" /> <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model my_robot -param robot_description -x 0 -y 0 -z 0"/> <node name="my_robot_control" type="my_robot_control" pkg="my_robot"/> <node name="gazebo_gui" pkg="gazebo" type="gazebo"/> </launch> ``` 这个启动文件首先将机器人模型文件加载到ROS参数服务器中,然后使用gazebo_ros包的spawn_model节点将机器人模型加载到Gazebo仿真环境中。同时运行my_robot_control程序节点控制机器人运动。最后启动Gazebo仿真环境的GUI界面。 5. 运行机器人控制程序,观察仿真结果 使用以下命令运行my_robot_control程序节点,控制机器人运动: ``` rosrun my_robot my_robot_control ``` 可以观察到仿真环境中的机器人开始运动,同时在控制程序的终端输出中可以看到机器人的线速度和角速度。 下图为搭建自己的机器人模型的结果截图: ![ROS机器人仿真结果截图](https://i.imgur.com/lv9v5a1.png)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值