通过ROS控制真实机械臂(6)---自定义RViz插件panel界面设计

1. 自定义消息,用于发布每个关节的状态。

GoalPoint.msg

int8 bus
float32 joint1
float32 joint2
float32 joint3
float32 joint4
float32 joint5
float32 joint6

JointPos.msg

float32 joint1
float32 joint2
float32 joint3
float32 joint4
float32 joint5
float32 joint6

TraPoint.msg

int8 bus
int32 num_of_trapoint
float32[] trapoints

2.便于控制,通过Rviz的panel插件,制作一个控制的GUI界面,先在Qt Creater中完成界面设计, 通过调节Bus Interface的选项,可以选择按钮调节的速度,通过Mode选项,Continuous是即时发送数据,第二个用于购买的工业级机械臂的接口,第三个是最常用的通过Moveit规划的路径控制,通过调节每个Joint的数值为机械臂选取目标点,或者通过下面的五个预定义的位姿按钮,最后点击SendGoal控制机械臂的运动。最后一个是根据机械臂发布的关节状态信息,来改变Rviz和界面中的数据的。

接下来创建ROS包,这是通过Rviz插件的方法在ROS中编写GUI界面 ,最后编译生成的是.SO文件,没有启动的节点,只需要运行Rviz之后,调出panel插件即可。

redwall_arm_panel.h

#ifndef RedWallArm_PANEL_H
#define RedWallArm_PANEL_H

#include  <ros/ros.h>
#include  <rviz/panel.h>
#include  <sensor_msgs/JointState.h>
#include  <std_msgs/Float32MultiArray.h>
#include  <redwall_arm_msgs/GoalPoint.h>
#include  <QWidget>
#include  <QTimer>


namespace Ui {
    class RedWallArmPanel;
}


namespace redwall_arm_panel
{
    class RedWallArmPanel : public rviz::Panel
    {
        Q_OBJECT

    public:
        explicit RedWallArmPanel(QWidget *parent = 0);
        ~RedWallArmPanel();

    public:
        void initROS();

    private Q_SLOTS:
        void on_pbn_joint1Left_pressed();
        void on_pbn_joint1Right_pressed();
        void on_pbn_joint2Left_pressed();
        void on_pbn_joint2Right_pressed();
        void on_pbn_joint3Left_pressed();
        void on_pbn_joint3Right_pressed();
        void on_pbn_joint4Left_pressed();
        void on_pbn_joint4Right_pressed();
        void on_pbn_joint5Left_pressed();
        void on_pbn_joint5Right_pressed();
        void on_pbn_joint6Left_pressed();
        void on_pbn_joint6Right_pressed();

        void on_pbn_zero_clicked();
        void on_pbn_classicPos1_clicked();
        void on_pbn_classicPos2_clicked();
        void on_pbn_classicPos3_clicked();
        void on_pbn_classicPos4_clicked();
        void on_pbn_sendGoal_clicked();

        void on_rbx_pcan_clicked();
        void on_rbx_tcp_clicked();

        void on_rbx_continuous_clicked();
        void on_rbx_goal_clicked();
        void on_rbx_moveit_clicked();
        void on_rbx_sync_clicked();

        void on_pbn_setIO_clicked();

    protected Q_SLOTS:
        void sendCommand();

    protected:
        QTimer* m_timer;

        // The ROS publisher/subscriber
        ros::Publisher cmd1_publisher_;
        ros::Publisher cmd2_publisher_;
        ros::Publisher cmd3_publisher_;
        ros::Publisher goal_publisher_;

        sensor_msgs::JointState jointMsg;
        std_msgs::Float32MultiArray joints;
        redwall_arm_msgs::GoalPoint goalPoint;

        ros::Subscriber subJointState_;
        void jointStateCallback(const sensor_msgs::JointState::ConstPtr& msg);
        int pointCompare(void);

        // The ROS node handle.
        ros::NodeHandle nh_;

        float jointVelocities[6];
        float jointPosition[6];
        float lastJointPosition[6];

    private:
        Ui::RedWallArmPanel *ui;
        float m_step;
        float m_speed;

        //int m_jointStateSync;
        int m_controMode;
        int m_busInterface;
    };
}//end of redwall_arm_rviz_plugin

#endif // RedWallArm_PANEL_H

redwall_arm_panel.cpp

#include "redwall_arm_panel.h"
#include "ui_redwall_arm_panel.h"
#include <math.h>


namespace redwall_arm_panel
{

RedWallArmPanel::RedWallArmPanel(QWidget *parent) :
    rviz::Panel(parent),
    ui(new Ui::RedWallArmPanel),
    m_step(0.16),
    m_speed(50.0),
    m_controMode(3),
    m_busInterface(1)

{
    ui->setupUi(this);

    ui->rbx_pcan->setChecked(false);
    ui->rbx_tcp->setChecked(true);

    ui->rbx_continuous->setChecked(false);
    ui->rbx_goal->setChecked(false);
    ui->rbx_moveit->setChecked(false);
    ui->rbx_sync->setChecked(true);

    ui->pbn_setIO->setEnabled(false);
    ui->pbn_sendGoal->setEnabled(false);

    u
### RViz 的使用方法 RVizROS 提供的一个可视化工具,用于显示机器人传感器数据、路径规划结果以及其他相关信息。以下是关于如何安装、启动以及配置 RViz 的详细介绍。 #### 安装与启动 要运行 RViz,首先需要确保已正确设置 ROS 环境变量并完成必要的初始化操作。可以通过以下命令来启动 RViz: ```bash source /opt/ros/<distro>/setup.bsh ros2 run rviz2 rviz2 ``` 此命令会加载默认配置的 RViz 界面[^1]。如果希望自定义启动参数或者通过 `.launch` 文件启动,则可以在 `launch` 配置文件中指定所需的初始场景和插件选项[^2]。 #### 基本界面介绍 打开 RViz 后,默认窗口分为几个主要部分: - **Displays Panel**: 显示当前激活的数据源列表及其属性设置。 - **Tool Properties**: 当前选中的交互工具的具体参数调整区域。 - **Views Panel**: 存储视图预设以便快速切换视角模式。 - **Status Bar**: 展示错误消息和其他重要提示信息。 用户可以根据需求添加不同的 Display 类型(如 LaserScan, PointCloud2),每种类型都有对应的可调节项以优化渲染效果[^2]。 #### 数据展示功能 利用 RViz 可直观查看多种类型的机器人相关数据流,比如但不限于: - 机械关节角度变化轨迹; - 力矩反馈数值图表表示形式; - SLAM 地图构建过程动态呈现等等。 这些都极大地便利了开发者对于复杂系统的调试工作流程[^2]。 #### 插件扩展能力 除了内置的功能外,RViz 还支持第三方插件开发,允许程序员依据特定项目要求定制专属组件。这使得即使面对非常规的任务场景也能灵活应对。 ```python # 示例 Python 脚本片段演示如何发布 Marker 到 Rviz 中进行标注 import rclpy from visualization_msgs.msg import Marker def main(args=None): rclpy.init(args=args) node = rclpy.create_node('marker_publisher') marker_pub = node.create_publisher(Marker, 'visualization_marker', 10) while rclpy.ok(): msg = Marker() # 设置 Marker 参数... marker_pub.publish(msg) if __name__ == '__main__': main() ``` 以上代码展示了如何创建一个简单的节点向 RViz 发送标记 (Marker),从而实现在三维空间中标记位置等功能。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值